// Norda Biznes Partner — Service Worker with Web Push + iOS pending-url self.addEventListener('install', function() { self.skipWaiting(); }); self.addEventListener('activate', function(event) { event.waitUntil(self.clients.claim()); }); self.addEventListener('fetch', function(event) { event.respondWith(fetch(event.request)); }); self.addEventListener('push', function(event) { let payload = { title: 'Norda Biznes', body: '', url: '/', icon: '/static/img/favicon-192.png', badge: '/static/img/favicon-192.png', }; try { if (event.data) payload = Object.assign(payload, event.data.json()); } catch (e) { if (event.data) payload.body = event.data.text(); } const options = { body: payload.body, icon: payload.icon, badge: payload.badge || '/static/img/favicon-192.png', data: { url: payload.url }, tag: payload.tag || undefined, renotify: !!payload.tag, }; event.waitUntil(self.registration.showNotification(payload.title, options)); }); self.addEventListener('notificationclick', function(event) { event.notification.close(); const targetUrl = (event.notification.data && event.notification.data.url) || '/'; event.waitUntil((async function() { const clientList = await self.clients.matchAll({ type: 'window', includeUncontrolled: true }); for (const client of clientList) { if (client.url.indexOf(targetUrl) !== -1 && 'focus' in client) { return client.focus(); } } // iOS PWA fallback — gdy app zamknięta, zapisz pending URL w Redis // żeby PWA po starcie mogła pod niego przeskoczyć. try { await fetch('/push/pending-url', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url: targetUrl }), credentials: 'include', }); } catch (e) { /* ignore */ } if (self.clients.openWindow) { return self.clients.openWindow(targetUrl); } })()); });