const CACHE_NAME = "sproutgate-v1"; const PRECACHE_URLS = [ "/", "/index.html", "/manifest.webmanifest", "/favicon.ico", "/logo.png", "/logo192.png", "/icon-192.png", "/icon-512.png", "/apple-touch-icon.png" ]; self.addEventListener("install", (event) => { event.waitUntil( caches .open(CACHE_NAME) .then((cache) => cache.addAll(PRECACHE_URLS)) .then(() => self.skipWaiting()) ); }); self.addEventListener("activate", (event) => { event.waitUntil( caches .keys() .then((keys) => Promise.all(keys.filter((key) => key !== CACHE_NAME).map((key) => caches.delete(key)))) .then(() => self.clients.claim()) ); }); self.addEventListener("fetch", (event) => { const { request } = event; if (request.method !== "GET") return; const url = new URL(request.url); if (url.origin !== self.location.origin) return; if (request.mode === "navigate") { event.respondWith( fetch(request) .then((response) => { const copy = response.clone(); caches.open(CACHE_NAME).then((cache) => cache.put(request, copy)); return response; }) .catch(() => caches.match(request).then((cached) => cached || caches.match("/index.html"))) ); return; } event.respondWith( caches.match(request).then((cached) => cached || fetch(request) .then((response) => { const copy = response.clone(); caches.open(CACHE_NAME).then((cache) => cache.put(request, copy)); return response; }) .catch(() => cached) ) ); });