// Network-first strategy with offline fallback for PWA standalone mode const CACHE_NAME = "rails-8-starter-offline"; const OFFLINE_URL = "/offline.html"; // Pre-cache the offline fallback page on install self.addEventListener("install", (event) => { event.waitUntil( caches.open(CACHE_NAME).then((cache) => cache.add(OFFLINE_URL)) ); self.skipWaiting(); }); // Clean up old caches on activate self.addEventListener("activate", (event) => { event.waitUntil( caches.keys().then((keys) => Promise.all( keys .filter((key) => key !== CACHE_NAME) .map((key) => caches.delete(key)) ) ) ); self.clients.claim(); }); // Network-first for navigation requests; fallback to offline page on failure self.addEventListener("fetch", (event) => { if (event.request.mode !== "navigate") return; const url = new URL(event.request.url); event.respondWith( fetch(event.request).catch(() => caches.match(OFFLINE_URL).then((cached) => cached || new Response("Offline", { status: 503 })) ) ); });