From 7729068219ec4b03978c36e595b42dff9793a9ec Mon Sep 17 00:00:00 2001 From: gunshiz Date: Mon, 5 Oct 2026 21:17:40 +0700 Subject: [PATCH] feat : add dont ask me again for install web app --- components/site-entry-prompt.tsx | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/components/site-entry-prompt.tsx b/components/site-entry-prompt.tsx index 777f429..fe62656 100644 --- a/components/site-entry-prompt.tsx +++ b/components/site-entry-prompt.tsx @@ -6,10 +6,18 @@ import { usePathname } from "next/navigation"; import { syncCommissionPush } from "@/components/commission/push-client"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; +import { Field, FieldLabel } from "@/components/ui/field"; +import { Switch } from "@/components/ui/switch"; type InstallEvent = Event & { prompt: () => Promise; userChoice: Promise<{ outcome: string }> }; const dismissedKey = "site-entry-prompt-dismissed"; +const dontAskAgainKey = "site-entry-prompt-dont-ask-again"; + +function isPromptDismissed() { + return sessionStorage.getItem(dismissedKey) === "1" || + localStorage.getItem(dontAskAgainKey) === "1"; +} function isInstalled() { return window.matchMedia("(display-mode: standalone)").matches || @@ -24,6 +32,7 @@ export function SiteEntryPrompt() { const [permission, setPermission] = useState(null); const [busy, setBusy] = useState(false); const [error, setError] = useState(""); + const [dontAskAgain, setDontAskAgain] = useState(false); useEffect(() => { // Commission pages have their own prompt, tied to the signed-in user's messages. @@ -41,7 +50,7 @@ export function SiteEntryPrompt() { const frame = requestAnimationFrame(() => { setInstalled(installedNow); setPermission(canNotify ? Notification.permission : null); - if (!sessionStorage.getItem(dismissedKey) && + if (!isPromptDismissed() && ((ios && !installedNow) || (canNotify && Notification.permission === "default"))) { setOpen(true); } @@ -50,7 +59,7 @@ export function SiteEntryPrompt() { const beforeInstall = (event: Event) => { event.preventDefault(); setInstallEvent(event as InstallEvent); - if (!sessionStorage.getItem(dismissedKey)) setOpen(true); + if (!isPromptDismissed()) setOpen(true); }; const onInstalled = () => { setInstalled(true); @@ -71,6 +80,12 @@ export function SiteEntryPrompt() { setOpen(false); } + function toggleDontAskAgain(checked: boolean) { + setDontAskAgain(checked); + if (checked) localStorage.setItem(dontAskAgainKey, "1"); + else localStorage.removeItem(dontAskAgainKey); + } + async function install() { if (!installEvent) return; await installEvent.prompt(); @@ -127,6 +142,10 @@ export function SiteEntryPrompt() { ติดตั้งและเปิดจากหน้าจอโฮมก่อน จึงจะเปิดการแจ้งเตือนได้บน iPhone/iPad

} {error &&

{error}

} + + ไม่ต้องถามอีก + + {installEvent && !installed && }