22
33import { useEffect , useState , useCallback } from "react" ;
44
5+ const DISMISSED_KEY = "openproof-install-dismissed" ;
6+ const RE_SHOW_AFTER_DAYS = 7 ;
7+
58interface 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+
1741export 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