From deba11267523c29237bca31d1deb5a0e6b659810 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 6 Mar 2026 22:47:13 -0800 Subject: fix push notification registration and server-side MLS user index - Fix push toggle: use $effect instead of run() to avoid silent failures - Add error handling and console logging for push init/toggle - Hide push section when service worker unavailable (dev mode) - Simplify MLS user search to fetch from server API and cache in IndexedDB Co-Authored-By: Claude Opus 4.6 --- src/routes/(app)/settings/account/+page.svelte | 78 +++++++++++++++++--------- 1 file changed, 51 insertions(+), 27 deletions(-) diff --git a/src/routes/(app)/settings/account/+page.svelte b/src/routes/(app)/settings/account/+page.svelte index 115f46c5..dd602c1a 100644 --- a/src/routes/(app)/settings/account/+page.svelte +++ b/src/routes/(app)/settings/account/+page.svelte @@ -26,46 +26,68 @@ pm: any, subscription: any; + let permission = $state(); + let pmReady = $state(false); + onMount(async () => { if (!browser) return; - pm = navigator?.serviceWorker && (await navigator.serviceWorker.getRegistration())?.pushManager; - - permission = await pm.permissionState({ - userVisibleOnly: true, - applicationServerKey: PUBLIC_VAPID_PUBKEY, - }); - - if (permission === "granted") { - subscription = await pm.getSubscription(); - if (subscriptions.includes(JSON.stringify(subscription))) push = true; - } - }); - - let permission = $state(); - let updateNotifications = async (push) => { - if (!browser || !pm) return (push = false); - - if (subscription && !push) { - return post("/subscription/delete", { subscription }); - } + try { + pm = navigator?.serviceWorker && (await navigator.serviceWorker.getRegistration())?.pushManager; + if (!pm) { pmReady = true; return; } - if (push && permission !== "denied") { - subscription = await pm.subscribe({ + permission = await pm.permissionState({ userVisibleOnly: true, applicationServerKey: PUBLIC_VAPID_PUBKEY, }); + + if (permission === "granted") { + subscription = await pm.getSubscription(); + if (subscriptions.includes(JSON.stringify(subscription))) push = true; + } + } catch (e) { + console.error("push init failed", e); } - if (subscription) { - await post("/subscription", { subscription }); + pmReady = true; + }); + + const togglePush = async (on: boolean) => { + if (!pm) return; + try { + if (subscription && !on) { + await post("/subscription/delete", { subscription }); + return; + } + + if (on && permission !== "denied") { + subscription = await pm.subscribe({ + userVisibleOnly: true, + applicationServerKey: PUBLIC_VAPID_PUBKEY, + }); + } + + if (subscription) { + await post("/subscription", { subscription }); + } + } catch (e) { + console.error("push toggle failed", e); + push = false; } }; - run(() => { - user.language = $locale; + + let pushInitialized = false; + $effect(() => { + // Track push so this effect re-runs when it changes + const val = push; + if (!pmReady) return; + // Skip the first run after pmReady (initial state from onMount) + if (!pushInitialized) { pushInitialized = true; return; } + togglePush(val); }); + run(() => { - updateNotifications(push); + user.language = $locale; }); $effect(() => { @@ -111,6 +133,7 @@

{$t("user.settings.notificationsDesc")}

+{#if pm}
{$t("user.settings.pushNotifications")} @@ -126,6 +149,7 @@ {/if}

+{/if}
-- cgit v1.2.3