const CACHE_NAME = "whopays-v2"; const urlsToCache = [ "/", "/index.html", "/style.css", "/script.js", "/manifest.json" ]; console.log("🔧 Service Worker: Loading..."); // Install event self.addEventListener("install", (event) => { console.log("⚙️ Service Worker: Installing..."); event.waitUntil( caches.open(CACHE_NAME) .then((cache) => { console.log("✅ Service Worker: Cache opened"); // Try to cache files, but don't fail if some are missing return Promise.allSettled( urlsToCache.map(url => cache.add(url).catch(err => { console.warn(`⚠️ Failed to cache: ${url}`, err); return null; }) ) ); }) .then(() => { console.log("✅ Service Worker: Installed"); }) .catch(err => { console.error("❌ Service Worker: Install failed", err); }) ); self.skipWaiting(); }); // Activate event self.addEventListener("activate", (event) => { console.log("🔄 Service Worker: Activating..."); event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames.map((cacheName) => { if (cacheName !== CACHE_NAME) { console.log(`🗑️ Service Worker: Deleting old cache: ${cacheName}`); return caches.delete(cacheName); } }) ); }).then(() => { console.log("✅ Service Worker: Activated"); }) ); self.clients.claim(); }); // Fetch event self.addEventListener("fetch", (event) => { const url = new URL(event.request.url); // Network first for API calls if (url.pathname.startsWith("/status") || url.pathname.startsWith("/toggle")) { event.respondWith( fetch(event.request) .catch(() => { console.warn("⚠️ API offline, returning error"); return new Response( JSON.stringify({ error: "Offline" }), { headers: { "Content-Type": "application/json" }, status: 503 } ); }) ); return; } // Cache first for static assets event.respondWith( caches.match(event.request) .then((response) => { if (response) { return response; } return fetch(event.request).then((fetchResponse) => { // Only cache successful responses if (!fetchResponse || fetchResponse.status !== 200 || fetchResponse.type !== 'basic') { return fetchResponse; } const responseToCache = fetchResponse.clone(); caches.open(CACHE_NAME).then((cache) => { cache.put(event.request, responseToCache); }); return fetchResponse; }); }) .catch((err) => { console.warn("⚠️ Fetch failed:", err); // Fallback for navigation requests if (event.request.mode === 'navigate') { return caches.match('/index.html'); } return new Response('Offline', { status: 503 }); }) ); }); console.log("✅ Service Worker: Script loaded");