Fix PWA-Update: window global statt dynamic import, synchroner Reload bei Seitenwechsel

This commit is contained in:
2026-06-02 19:38:40 +02:00
parent b698818791
commit b0b4c27f00
3 changed files with 26 additions and 41 deletions

View File

@@ -2,10 +2,11 @@ import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
// ── Auto-Reload bei neuem Build ───────────────────────────────────────────────
// Reload passiert beim nächsten Seitenwechsel (setActive) — nicht mitten in Eingaben
// ── Build-Zeit Check ──────────────────────────────────────────────────────────
// Globale Variable synchron lesbar, kein dynamischer Import nötig
window.__newBuildAvailable = false;
const STORED_KEY = 'dd_build_time';
let newBuildAvailable = false;
async function checkBuildTime() {
try {
@@ -16,43 +17,32 @@ async function checkBuildTime() {
localStorage.setItem(STORED_KEY, buildTime);
} else if (stored !== buildTime) {
localStorage.setItem(STORED_KEY, buildTime);
newBuildAvailable = true;
window.__newBuildAvailable = true;
}
} catch {}
}
// Beim Start sofort prüfen (PWA-Launch: index.html könnte gecacht sein)
// Sofort beim Start prüfen, dann alle 60s
checkBuildTime();
// Danach alle 60s im Hintergrund weiter prüfen
setInterval(checkBuildTime, 60_000);
// Wird von App.jsx bei jedem Seitenwechsel aufgerufen
export function reloadIfNewBuild() {
if (newBuildAvailable) window.location.reload();
}
// ── Service Worker ────────────────────────────────────────────────────────────
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(reg => {
// Falls schon ein wartender SW vorhanden → sofort aktivieren
if (reg.waiting) {
reg.waiting.postMessage('SKIP_WAITING');
}
if (reg.waiting) reg.waiting.postMessage('SKIP_WAITING');
reg.addEventListener('updatefound', () => {
const nw = reg.installing;
nw?.addEventListener('statechange', () => {
if (nw.state === 'installed') {
// Neuer SW fertig installiert → sofort aktivieren
nw.postMessage('SKIP_WAITING');
}
});
});
// Wenn der SW-Controller gewechselt hat (neuer SW aktiv):
// newBuildAvailable setzen — Reload passiert beim nächsten setActive
// Neuer SW aktiv → beim nächsten Seitenwechsel reloaden
navigator.serviceWorker.addEventListener('controllerchange', () => {
newBuildAvailable = true;
window.__newBuildAvailable = true;
});
});
}