'use client'; import { useEffect, useState, useCallback } from 'react'; interface BeforeInstallPromptEvent extends Event { prompt(): Promise; userChoice: Promise<{ outcome: 'accepted' | 'dismissed' }>; } export function PWAInstall() { const [deferredPrompt, setDeferredPrompt] = useState(null); const [showBanner, setShowBanner] = useState(false); const [isIOS, setIsIOS] = useState(false); const [showInstructions, setShowInstructions] = useState(false); useEffect(() => { // Register service worker if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js').catch(console.error); } // Check if already installed const isStandalone = window.matchMedia('(display-mode: standalone)').matches || (navigator as unknown as { standalone?: boolean }).standalone === true; if (isStandalone) return; // Detect iOS const ios = /iPad|iPhone|iPod/.test(navigator.userAgent); setIsIOS(ios); // Check dismiss cooldown (24h) const dismissedAt = localStorage.getItem('pwa_dismissed'); if (dismissedAt && Date.now() - parseInt(dismissedAt) < 86400000) return; setShowBanner(true); // Capture the install prompt const handler = (e: Event) => { e.preventDefault(); setDeferredPrompt(e as BeforeInstallPromptEvent); }; window.addEventListener('beforeinstallprompt', handler); window.addEventListener('appinstalled', () => { setShowBanner(false); setDeferredPrompt(null); }); return () => window.removeEventListener('beforeinstallprompt', handler); }, []); const handleInstall = useCallback(async () => { if (deferredPrompt) { deferredPrompt.prompt(); const { outcome } = await deferredPrompt.userChoice; if (outcome === 'accepted') { setShowBanner(false); } setDeferredPrompt(null); } else { // No native prompt available — show manual instructions setShowInstructions(true); } }, [deferredPrompt]); const handleDismiss = useCallback(() => { setShowBanner(false); localStorage.setItem('pwa_dismissed', Date.now().toString()); }, []); if (!showBanner) return null; return (
📲
{showInstructions ? ( isIOS ? (

Add to Home Screen

Tap{' '} ⎋ Share {' '} then{' '} Add to Home Screen

) : (

Install rNotes

1. Tap{' '} {' '} (three dots) at top-right
2. Tap{' '} Add to Home screen
3. Tap{' '} Install

) ) : (

Install rNotes

Add to your home screen for quick access

)}
{!showInstructions && ( )}
); }