import axios from 'axios'; export const initSw = async () => { if (!('serviceWorker' in navigator) || !('PushManager' in window)) { console.warn('Push messaging is not supported in this browser.'); return; } try { const registration = await navigator.serviceWorker.register('/service-worker.js'); console.log('Service Worker Registered'); await initPush(); } catch (err) { console.error('Service Worker registration failed:', err); } } /** * Request permission and trigger subscription */ const initPush = async () => { // Request permission const permission = await Notification.requestPermission(); if (permission !== 'granted') { console.warn('Notification permission denied.'); return; } await subscribeUser(); } /** * Subscribe the user to the Push Manager */ const subscribeUser = async () => { const registration = await navigator.serviceWorker.ready; // Check if a subscription already exists let pushSubscription = await registration.pushManager.getSubscription(); if (!pushSubscription) { const subscribeOptions = { userVisibleOnly: true, applicationServerKey: urlBase64ToUint8Array( import.meta.env.VITE_VAPID_PUBLIC_KEY ) }; try { pushSubscription = await registration.pushManager.subscribe(subscribeOptions); console.log('New Subscription created.'); } catch (err) { console.error('Failed to subscribe user:', err); return; } } else { console.log('User is already subscribed.'); } // Send subscription to Laravel backend if (pushSubscription) { console.log('Received PushSubscription:', JSON.stringify(pushSubscription)); await storePushSubscription(pushSubscription); } } export const storePushSubscription = async (pushSubscription) => { try { const response = await axios.post('/api/push', pushSubscription); console.log('Successfully stored subscription:', response.data); } catch (err) { console.error('Error storing subscription on server:', err); } } /** * Helper to convert VAPID key */ function urlBase64ToUint8Array(base64String) { if (!base64String) { console.error('VITE_VAPID_PUBLIC_KEY is missing from .env'); return new Uint8Array(); } const padding = '='.repeat((4 - base64String.length % 4) % 4); const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/'); const rawData = window.atob(base64); return Uint8Array.from([...rawData].map((char) => char.charCodeAt(0))); }