38 lines
1008 B
TypeScript

import { type PushMessage } from '~/types';
declare let self: ServiceWorkerGlobalScope;
self.addEventListener('push', function (event) {
if (!event) return;
const data = JSON.parse(event?.data?.text() ?? '{}') as PushMessage;
event.waitUntil(
self.registration.showNotification(data.title, {
body: data.message,
icon: '/icons/android-chrome-192x192.png',
}),
);
});
self.addEventListener('notificationclick', function (event) {
if (!event) return;
event.notification.close();
event.waitUntil(
self.clients
.matchAll({ type: 'window', includeUncontrolled: true })
.then(function (clientList) {
if (clientList.length > 0) {
let client = clientList[0];
for (const _client of clientList) {
if (_client.focused) {
client = _client;
}
}
return client?.focus();
}
return self.clients?.openWindow('/');
}),
);
});