38 lines
1008 B
TypeScript
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('/');
|
|
}),
|
|
);
|
|
});
|