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

@@ -2381,7 +2381,11 @@ export default function App() {
return window.matchMedia('(display-mode: standalone)').matches && !sessionStorage.getItem('splash_shown'); return window.matchMedia('(display-mode: standalone)').matches && !sessionStorage.getItem('splash_shown');
}); });
const [user,setUser]=useState(null); const [user,setUser]=useState(null);
const [active,setActive]=useState('dashboard'); const [active,setActiveRaw]=useState('dashboard');
const setActive = (page) => {
import('./main.jsx').then(m => m.reloadIfNewBuild?.()).catch(()=>{});
setActiveRaw(page);
};
const [toastMsg,setToastMsg]=useState({msg:'',type:'success'}); const [toastMsg,setToastMsg]=useState({msg:'',type:'success'});
const [updateInfo,setUpdateInfo]=useState(null); const [updateInfo,setUpdateInfo]=useState(null);
const [showUpd,setShowUpd]=useState(false); const [showUpd,setShowUpd]=useState(false);

View File

@@ -2,43 +2,49 @@ import React from 'react'
import ReactDOM from 'react-dom/client' import ReactDOM from 'react-dom/client'
import App from './App.jsx' 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) { if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(reg => { navigator.serviceWorker.register('/sw.js').then(reg => {
// Wenn ein neuer SW wartet: sofort übernehmen lassen if (reg.waiting) reg.waiting.postMessage('SKIP_WAITING');
const takeOver = () => {
if (reg.waiting) {
reg.waiting.postMessage('SKIP_WAITING');
}
};
reg.addEventListener('updatefound', () => { reg.addEventListener('updatefound', () => {
const newWorker = reg.installing; const nw = reg.installing;
newWorker?.addEventListener('statechange', () => { nw?.addEventListener('statechange', () => {
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) { if (nw.state === 'installed' && navigator.serviceWorker.controller) {
takeOver(); nw.postMessage('SKIP_WAITING');
} }
}); });
}); });
// Wenn SW übernimmt → Seite neu laden
navigator.serviceWorker.addEventListener('controllerchange', () => { 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( ReactDOM.createRoot(document.getElementById('root')).render(