From d0587b08d859967bdd02320995f27ad882044aee Mon Sep 17 00:00:00 2001 From: Andreas Schmitz Date: Fri, 8 Apr 2022 15:12:34 +0200 Subject: [PATCH] Try to avoid constant reloading problem --- public/sw.js | 43 ++++++++++++++++++++++--------------------- src/index.tsx | 4 ++-- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/public/sw.js b/public/sw.js index c21e1c07..f89d4d29 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,6 +1,6 @@ -var doCaching = true; +let doCaching = true; -self.addEventListener('message', (event) => { +self.addEventListener('message', event => { if (event.data && event.data.type === 'STOP_CACHING') { doCaching = false; } @@ -9,23 +9,24 @@ self.addEventListener('message', (event) => { } }); -self.addEventListener('fetch', function (event) { - event.respondWith( - caches.open('react-geo-baseclient').then(function (cache) { - if (!doCaching) { - return fetch(event.request); - } - return cache.match(event.request).then(function (response) { - return ( - response || - fetch(event.request).then(function (netResponse) { - if (!event.request.url.startsWith('chrome')) { - cache.put(event.request, netResponse.clone()); - } - return netResponse; - }) - ); - }); - }), - ); +const putInCache = async (request, response) => { + const cache = await caches.open('v1'); + await cache.put(request, response); +}; + +const cacheFirst = async request => { + const cache = await caches.open('v1'); + const responseFromCache = await cache.match(request); + if (responseFromCache) { + return responseFromCache; + } + const responseFromNetwork = await fetch(request); + if (doCaching) { + putInCache(request, responseFromNetwork.clone()); + } + return responseFromNetwork; +}; + +self.addEventListener('fetch', event => { + event.respondWith(cacheFirst(event.request)); }); diff --git a/src/index.tsx b/src/index.tsx index f11fa50a..85cf6259 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -118,8 +118,8 @@ const renderApp = async () => { } }; -window.addEventListener('load', () => { +if (!navigator.serviceWorker.controller) { navigator.serviceWorker.register('/sw.js'); -}); +} renderApp();