From 815a6d92dd1ecd21e00c007a1ee27ca65ec0ce1e Mon Sep 17 00:00:00 2001 From: Sparsh Sam <110058692+sparshsam@users.noreply.github.com> Date: Sun, 28 Jun 2026 01:29:48 -0400 Subject: [PATCH] fix PWA install prompt: remember dismissal, suppress console warning --- src/components/pwa-install-prompt.tsx | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/components/pwa-install-prompt.tsx b/src/components/pwa-install-prompt.tsx index eaeed58..1f21052 100644 --- a/src/components/pwa-install-prompt.tsx +++ b/src/components/pwa-install-prompt.tsx @@ -2,6 +2,9 @@ import { useEffect, useState, useCallback } from "react"; +const DISMISSED_KEY = "openproof-install-dismissed"; +const RE_SHOW_AFTER_DAYS = 7; + interface BeforeInstallPromptEvent extends Event { readonly platforms: string[]; readonly userChoice: Promise<{ outcome: "accepted" | "dismissed"; platform: string }>; @@ -14,6 +17,27 @@ declare global { } } +function isDismissedRecently(): boolean { + if (typeof window === "undefined") return false; + try { + const stored = localStorage.getItem(DISMISSED_KEY); + if (!stored) return false; + const dismissedAt = parseInt(stored, 10); + if (isNaN(dismissedAt)) return false; + return Date.now() - dismissedAt < RE_SHOW_AFTER_DAYS * 24 * 60 * 60 * 1000; + } catch { + return false; + } +} + +function markDismissed() { + try { + localStorage.setItem(DISMISSED_KEY, String(Date.now())); + } catch { + // localStorage unavailable + } +} + export function PwaInstallPrompt() { const [deferredPrompt, setDeferredPrompt] = useState(null); const [showPrompt, setShowPrompt] = useState(false); @@ -21,7 +45,11 @@ export function PwaInstallPrompt() { // Listen for beforeinstallprompt useEffect(() => { + // If user dismissed recently, don't intercept — let Chrome handle it + if (isDismissedRecently()) return; + const handler = (e: BeforeInstallPromptEvent) => { + // Only preventDefault if we intend to show our own prompt e.preventDefault(); setDeferredPrompt(e); // Show prompt after a short delay — don't interrupt initial load @@ -88,6 +116,7 @@ export function PwaInstallPrompt() { const handleDismiss = useCallback(() => { setShowPrompt(false); setDeferredPrompt(null); + markDismissed(); }, []); const handleUpdate = useCallback(() => {