Auto-Reload: nur beim Seitenwechsel, nicht mitten in der Arbeit

This commit is contained in:
2026-05-30 01:47:42 +02:00
parent 7768aebe65
commit cf415d2b76
2 changed files with 39 additions and 29 deletions

View File

@@ -2,43 +2,49 @@ import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
// ── Service Worker registrieren + Auto-Reload bei neuem Build ─────────────────
// ── Auto-Reload bei neuem Build nur beim Seitenwechsel ─────────────────────
const STORED_KEY = 'dd_build_time';
let newBuildAvailable = false;
async function checkBuildTime() {
try {
const r = await fetch('/api/build-time', { cache: 'no-store' });
const { buildTime } = await r.json();
const stored = localStorage.getItem(STORED_KEY);
if (!stored) {
localStorage.setItem(STORED_KEY, buildTime);
} else if (stored !== buildTime) {
localStorage.setItem(STORED_KEY, buildTime);
newBuildAvailable = true; // merken, aber noch nicht reloaden
}
} catch {}
}
// Alle 60s im Hintergrund prüfen
checkBuildTime();
setInterval(checkBuildTime, 60_000);
// Reload-Funktion wird vom App beim Seitenwechsel aufgerufen
export function reloadIfNewBuild() {
if (newBuildAvailable) window.location.reload();
}
// ── Service Worker ────────────────────────────────────────────────────────────
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(reg => {
// Wenn ein neuer SW wartet: sofort übernehmen lassen
const takeOver = () => {
if (reg.waiting) {
reg.waiting.postMessage('SKIP_WAITING');
}
};
if (reg.waiting) reg.waiting.postMessage('SKIP_WAITING');
reg.addEventListener('updatefound', () => {
const newWorker = reg.installing;
newWorker?.addEventListener('statechange', () => {
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
takeOver();
const nw = reg.installing;
nw?.addEventListener('statechange', () => {
if (nw.state === 'installed' && navigator.serviceWorker.controller) {
nw.postMessage('SKIP_WAITING');
}
});
});
// Wenn SW übernimmt → Seite neu laden
navigator.serviceWorker.addEventListener('controllerchange', () => {
window.location.reload();
newBuildAvailable = true; // SW-Update → beim nächsten Wechsel laden
});
});
// Beim Start: Build-Zeit prüfen und bei neuer Version neu laden
const STORED_KEY = 'dd_build_time';
fetch('/api/build-time', { cache: 'no-store' })
.then(r => r.json())
.then(({ buildTime }) => {
const stored = localStorage.getItem(STORED_KEY);
if (stored && stored !== buildTime) {
localStorage.setItem(STORED_KEY, buildTime);
window.location.reload();
} else {
localStorage.setItem(STORED_KEY, buildTime);
}
})
.catch(() => {}); // offline kein reload
}
ReactDOM.createRoot(document.getElementById('root')).render(