Auto-Reload: nur beim Seitenwechsel, nicht mitten in der Arbeit
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user