From 81c4da5135eacf9d7a13262eeaf5b49c4bb2257b Mon Sep 17 00:00:00 2001 From: Fuwn Date: Tue, 28 Jan 2025 20:13:31 -0800 Subject: fix(notifications): better permission request flow --- src/lib/Utility/notifications.ts | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) (limited to 'src/lib/Utility') diff --git a/src/lib/Utility/notifications.ts b/src/lib/Utility/notifications.ts index 95cb51c1..e80563ec 100644 --- a/src/lib/Utility/notifications.ts +++ b/src/lib/Utility/notifications.ts @@ -4,21 +4,27 @@ import root from './root'; export const requestNotifications = async () => { if ('Notification' in window && navigator.serviceWorker) { - if ((await Notification.requestPermission()) === 'granted') { - const pushSubscription = await ( - await navigator.serviceWorker.ready - ).pushManager.subscribe({ - userVisibleOnly: true, - applicationServerKey: env.PUBLIC_VAPID_PUBLIC_KEY - }); + const registration = await navigator.serviceWorker.getRegistration(); - await fetch(root(`/api/notifications/subscribe?p=${getFingerprint()}`), { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(pushSubscription) - }); + if (registration) { + try { + const pushSubscription = await registration.pushManager.subscribe({ + userVisibleOnly: true, + applicationServerKey: env.PUBLIC_VAPID_PUBLIC_KEY + }); + + await fetch(root(`/api/notifications/subscribe?p=${getFingerprint()}`), { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(pushSubscription) + }); + } catch { + await fetch(`/api/notifications/unsubscribe?p=${getFingerprint()}`, { + method: 'POST' + }); + } } } }; -- cgit v1.2.3