Mercurial
diff mrjunejune/src/public/pwa-register.js @ 209:3b47e82ac57e
[MrJuneJune] PWA updates.
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sun, 15 Feb 2026 15:43:26 -0800 |
| parents | |
| children | a6d8d32a0261 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mrjunejune/src/public/pwa-register.js Sun Feb 15 15:43:26 2026 -0800 @@ -0,0 +1,88 @@ +// PWA Service Worker Registration +if ('serviceWorker' in navigator) { + window.addEventListener('load', () => { + navigator.serviceWorker + .register('/public/sw.js') + .then((registration) => { + console.log('[PWA] Service Worker registered:', registration.scope); + + // Check for updates periodically + setInterval(() => { + registration.update(); + }, 60000); // Check every minute + + // Handle updates + registration.addEventListener('updatefound', () => { + const newWorker = registration.installing; + newWorker.addEventListener('statechange', () => { + if (newWorker.state === 'installed' && navigator.serviceWorker.controller) { + // New content available, show update notification + if (confirm('New version available! Reload to update?')) { + newWorker.postMessage({ type: 'SKIP_WAITING' }); + window.location.reload(); + } + } + }); + }); + }) + .catch((error) => { + console.error('[PWA] Service Worker registration failed:', error); + }); + + // Handle service worker updates + let refreshing = false; + navigator.serviceWorker.addEventListener('controllerchange', () => { + if (!refreshing) { + refreshing = true; + window.location.reload(); + } + }); + }); +} + +// Add install prompt handler +let deferredPrompt; + +window.addEventListener('beforeinstallprompt', (e) => { + e.preventDefault(); + deferredPrompt = e; + + showInstallPromotion(); +}); + +function showInstallPromotion() { + // Create an install button if it doesn't exist + if (document.getElementById('pwa-install-btn')) return; + + const installBtn = document.createElement('button'); + installBtn.classList.add('with-icon'); + installBtn.id = 'pwa-install-btn'; + installBtn.textContent = 'Install as App'; + + installBtn.addEventListener('click', async () => { + if (!deferredPrompt) return; + + deferredPrompt.prompt(); + const { outcome } = await deferredPrompt.userChoice; + console.log(`[PWA] User response: ${outcome}`); + + deferredPrompt = null; + installBtn.remove(); + }); + + document.body.appendChild(installBtn); + + // setTimeout(() => { + // installBtn.style.opacity = '0'; + // installBtn.style.transition = 'opacity 0.3s'; + // setTimeout(() => installBtn.remove(), 300); + // }, 10000); +} + +window.addEventListener('appinstalled', () => { + console.log('[PWA] App installed successfully!'); + deferredPrompt = null; + + const installBtn = document.getElementById('pwa-install-btn'); + if (installBtn) installBtn.remove(); +});