Files
fotospiel-app/resources/js/guest-v2/components/PwaManager.tsx
Codex Agent 0a08f2704f
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled
refactor(guest): retire legacy guest app and move shared modules
2026-02-06 08:42:53 +01:00

65 lines
1.6 KiB
TypeScript

import React from 'react';
import { registerSW } from 'virtual:pwa-register';
import { pushGuestToast } from '../lib/toast';
export default function PwaManager() {
const updatePromptedRef = React.useRef(false);
React.useEffect(() => {
if (!('serviceWorker' in navigator)) {
return;
}
const updateSW = registerSW({
immediate: true,
onNeedRefresh() {
if (updatePromptedRef.current) {
return;
}
updatePromptedRef.current = true;
pushGuestToast({
text: 'Update available',
type: 'info',
durationMs: 0,
action: {
label: 'Reload',
onClick: () => updateSW(true),
},
});
},
onOfflineReady() {
pushGuestToast({
text: 'Offline mode ready',
type: 'success',
});
},
onRegisterError(error) {
console.warn('Guest v2 PWA registration failed', error);
},
});
const runQueue = () => {
void import('@/shared/guest/queue/queue')
.then((module) => module.processQueue().catch(() => {}))
.catch(() => {});
};
const handleMessage = (event: MessageEvent) => {
if (event.data?.type === 'sync-queue') {
runQueue();
}
};
navigator.serviceWorker.addEventListener('message', handleMessage);
window.addEventListener('online', runQueue);
runQueue();
return () => {
navigator.serviceWorker.removeEventListener('message', handleMessage);
window.removeEventListener('online', runQueue);
};
}, []);
return null;
}