useInstall

reminders.useInstall · #teykbvgn · term · runs in the browser

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)));
}

used by