// Service Worker for Habland Admin Panel const CACHE_NAME = 'habland-admin-v1.1.0'; const urlsToCache = [ '/', '/manifest.json', ]; // Install event - cache essential resources self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME) .then((cache) => { console.log('Opened cache'); return cache.addAll(urlsToCache); }) .catch((error) => { console.error('Cache install failed:', error); }) ); self.skipWaiting(); }); // Activate event - clean up old caches self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames.map((cacheName) => { if (cacheName !== CACHE_NAME) { console.log('Deleting old cache:', cacheName); return caches.delete(cacheName); } }) ); }) ); self.clients.claim(); }); // Fetch event - network first, fallback to cache self.addEventListener('fetch', (event) => { // Skip chrome-extension and other non-http requests if (!event.request.url.startsWith('http')) { return; } // Skip caching for non-GET requests (POST, PUT, DELETE, etc.) // The Cache API only supports GET requests if (event.request.method !== 'GET') { event.respondWith(fetch(event.request)); return; } event.respondWith( fetch(event.request) .then((response) => { // Don't cache if not a valid response if (!response || response.status !== 200 || response.type !== 'basic') { return response; } // Clone the response const responseToCache = response.clone(); caches.open(CACHE_NAME) .then((cache) => { cache.put(event.request, responseToCache); }); return response; }) .catch(() => { // Network failed, try cache return caches.match(event.request) .then((response) => { if (response) { return response; } // Return offline page for navigation requests if (event.request.mode === 'navigate') { return caches.match('/'); } }); }) ); }); // Handle messages from clients self.addEventListener('message', (event) => { if (event.data && event.data.type === 'SKIP_WAITING') { self.skipWaiting(); } });