/// // Bump this version on every release that changes cached assets. The `activate` // handler below deletes all caches whose name !== CACHE_NAME, so incrementing // this string force-purges stale bundles from clients that cached the old // (broken) build — fixes "website hasn't changed after redeploy". const CACHE_NAME = "cannamanage-v2" const OFFLINE_URL = "/offline" // Assets to pre-cache const PRECACHE_ASSETS = [ "/offline", "/manifest.json", "/icons/icon-192.png", "/icons/icon-512.png", ] self.addEventListener("install", (event) => { event.waitUntil( caches.open(CACHE_NAME).then((cache) => { return cache.addAll(PRECACHE_ASSETS) }) ) self.skipWaiting() }) self.addEventListener("activate", (event) => { event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames .filter((name) => name !== CACHE_NAME) .map((name) => caches.delete(name)) ) }) ) self.clients.claim() }) self.addEventListener("fetch", (event) => { // Only handle GET requests if (event.request.method !== "GET") return // Skip API requests — let them fail naturally if (event.request.url.includes("/api/")) return // Network-first for navigation requests if (event.request.mode === "navigate") { event.respondWith( fetch(event.request).catch(() => { return caches.match(OFFLINE_URL) }) ) return } // Stale-while-revalidate for static assets if ( event.request.destination === "style" || event.request.destination === "script" || event.request.destination === "image" ) { event.respondWith( caches.match(event.request).then((cachedResponse) => { const fetchPromise = fetch(event.request).then((networkResponse) => { if (networkResponse && networkResponse.status === 200) { const cache = caches.open(CACHE_NAME) cache.then((c) => c.put(event.request, networkResponse.clone())) } return networkResponse }) return cachedResponse || fetchPromise }) ) } })