useInstall
uses useState
Install the app, where the browser offers it to the page (Chrome's beforeinstallprompt): undefined elsewhere.
import { useEffect, useState } from "react"; export function useInstall(): (() => void) | undefined { const [offer, setOffer] = useState<{ prompt(): Promise<unknown> } | undefined>(undefined); useEffect(() => { const offered = (e: Event) => { e.preventDefault(); setOffer(e as unknown as { prompt(): Promise<unknown> }); }; const installed = () => setOffer(undefined); addEventListener("beforeinstallprompt", offered); addEventListener("appinstalled", installed); return () => { removeEventListener("beforeinstallprompt", offered); removeEventListener("appinstalled", installed); }; }, []); return offer && (() => void offer.prompt().then(() => setOffer(undefined))); }