Skip to content

Commit ee65b71

Browse files
authored
fix PWA install prompt: remember 'Not now' dismissal, suppress Chrome warning
fix PWA install prompt: remember 'Not now' dismissal, suppress Chrome warning
2 parents 6932c9c + 815a6d9 commit ee65b71

1 file changed

Lines changed: 29 additions & 0 deletions

File tree

src/components/pwa-install-prompt.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import { useEffect, useState, useCallback } from "react";
44

5+
const DISMISSED_KEY = "openproof-install-dismissed";
6+
const RE_SHOW_AFTER_DAYS = 7;
7+
58
interface BeforeInstallPromptEvent extends Event {
69
readonly platforms: string[];
710
readonly userChoice: Promise<{ outcome: "accepted" | "dismissed"; platform: string }>;
@@ -14,14 +17,39 @@ declare global {
1417
}
1518
}
1619

20+
function isDismissedRecently(): boolean {
21+
if (typeof window === "undefined") return false;
22+
try {
23+
const stored = localStorage.getItem(DISMISSED_KEY);
24+
if (!stored) return false;
25+
const dismissedAt = parseInt(stored, 10);
26+
if (isNaN(dismissedAt)) return false;
27+
return Date.now() - dismissedAt < RE_SHOW_AFTER_DAYS * 24 * 60 * 60 * 1000;
28+
} catch {
29+
return false;
30+
}
31+
}
32+
33+
function markDismissed() {
34+
try {
35+
localStorage.setItem(DISMISSED_KEY, String(Date.now()));
36+
} catch {
37+
// localStorage unavailable
38+
}
39+
}
40+
1741
export function PwaInstallPrompt() {
1842
const [deferredPrompt, setDeferredPrompt] = useState<BeforeInstallPromptEvent | null>(null);
1943
const [showPrompt, setShowPrompt] = useState(false);
2044
const [updateAvailable, setUpdateAvailable] = useState(false);
2145

2246
// Listen for beforeinstallprompt
2347
useEffect(() => {
48+
// If user dismissed recently, don't intercept — let Chrome handle it
49+
if (isDismissedRecently()) return;
50+
2451
const handler = (e: BeforeInstallPromptEvent) => {
52+
// Only preventDefault if we intend to show our own prompt
2553
e.preventDefault();
2654
setDeferredPrompt(e);
2755
// Show prompt after a short delay — don't interrupt initial load
@@ -88,6 +116,7 @@ export function PwaInstallPrompt() {
88116
const handleDismiss = useCallback(() => {
89117
setShowPrompt(false);
90118
setDeferredPrompt(null);
119+
markDismissed();
91120
}, []);
92121

93122
const handleUpdate = useCallback(() => {

0 commit comments

Comments
 (0)