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]); } })() ); });