/* * Service Worker des Planers. * * Er tut genau eine Sache: Push-Nachrichten anzeigen und beim Klick die * richtige Seite öffnen. Kein Zwischenspeichern von Seiten — ein halb * veralteter Planer wäre schlimmer als gar keiner. */ self.addEventListener('install', () => { // Sofort übernehmen, nicht auf das Schließen aller Tabs warten. self.skipWaiting() }) self.addEventListener('activate', (ereignis) => { ereignis.waitUntil(self.clients.claim()) }) self.addEventListener('push', (ereignis) => { let daten = { titel: 'Planer', text: '', pfad: '/' } try { if (ereignis.data) daten = { ...daten, ...ereignis.data.json() } } catch { // Kaputte Nutzlast: lieber eine karge Meldung als gar keine. } ereignis.waitUntil( self.registration.showNotification(daten.titel, { body: daten.text, lang: 'de', // Gleiche Anlässe überschreiben einander, statt sich zu stapeln. tag: daten.anlass || 'planer', data: { pfad: daten.pfad }, }), ) }) self.addEventListener('notificationclick', (ereignis) => { ereignis.notification.close() const pfad = (ereignis.notification.data && ereignis.notification.data.pfad) || '/' ereignis.waitUntil( self.clients.matchAll({ type: 'window', includeUncontrolled: true }).then((fenster) => { // Ist der Planer schon offen, dorthin wechseln statt ein zweites // Fenster aufzumachen. for (const f of fenster) { if (f.url.includes(self.location.origin)) { return f.focus().then(() => f.navigate(pfad)) } } return self.clients.openWindow(pfad) }), ) })