function checkServiceWorkerSupport() { if (!("serviceWorker" in navigator) || !("PushManager" in window)) throw new Error("Your browser does not have Service Worker support") } async function isPushRegistered() { checkServiceWorkerSupport(); try { const registrations = await navigator.serviceWorker.getRegistrations(); if (!registrations || registrations.length === 0) return false; for (let reg of registrations) { const subscription = await reg.pushManager.getSubscription(); if (subscription) return true; } return false; } catch (error) { return false; } } async function unregisterPush() { checkServiceWorkerSupport(); try { const registrations = await navigator.serviceWorker.getRegistrations(); if (!registrations || registrations.length === 0) return; for (let i = 0; i < registrations.length; i++) { const reg = registrations[i]; const sub = await reg.pushManager.getSubscription(); if (sub) await sub.unsubscribe(); await reg.unregister(); } } catch (err) { console.error("Failed to unregister push:", err); } } async function registerPush(publicKey) { checkServiceWorkerSupport(); const permission = await Notification.requestPermission(); if (permission !== "granted") { throw new Error("Notification permission not granted"); } const registration = await navigator.serviceWorker.register("/assets/custom/serviceWorker.js"); console.log("Service Worker registered"); let subscription = await registration.pushManager.getSubscription(); if (!subscription) { const applicationServerKey = urlBase64ToUint8Array(publicKey); subscription = await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey }); console.log("Push subscription obtained"); } const response = await fetch(`${window.GLOBAL_ENV.API_ENDPOINT}/v9/users/@me/devices`, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": window.AUTH_TOKEN }, body: JSON.stringify({ provider: "webpush", webpush_subscription: subscription }) }); if (response.ok) { console.log("Device registered successfully"); } else { const text = await response.text(); throw new Error("Failed to register: ", text) } }