From d1439b3f09ec469dcd76ec6669bbc9b2062fa113 Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Mon, 11 May 2020 13:04:00 -0500 Subject: [PATCH] fix (maybe) for page not reloading after updating service worker --- js/pacosako_ui.js | 69 +++++++++++++++++++++++++---------------------- sw.js | 4 +++ 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/js/pacosako_ui.js b/js/pacosako_ui.js index 32d8f4a..a1c2908 100644 --- a/js/pacosako_ui.js +++ b/js/pacosako_ui.js @@ -786,30 +786,40 @@ $(function (){ Promise.resolve().then(async () => { const wb = new Workbox('sw.js'); + let latest_sw = null; function showSkipWaitingPrompt(event) { - if (confirmBox) { - confirmBox.close({ ignoreDelay: true }); + latest_sw = event.sw; + + if (!confirmBox) { + confirmBox = new jBox('Confirm', { + attach: null, + content: "A new version is available. Update the page?", + confirmButton: `Update`, + cancelButton: 'Not now', + closeOnConfirm: false, + async confirm() { + /* The SW should signal us to reload, but do it after 20s regardless. */ + setTimeout(() => { window.location.reload(); }, 20000); + messageSW(latest_sw, {type: 'SKIP_WAITING'}); + $('.update-confirm-button').text('Updating…'); + }, + onClose() { + if (confirmBox === this) { + confirmBox = null; + } + }, + onCloseComplete() { + this.destroy(); + }, + }); + + confirmBox.open(); } + } - confirmBox = new jBox('Confirm', { - attach: null, - content: "A new version is available. Update the page?", - confirmButton: `Update`, - cancelButton: 'Not now', - closeOnConfirm: false, - confirm() { - /* The SW should signal us to reload, but do it after 20s regardless. */ - setTimeout(() => { window.location.reload(); }, 20000); - messageSW(event.sw, {type: 'SKIP_WAITING'}); - $('.update-confirm-button').text('Updating…'); - }, - onCloseComplete() { - this.destroy(); - }, - }); - - confirmBox.open(); + function reloadForUpdate(event) { + window.location.reload(); } wb.addEventListener('installed', (event) => { @@ -822,23 +832,18 @@ $(function (){ } }); - wb.addEventListener('controlling', (event) => { - if (event.isUpdate) { - window.location.reload(); - } - }); - wb.addEventListener('waiting', showSkipWaitingPrompt); wb.addEventListener('externalwaiting', showSkipWaitingPrompt); + wb.addEventListener('controlling', reloadForUpdate); + wb.addEventListener('externalactivated', reloadForUpdate); + const registration = await wb.register(); - if ('update' in registration) { - /* Check for updates every 4h without reloading the page. */ - setInterval(() => { registration.update(); }, 4*3600*1000); - } else { - console.log('service worker update method not supported, disabling update checks'); - } + /* Check for updates every 4h without reloading the page. */ + setInterval(() => { wb.update(); }, 4*3600*1000); + + window.Admin.workbox = wb; }).catch((err) => { console.error('failed to register the service worker', err); disableNotify(); diff --git a/sw.js b/sw.js index 9303307..4b58a4a 100644 --- a/sw.js +++ b/sw.js @@ -14,3 +14,7 @@ addEventListener('message', (event) => { skipWaiting(); } }); + +self.addEventListener('activate', (event) => { + event.waitUntil(clients.claim()); +});