mirror of
https://github.com/dergigi/boris.git
synced 2025-12-27 11:34:50 +01:00
- Add web app manifest with proper metadata and icon support - Configure vite-plugin-pwa with injectManifest strategy - Migrate service worker to Workbox with precaching and runtime caching - Add runtime caching for cross-origin images (preserves existing behavior) - Add runtime caching for cross-origin article HTML for offline reading - Create PWA install hook and UI component in settings - Add online/offline status monitoring and toast notifications - Add service worker update notifications - Add placeholder PWA icons (192x192, 512x512, maskable variants) - Update HTML with manifest link and theme-color meta tag - Preserve existing relay/airplane mode functionality (WebSockets not intercepted) The app now passes PWA installability criteria while maintaining all existing offline functionality. Icons should be replaced with proper branded designs.
48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import React from 'react'
|
|
import ReactDOM from 'react-dom/client'
|
|
import App from './App.tsx'
|
|
import './index.css'
|
|
|
|
// Register Service Worker for PWA functionality
|
|
if ('serviceWorker' in navigator) {
|
|
window.addEventListener('load', () => {
|
|
navigator.serviceWorker
|
|
.register('/sw.js', { type: 'module' })
|
|
.then(registration => {
|
|
console.log('✅ Service Worker registered:', registration.scope)
|
|
|
|
// Check for updates periodically
|
|
setInterval(() => {
|
|
registration.update()
|
|
}, 60 * 60 * 1000) // Check every hour
|
|
|
|
// Handle service worker updates
|
|
registration.addEventListener('updatefound', () => {
|
|
const newWorker = registration.installing
|
|
if (newWorker) {
|
|
newWorker.addEventListener('statechange', () => {
|
|
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
|
|
// New service worker available
|
|
console.log('🔄 New version available! Reload to update.')
|
|
|
|
// Optionally show a toast notification
|
|
const updateAvailable = new CustomEvent('sw-update-available')
|
|
window.dispatchEvent(updateAvailable)
|
|
}
|
|
})
|
|
}
|
|
})
|
|
})
|
|
.catch(error => {
|
|
console.error('❌ Service Worker registration failed:', error)
|
|
})
|
|
})
|
|
}
|
|
|
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
<React.StrictMode>
|
|
<App />
|
|
</React.StrictMode>,
|
|
)
|
|
|