"use client"; import { useEffect, useState } from "react"; import { pwaUtil } from "@/utils/pwa"; type PwaInstallResult = Awaited>; export function usePwaInstallEntry() { const [canInstall, setCanInstall] = useState(false); useEffect(() => { const updateInstallEntryVisibility = () => { setCanInstall(pwaUtil.canShowInstallEntry()); }; pwaUtil.prepareInstallPrompt(); updateInstallEntryVisibility(); const unsubscribe = pwaUtil.subscribe(updateInstallEntryVisibility); return () => { unsubscribe(); }; }, []); const installApp = async () => { pwaUtil.prepareInstallPrompt(); const result = await pwaUtil.install(); setCanInstall( shouldKeepPwaInstallEntryVisible({ result, isInstalled: pwaUtil.isInstalled(), canShowInstallEntry: pwaUtil.canShowInstallEntry(), }), ); }; return { canInstall, installApp, }; } export function shouldKeepPwaInstallEntryVisible({ result, isInstalled, canShowInstallEntry, }: { result: PwaInstallResult; isInstalled: boolean; canShowInstallEntry: boolean; }): boolean { return result !== "accepted" && !isInstalled && canShowInstallEntry; }