Files
TrueNews/public/sw.js
T

25 lines
1.3 KiB
JavaScript

self.addEventListener('install', () => self.skipWaiting());
self.addEventListener('activate', event => event.waitUntil(self.clients.claim()));
self.addEventListener('push', event => {
let message={};
try {message=event.data?.json() || {};} catch { /* Show a generic notification for malformed payloads. */ }
let url='/';
try {const target=new URL(message.url || '/',self.location.origin);if(target.origin===self.location.origin)url=target.pathname+target.search;} catch {}
event.waitUntil(self.registration.showNotification(message.title || 'A new story on TrueNews',{
body:message.body || 'Read the latest story.',
icon:'/assets/icon-192.png',badge:'/assets/icon-192.png',
tag:message.tag || 'truenews-story',data:{url}
}));
});
self.addEventListener('notificationclick', event => {
event.notification.close();
event.waitUntil((async()=>{
const target=new URL(event.notification.data?.url || '/',self.location.origin);
if(target.origin!==self.location.origin) return;
const windows=await self.clients.matchAll({type:'window',includeUncontrolled:true});
const existing=windows.find(client=>new URL(client.url).origin===target.origin);
if(existing){await existing.navigate(target.href);await existing.focus();}
else await self.clients.openWindow(target.href);
})());
});