"use client"; import { useEffect, useState } from "react"; import { X, Download } from "lucide-react"; import { Button } from "@/components/ui/button"; const DISMISSED_KEY = "epicure:install-prompt-dismissed"; type BeforeInstallPromptEvent = Event & { prompt: () => Promise; userChoice: Promise<{ outcome: "accepted" | "dismissed" }>; }; /** Only fires on Chromium-based browsers (Chrome/Edge/Android) — Safari and * Firefox never dispatch beforeinstallprompt, so this banner simply never * appears there, which is the correct behavior (no fallback UI to build). */ export function InstallPrompt() { const [deferredEvent, setDeferredEvent] = useState(null); const [dismissed, setDismissed] = useState(() => typeof localStorage !== "undefined" && localStorage.getItem(DISMISSED_KEY) === "true"); useEffect(() => { function handler(e: Event) { e.preventDefault(); setDeferredEvent(e as BeforeInstallPromptEvent); } window.addEventListener("beforeinstallprompt", handler); return () => window.removeEventListener("beforeinstallprompt", handler); }, []); function dismiss() { localStorage.setItem(DISMISSED_KEY, "true"); setDismissed(true); } async function install() { if (!deferredEvent) return; await deferredEvent.prompt(); await deferredEvent.userChoice; setDeferredEvent(null); } if (!deferredEvent || dismissed) return null; return (

Install Epicure

Add to your home screen for quick access.

); }