- Dev/prod URL auto-detection (Vite 5173 in dev, server 3000 in prod) - Typed IPC bridge via preload (notifications, badge, window controls, updates, deep links) - Native OS notifications via NotificationController with window focus suppression - Auto-update via electron-updater with UpdateToast UI - Deep linking (backspace:// protocol) for macOS and Windows/Linux - Window state persistence (position, size, maximize across restarts) - Tray icon with graceful fallback when icon asset missing - Suppress PWA service worker polling/reloads inside Electron - Platform detection layer (isElectron, getElectronAPI) - Root workspace scripts (dev:desktop, build:desktop) - Document BACKSPACE_URL and BACKSPACE_UPDATE_URL env vars
27 lines
795 B
TypeScript
27 lines
795 B
TypeScript
import { useRegisterSW } from 'virtual:pwa-register/react';
|
|
import { useEffect } from 'react';
|
|
import { isElectron } from '../../platform/platform';
|
|
|
|
export function SwAutoUpdate() {
|
|
const inElectron = isElectron();
|
|
|
|
useRegisterSW({
|
|
onRegisteredSW(_swUrl, registration) {
|
|
if (!registration || inElectron) return;
|
|
setInterval(() => {
|
|
registration.update();
|
|
}, 60_000);
|
|
},
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (inElectron) return;
|
|
if (!navigator.serviceWorker) return;
|
|
const onControllerChange = () => window.location.reload();
|
|
navigator.serviceWorker.addEventListener('controllerchange', onControllerChange);
|
|
return () => navigator.serviceWorker.removeEventListener('controllerchange', onControllerChange);
|
|
}, [inElectron]);
|
|
|
|
return null;
|
|
}
|