From 4c8a482855affee2e04b3839fc4314a970ee4d8f Mon Sep 17 00:00:00 2001 From: Kevin Cantrell Date: Sun, 24 Aug 2025 20:01:45 +0900 Subject: [PATCH] updated --- .../app/account-settings/+layout.svelte | 109 +++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/src/routes/app/account-settings/+layout.svelte b/src/routes/app/account-settings/+layout.svelte index 829f91b0..26bb2d14 100644 --- a/src/routes/app/account-settings/+layout.svelte +++ b/src/routes/app/account-settings/+layout.svelte @@ -4,6 +4,7 @@ import type { LayoutData } from './$types'; import { _ } from 'svelte-i18n'; import Header from '$lib/components/Header.svelte'; + import { onMount } from 'svelte'; let { data, children }: { data: LayoutData; children: Snippet } = $props(); let basePath = `/app/account-settings`; @@ -17,9 +18,65 @@ hidden: false } ]; + + // --- OneSignal Web Push permission handling --- + let pushPermission = $state(null); // 'default' | 'granted' | 'denied' + let subscriptionState = $state(null); // OneSignal specific states + let isRequesting = $state(false); + let oneSignalReady = $state(false); + + function refreshStatus() { + // Browser permission + pushPermission = typeof Notification !== 'undefined' ? Notification.permission : null; + } + + async function requestPushPermission() { + if (isRequesting) return; + isRequesting = true; + refreshStatus(); + // Use OneSignal Deferred queue per 2025 SDK pattern + try { + (window as any).OneSignalDeferred = (window as any).OneSignalDeferred || []; + (window as any).OneSignalDeferred.push(async function (OneSignal: any) { + try { + await OneSignal.Notifications.requestPermission(); + } catch (e) { + console.error('OneSignal permission request failed', e); + } finally { + refreshStatus(); + isRequesting = false; + } + }); + } catch (e) { + console.error(e); + isRequesting = false; + } + } + + onMount(() => { + refreshStatus(); + if (typeof window === 'undefined') return; + (window as any).OneSignalDeferred = (window as any).OneSignalDeferred || []; + (window as any).OneSignalDeferred.push(async function (OneSignal: any) { + oneSignalReady = true; + refreshStatus(); + // Attempt to derive subscription state if API available + try { + if (OneSignal?.User?.PushSubscription) { + const status = await OneSignal.User.PushSubscription.getSubscriptionStatus?.(); + if (status) subscriptionState = JSON.stringify(status); + } + OneSignal.Notifications.addPermissionObserver?.(function (ev: any) { + refreshStatus(); + }); + } catch (e) { + console.warn('Could not read OneSignal subscription state', e); + } + }); + }); -
+
{@render children()} + + +
+

{$_('Push Notifications')}

+

+ {#if pushPermission === 'granted'} + {$_('You have already enabled push notifications.')} + {:else if pushPermission === 'denied'} + {$_( + 'You have blocked notifications in your browser settings. Please allow them in the browser site settings to enable.' + )} + {:else} + {$_( + 'Enable push notifications to receive real-time alerts. You will see a browser prompt after clicking the button below.' + )} + {/if} +

+
+ + + {$_('Browser Permission:')} + {pushPermission || 'n/a'} | {$_('SDK Loaded:')} + {oneSignalReady ? 'yes' : 'no'} + +
+ {#if subscriptionState} +
+ {$_('Subscription State (debug)')} +
{subscriptionState}
+
+ {/if} +
    +
  • + {$_('No prompt? You may have previously denied it; check site settings in your browser.')} +
  • +
  • {$_('Ensure the site is served over HTTPS (required for web push).')}
  • +
  • {$_('iOS Safari requires Add to Home Screen before prompting (iOS 16.4+).')}
  • +
  • {$_('Incognito/private browsing cannot subscribe to push.')}
  • +
+