const CACHE_NAME = 'synculous-v1'; self.addEventListener('install', (event) => { self.skipWaiting(); }); self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((names) => Promise.all(names.filter((n) => n !== CACHE_NAME).map((n) => caches.delete(n))) ) ); self.clients.claim(); }); self.addEventListener('fetch', (event) => { if (event.request.method !== 'GET') return; const url = new URL(event.request.url); if (url.pathname.startsWith('/api/')) return; event.respondWith( fetch(event.request) .then((response) => { const clone = response.clone(); caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone)); return response; }) .catch(() => caches.match(event.request)) ); }); // ── Web Push Notifications ────────────────────────────────── self.addEventListener('push', (event) => { let data = { title: 'Synculous', body: 'You have a notification' }; if (event.data) { try { data = event.data.json(); } catch { data.body = event.data.text(); } } event.waitUntil( self.registration.showNotification(data.title || 'Synculous', { body: data.body, icon: '/icon-192.png', badge: '/icon-192.png', data: { url: '/dashboard/medications' }, actions: [ { action: 'open', title: 'Open' }, { action: 'dismiss', title: 'Dismiss' }, ], }) ); }); self.addEventListener('notificationclick', (event) => { event.notification.close(); if (event.action === 'dismiss') return; const url = event.notification.data?.url || '/dashboard/medications'; event.waitUntil( self.clients.matchAll({ type: 'window', includeUncontrolled: true }).then((clients) => { for (const client of clients) { if (client.url.includes('/dashboard') && 'focus' in client) { return client.focus(); } } return self.clients.openWindow(url); }) ); });