68 lines
2.0 KiB
JavaScript
68 lines
2.0 KiB
JavaScript
const OFFLINE_CACHE_NAME = "offline";
|
|
// Bumping this version will force an update of the service worker
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
const OFFLINE_PAGE_VERSION = 1;
|
|
const OFFLINE_CACHE_PATHS = [
|
|
"/pwa_offline.html",
|
|
"/images/errors/small/404.png",
|
|
"/images/errors/medium/404.png",
|
|
"/images/errors/original/404.png"
|
|
];
|
|
|
|
self.addEventListener('push', function (event) {
|
|
if (event.data) {
|
|
const notification = event.data.json();
|
|
|
|
event.waitUntil(self.registration.showNotification(notification.title, {
|
|
body: notification.body,
|
|
tag: notification.type,
|
|
icon: notification.icon,
|
|
}));
|
|
} else {
|
|
console.error("Push event received, but it didn't contain any data.", event);
|
|
}
|
|
});
|
|
|
|
self.addEventListener('notificationclick', async event => {
|
|
if (event.notification.tag === 'inbox') {
|
|
event.preventDefault();
|
|
return clients.openWindow("/inbox", "_blank").then(result => {
|
|
event.notification.close();
|
|
return result;
|
|
});
|
|
} else {
|
|
console.warn(`Unhandled notification tag: ${event.notification.tag}`);
|
|
}
|
|
});
|
|
|
|
self.addEventListener('install', function (event) {
|
|
event.waitUntil(
|
|
(async () => {
|
|
const cache = await caches.open(OFFLINE_CACHE_NAME);
|
|
await cache.addAll(OFFLINE_CACHE_PATHS);
|
|
})()
|
|
);
|
|
// Immediately activate new versions of the service worker instead of waiting
|
|
self.skipWaiting();
|
|
});
|
|
|
|
self.addEventListener('fetch', function (event) {
|
|
const url = new URL(event.request.url);
|
|
if (event.request.method !== 'GET' || !OFFLINE_CACHE_PATHS.includes(url.pathname)) return;
|
|
|
|
event.respondWith(
|
|
(async () => {
|
|
try {
|
|
// Try to load the resource
|
|
return await fetch(event.request);
|
|
} catch (error) {
|
|
// Show an error page if offline
|
|
console.log("Fetch failed; returning offline page instead.", error);
|
|
|
|
const cache = await caches.open(OFFLINE_CACHE_NAME);
|
|
return await cache.match(OFFLINE_CACHE_PATHS[0]);
|
|
}
|
|
})()
|
|
);
|
|
});
|