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());
+});