omnidiag / frontend /src /components /InstallPrompt.jsx
yahyoha's picture
feat(pwa): add InstallPrompt component for PWA install button
58f436b
Raw
History Blame Contribute Delete
1.35 kB
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>
)
}