| import { useEffect, useState } from 'react' | |
| import { Download } from 'lucide-react' | |
| /** | |
| * Renders an "Install App" button when the browser fires the | |
| * beforeinstallprompt event (Chrome / Android). On iOS Safari the event | |
| * is never fired, so the button stays hidden. | |
| */ | |
| export default function InstallPrompt() { | |
| const [deferredPrompt, setDeferredPrompt] = useState(null) | |
| const [installed, setInstalled] = useState(false) | |
| useEffect(() => { | |
| const handler = (e) => { | |
| e.preventDefault() | |
| setDeferredPrompt(e) | |
| } | |
| window.addEventListener('beforeinstallprompt', handler) | |
| window.addEventListener('appinstalled', () => { | |
| setInstalled(true) | |
| setDeferredPrompt(null) | |
| }) | |
| return () => window.removeEventListener('beforeinstallprompt', handler) | |
| }, []) | |
| if (!deferredPrompt || installed) return null | |
| const handleInstall = async () => { | |
| deferredPrompt.prompt() | |
| const { outcome } = await deferredPrompt.userChoice | |
| if (outcome === 'accepted') setInstalled(true) | |
| setDeferredPrompt(null) | |
| } | |
| return ( | |
| <button | |
| onClick={handleInstall} | |
| className="flex items-center gap-2 rounded-lg border border-slate-600 bg-slate-800 px-3 py-1.5 text-sm font-medium text-slate-200 hover:bg-slate-700 transition-colors" | |
| > | |
| <Download size={15} /> | |
| Install App | |
| </button> | |
| ) | |
| } | |