diff --git a/frontend/index.html b/frontend/index.html index 3eeb9c7..83f9b63 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,8 +2,10 @@ - + + + diff --git a/frontend/public/manifest.webmanifest b/frontend/public/manifest.webmanifest index e8d2ee9..819a637 100644 --- a/frontend/public/manifest.webmanifest +++ b/frontend/public/manifest.webmanifest @@ -7,6 +7,7 @@ "display": "standalone", "background_color": "#f5f7fb", "theme_color": "#2563eb", + "orientation": "portrait", "icons": [ { "src": "/icons/professeur-top-install-v2-192.png", diff --git a/frontend/public/sw.js b/frontend/public/sw.js index d4356c3..1d66df1 100644 --- a/frontend/public/sw.js +++ b/frontend/public/sw.js @@ -1,9 +1,38 @@ -self.addEventListener('install', () => { +const CACHE_NAME = 'professeur-top-v3' +const ASSETS = [ + '/', + '/manifest.webmanifest', + '/icons/professeur-top-install-v2-192.png', + '/icons/professeur-top-install-v2-512.png', +] + +self.addEventListener('install', (event) => { + event.waitUntil(caches.open(CACHE_NAME).then((cache) => cache.addAll(ASSETS))) self.skipWaiting() }) self.addEventListener('activate', (event) => { - event.waitUntil(self.clients.claim()) + event.waitUntil( + caches.keys().then((keys) => + Promise.all(keys.filter((key) => key !== CACHE_NAME).map((key) => caches.delete(key))) + ) + ) + self.clients.claim() }) -self.addEventListener('fetch', () => {}) +self.addEventListener('fetch', (event) => { + if (event.request.method !== 'GET') return + + const url = new URL(event.request.url) + if (url.origin !== self.location.origin || url.pathname.startsWith('/api/')) return + + event.respondWith( + fetch(event.request) + .then((response) => { + const copy = response.clone() + caches.open(CACHE_NAME).then((cache) => cache.put(event.request, copy)) + return response + }) + .catch(() => caches.match(event.request).then((cached) => cached || caches.match('/'))) + ) +})