From cf415d2b76bc856419d37fdb602f72f958a32006 Mon Sep 17 00:00:00 2001 From: Dicken Date: Sat, 30 May 2026 01:47:42 +0200 Subject: [PATCH] Auto-Reload: nur beim Seitenwechsel, nicht mitten in der Arbeit --- frontend/src/App.jsx | 6 ++++- frontend/src/main.jsx | 62 ++++++++++++++++++++++++------------------- 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 27c59cf..0fc7a50 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -2381,7 +2381,11 @@ export default function App() { return window.matchMedia('(display-mode: standalone)').matches && !sessionStorage.getItem('splash_shown'); }); 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 [updateInfo,setUpdateInfo]=useState(null); const [showUpd,setShowUpd]=useState(false); diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index 78e05c9..e8e9e9d 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -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(