const CACHE_NAME = 'piclets-v4'; const urlsToCache = [ '/', '/manifest.json', '/assets/logo.PNG' ]; // Install event - cache key resources self.addEventListener('install', event => { event.waitUntil( caches.open(CACHE_NAME) .then(cache => { console.log('Opened cache'); return cache.addAll(urlsToCache); }) ); }); // 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); } }) ); }) ); }); // Fetch event - serve from cache when offline self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(response => { // Cache hit - return response if (response) { return response; } // Clone the request const fetchRequest = event.request.clone(); return fetch(fetchRequest).then(response => { // Check if valid response if (!response || response.status !== 200 || response.type !== 'basic') { return response; } // Clone the response const responseToCache = response.clone(); // Cache the fetched response for future use caches.open(CACHE_NAME) .then(cache => { // Don't cache API calls or external resources if (event.request.url.startsWith(self.location.origin)) { cache.put(event.request, responseToCache); } }); return response; }); }) .catch(() => { // Offline fallback if (event.request.mode === 'navigate') { return caches.match('/'); } }) ); });