import { send } from '@/lib/utils/events' let refresh = false function invokeServiceWorkerUpdateFlow (registration) { const agree = confirm('New version of the app is available. Refresh now?') if (agree) { if (registration.waiting) { // let waiting Service Worker know it should became active refresh = true registration.waiting.postMessage({ type: 'SKIP_WAITING' }) } } } if ('serviceWorker' in navigator) { window.addEventListener('load', async () => { const registration = await navigator.serviceWorker.register('service-worker.js') // ensure the case when the updatefound event was missed is also handled // by re-invoking the prompt when there's a waiting Service Worker if (registration.waiting) { invokeServiceWorkerUpdateFlow(registration) } // detect Service Worker update available and wait for it to become installed registration.addEventListener('updatefound', () => { const newRegestration = registration.installing if (newRegestration) { // wait until the new Service worker is actually installed (ready to take over) newRegestration.addEventListener('statechange', () => { if (registration.waiting && navigator.serviceWorker.controller) { invokeServiceWorkerUpdateFlow(registration) } }) } }) // detect controller change and refresh the page navigator.serviceWorker.addEventListener('controllerchange', () => { if (refresh) { window.location.reload() refresh = false } }) }) window.addEventListener('appinstalled', () => { send('pwa.install') }) }