"use client"; import { useCallback, useEffect, useRef, useState } from "react"; const DISMISS_KEY = "capakraken_pwa_dismiss"; const DISMISS_DURATION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days interface BeforeInstallPromptEvent extends Event { prompt(): Promise; userChoice: Promise<{ outcome: "accepted" | "dismissed" }>; } export function InstallPrompt() { const [visible, setVisible] = useState(false); const deferredPromptRef = useRef(null); useEffect(() => { // Check if dismissed recently try { const dismissed = localStorage.getItem(DISMISS_KEY); if (dismissed) { const timestamp = parseInt(dismissed, 10); if (Date.now() - timestamp < DISMISS_DURATION_MS) return; } } catch { // localStorage unavailable } // Check if already installed (standalone mode) if (window.matchMedia("(display-mode: standalone)").matches) return; const handler = (e: Event) => { e.preventDefault(); deferredPromptRef.current = e as BeforeInstallPromptEvent; setVisible(true); }; window.addEventListener("beforeinstallprompt", handler); return () => window.removeEventListener("beforeinstallprompt", handler); }, []); const handleInstall = useCallback(async () => { const prompt = deferredPromptRef.current; if (!prompt) return; await prompt.prompt(); const { outcome } = await prompt.userChoice; if (outcome === "accepted") { setVisible(false); } deferredPromptRef.current = null; }, []); const handleDismiss = useCallback(() => { setVisible(false); deferredPromptRef.current = null; try { localStorage.setItem(DISMISS_KEY, String(Date.now())); } catch { // ignore } }, []); if (!visible) return null; return (

Install CapaKraken

Add to home screen for quick access

); }