25 lines
1.3 KiB
JavaScript
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);
|
|
})());
|
|
});
|