diff --git a/WebApp/src/routes/+layout.svelte b/WebApp/src/routes/+layout.svelte index 144a5f7..fb3c785 100644 --- a/WebApp/src/routes/+layout.svelte +++ b/WebApp/src/routes/+layout.svelte @@ -2,7 +2,6 @@ // @ts-nocheck import '../app.css'; import { onMount } from 'svelte'; - import { registerSW } from 'virtual:pwa-register'; import favicon from '$lib/assets/favicon.svg'; import { appController } from '$lib/app/controller'; import { @@ -17,14 +16,47 @@ let { children } = $props(); onMount(() => { - registerSW({ - onNeedRefresh() { - setUpdateAvailable(true); - }, - onOfflineReady() { - setOfflineReady(true); + const registerServiceWorker = async () => { + if (!import.meta.env.PROD || !('serviceWorker' in navigator)) { + return; } - }); + + try { + const registration = await navigator.serviceWorker.register('/sw.js'); + + const handleInstallingWorker = (worker) => { + if (!worker) { + return; + } + + worker.addEventListener('statechange', () => { + if (worker.state !== 'installed') { + return; + } + + if (navigator.serviceWorker.controller) { + setUpdateAvailable(true); + return; + } + + setOfflineReady(true); + }); + }; + + if (registration.waiting) { + setUpdateAvailable(true); + } + + handleInstallingWorker(registration.installing); + registration.addEventListener('updatefound', () => { + handleInstallingWorker(registration.installing); + }); + } catch (error) { + console.error('Service worker registration failed', error); + } + }; + + void registerServiceWorker(); const handleBeforeInstallPrompt = (event) => { event.preventDefault(); diff --git a/WebApp/vite.config.ts b/WebApp/vite.config.ts index fa299ff..d484657 100644 --- a/WebApp/vite.config.ts +++ b/WebApp/vite.config.ts @@ -35,6 +35,7 @@ export default defineConfig({ tailwindcss(), sveltekit(), VitePWA({ + injectRegister: false, registerType: 'autoUpdate', includeAssets: ['icons/apple-touch-icon.png', 'icons/pwa-192x192.png', 'icons/pwa-512x512.png'], manifest: { @@ -73,7 +74,7 @@ export default defineConfig({ navigateFallbackDenylist: [/^\/api\//, /^\/devices/, /^\/device-links/, /^\/streams/, /^\/events/, /^\/recordings/, /^\/videos/, /^\/push-notifications/, /^\/socket\.io\//] }, devOptions: { - enabled: true + enabled: false } }) ],