feat: add don't remind me again option to install prompt for PWA

This commit is contained in:
Linus Rath
2026-04-10 14:20:48 +02:00
parent 734155c939
commit 89d580b90d
+27 -10
View File
@@ -8,12 +8,16 @@ interface BeforeInstallPromptEvent extends Event {
userChoice: Promise<{ outcome: "accepted" | "dismissed" }>; userChoice: Promise<{ outcome: "accepted" | "dismissed" }>;
} }
const DISMISSED_KEY = "pwa-install-dismissed";
export function PWAInstallPrompt() { export function PWAInstallPrompt() {
const [deferredPrompt, setDeferredPrompt] = const [deferredPrompt, setDeferredPrompt] =
useState<BeforeInstallPromptEvent | null>(null); useState<BeforeInstallPromptEvent | null>(null);
const [showPrompt, setShowPrompt] = useState(false); const [showPrompt, setShowPrompt] = useState(false);
useEffect(() => { useEffect(() => {
if (localStorage.getItem(DISMISSED_KEY)) return;
const handler = (e: Event) => { const handler = (e: Event) => {
e.preventDefault(); e.preventDefault();
setDeferredPrompt(e as BeforeInstallPromptEvent); setDeferredPrompt(e as BeforeInstallPromptEvent);
@@ -43,6 +47,11 @@ export function PWAInstallPrompt() {
setShowPrompt(false); setShowPrompt(false);
}; };
const handleDismissForever = () => {
localStorage.setItem(DISMISSED_KEY, "1");
setShowPrompt(false);
};
if (!showPrompt || !deferredPrompt) { if (!showPrompt || !deferredPrompt) {
return null; return null;
} }
@@ -69,18 +78,26 @@ export function PWAInstallPrompt() {
<X className="w-4 h-4" /> <X className="w-4 h-4" />
</button> </button>
</div> </div>
<div className="flex gap-2"> <div className="flex flex-col gap-2">
<div className="flex gap-2">
<button
onClick={handleDismiss}
className="flex-1 px-3 py-2 text-sm font-medium text-neutral-700 dark:text-neutral-300 bg-neutral-100 dark:bg-neutral-800 rounded hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors"
>
Not now
</button>
<button
onClick={handleInstall}
className="flex-1 px-3 py-2 text-sm font-medium text-white bg-blue-600 rounded hover:bg-blue-700 transition-colors"
>
Install
</button>
</div>
<button <button
onClick={handleDismiss} onClick={handleDismissForever}
className="flex-1 px-3 py-2 text-sm font-medium text-neutral-700 dark:text-neutral-300 bg-neutral-100 dark:bg-neutral-800 rounded hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors" className="w-full text-xs text-neutral-400 hover:text-neutral-600 dark:hover:text-neutral-300 transition-colors text-center"
> >
Not now Don&apos;t remind me again
</button>
<button
onClick={handleInstall}
className="flex-1 px-3 py-2 text-sm font-medium text-white bg-blue-600 rounded hover:bg-blue-700 transition-colors"
>
Install
</button> </button>
</div> </div>
</div> </div>