/* * TaskStream's service worker: push notifications only. It caches nothing, * so a new deploy never leaves an old version of the app behind. * * The API sends `{ title, body, url, tag }` (see Notifier's payloadOf). */ self.addEventListener('install', () => self.skipWaiting()); self.addEventListener('activate', (event) => event.waitUntil(self.clients.claim()), ); self.addEventListener('push', (event) => { let data = {}; try { data = event.data ? event.data.json() : {}; } catch { data = { body: event.data ? event.data.text() : '' }; } event.waitUntil( self.registration.showNotification(data.title || 'TaskStream', { body: data.body || '', tag: data.tag, icon: '/logo-192.png', badge: '/logo-96.png', data: { url: data.url || '/' }, }), ); }); // A tap opens the ticket: in a TaskStream tab already open, or in a new one. self.addEventListener('notificationclick', (event) => { event.notification.close(); const target = new URL( event.notification.data?.url || '/', self.location.origin, ).href; event.waitUntil( self.clients .matchAll({ type: 'window', includeUncontrolled: true }) .then((tabs) => { for (const tab of tabs) { if ( new URL(tab.url).origin === self.location.origin && 'focus' in tab ) { return tab.focus().then(() => tab.navigate(target)); } } return self.clients.openWindow(target); }), ); });