From b518b9e536a1ee1712969ba79ea2daec1acc23e8 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Tue, 2 Jun 2026 10:06:17 +0200 Subject: [PATCH] service worker stuff --- mih_ui/web/flutter_bootstrap.js | 55 +++++++++++++++++---------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/mih_ui/web/flutter_bootstrap.js b/mih_ui/web/flutter_bootstrap.js index da298faf..e65d7f16 100644 --- a/mih_ui/web/flutter_bootstrap.js +++ b/mih_ui/web/flutter_bootstrap.js @@ -3,47 +3,48 @@ const serviceWorkerVersion = '{{flutter_service_worker_version}}'; -if ('serviceWorker' in navigator) { - window.addEventListener('load', function () { - const serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion; - - // Manually register here so we can attach custom update listeners - navigator.serviceWorker.register(serviceWorkerUrl).then((reg) => { - if (reg.waiting) { - showUpdatePrompt(reg); - } +// 1. Let Flutter handle the service worker registration cleanly via its native loader +_flutter.loader.load({ + serviceWorkerSettings: { + serviceWorkerVersion: serviceWorkerVersion + } +}); - reg.addEventListener('updatefound', () => { - const newWorker = reg.installing; +// 2. Safely monitor the registration generated by Flutter without double-registering +if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then((reg) => { + // If an updated worker is already waiting in the background + if (reg.waiting) { + showUpdatePrompt(reg); + } + + // Listen for new updates found while the user has the app open + reg.addEventListener('updatefound', () => { + const newWorker = reg.installing; + if (newWorker) { newWorker.addEventListener('statechange', () => { if (newWorker.state === 'installed' && navigator.serviceWorker.controller) { showUpdatePrompt(reg); } }); - }); - }); - - let refreshing = false; - navigator.serviceWorker.addEventListener('controllerchange', () => { - if (!refreshing) { - refreshing = true; - window.location.reload(); } }); }); + + // Guard against infinite reload loops when the controller shifts + let refreshing = false; + navigator.serviceWorker.addEventListener('controllerchange', () => { + if (!refreshing) { + refreshing = true; + window.location.reload(); + } + }); } function showUpdatePrompt(reg) { if (confirm('A new version of MIH is available. Refresh now to update?')) { reg.unregister().then(function () { - window.location.reload(); // Bypass cache and reload + window.location.reload(); // Unregister and reload to force clear the browser's cache }); } } - -// Initialize Flutter and pass the service worker version -_flutter.loader.load({ - serviceWorkerSettings: { - serviceWorkerVersion: serviceWorkerVersion - } -}); -- 2.52.0