UNPKG

react-workbox

Version:

Manage installation and activation of service worker

78 lines (77 loc) 3.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const react_1 = (0, tslib_1.__importStar)(require("react")); const workbox_window_1 = require("workbox-window"); const WorkboxContext_1 = (0, tslib_1.__importDefault)(require("./WorkboxContext")); const logger_1 = (0, tslib_1.__importDefault)(require("./logger")); const WorkboxProvider = ({ children, serviceWorkerUrl = `/service-worker.js`, interval = 60 * 60 * 1000, // 1 hour }) => { const [isUpdateWaiting, setUpdateWaiting] = (0, react_1.useState)(false); const [workbox, setWorkbox] = (0, react_1.useState)(); const [registration, setRegistration] = (0, react_1.useState)(); (0, react_1.useEffect)(() => { logger_1.default.log('USE-EFFECT'); if (process.env.NODE_ENV !== 'production' || !('serviceWorker' in navigator)) { return; } const timer = Boolean(interval) && setInterval(() => wb.update(), interval); const wb = new workbox_window_1.Workbox(serviceWorkerUrl); setWorkbox(wb); const showSkipWaitingPrompt = (event) => { logger_1.default.log('showSkipWaitingPrompt', event.wasWaitingBeforeRegister, event); setUpdateWaiting(true); // `event.wasWaitingBeforeRegister` will be false if this is }; // Add an event listener to detect when the registered // service worker has installed but is waiting to activate. wb.addEventListener('waiting', (e) => { logger_1.default.log('WAITING', e); showSkipWaitingPrompt(e); }); wb.register().then((r) => setRegistration(r)); return () => { if (timer) clearInterval(timer); }; }, []); return (react_1.default.createElement(WorkboxContext_1.default.Provider, { value: { isUpdateWaiting, activateUpdate: () => { if (!workbox || !registration) { return; } logger_1.default.log('ACTIVATE UPDATE', registration, workbox); workbox.addEventListener('controlling', (e) => { // would be called when wasWaitingBeforeRegister = true // would be called when isExternal = false logger_1.default.log('CONTROLLING', e, e.isExternal); if (!e.isExternal) { // <---- may need to be removed // To avoid calling reload twice, needs to check isExternal window.location.reload(); } }); workbox.addEventListener('activated', (e) => { // would be called when isExternal = true // would be called when isExternal = false logger_1.default.log('ACTIVATED', e, e.isExternal); if (e.isExternal) { // REF: https://developers.google.com/web/tools/workbox/modules/workbox-window#when_an_unexpected_version_of_the_service_worker_is_found // When it is external worker, it would not trigger "controlling" event // To avoid calling reload twice, needs to check if it is external window.location.reload(); } }); if (registration.waiting) { logger_1.default.log('workbox MESSAGESKIPWAITING'); workbox.messageSkipWaiting(); setUpdateWaiting(false); } else { window.location.reload(); } }, } }, children)); }; exports.default = WorkboxProvider;