// BizGaze Connect service worker — NOTIFICATIONS ONLY. // Intentionally has NO 'fetch' handler and NO caching, so it can never serve a stale // version of the app. Its only job is to show push notifications when the page is in // the background / frozen / closed, and to open the right chat when one is clicked. self.addEventListener('install', (e) => { self.skipWaiting(); }); self.addEventListener('activate', (e) => { e.waitUntil(self.clients.claim()); }); // No-op fetch handler: present only so the app meets PWA installability criteria. It never // calls respondWith(), so the browser performs its normal network fetch — NO caching, so this // can never serve a stale app. self.addEventListener('fetch', () => {}); self.addEventListener('push', (event) => { let d = {}; try { d = event.data ? event.data.json() : {}; } catch (_) {} const title = d.title || 'BizGaze Connect'; const options = { body: d.body || '', icon: '/logo.png', badge: '/logo.png', tag: d.tag || undefined, // collapse repeats from the same chat renotify: !!d.tag, data: { kind: d.kind || '', id: d.id || '' }, }; event.waitUntil((async () => { // If a BizGaze tab is currently VISIBLE, the page itself alerts the user (ping / in-page // popup) — skip the OS popup to avoid a double. Only show when no tab is visible // (another tab/app, minimized, or closed) — exactly when the page can't alert. const clientsArr = await self.clients.matchAll({ type: 'window', includeUncontrolled: true }); const visible = clientsArr.some((c) => c.visibilityState === 'visible'); if (visible) return; await self.registration.showNotification(title, options); })()); }); self.addEventListener('notificationclick', (event) => { event.notification.close(); const { kind, id } = event.notification.data || {}; const url = '/home' + (id ? ('?openKind=' + encodeURIComponent(kind || 'dm') + '&openId=' + encodeURIComponent(id)) : ''); event.waitUntil((async () => { const all = await self.clients.matchAll({ type: 'window', includeUncontrolled: true }); for (const c of all) { if (c.url.includes('/home')) { try { await c.focus(); c.postMessage({ type: 'open-chat', kind, id }); return; } catch (_) {} } } try { await self.clients.openWindow(url); } catch (_) {} })()); });