Fix: doppelte SW-Registrierung entfernt, Reload bei App-Fokus; Schnellzugriff gleichgross; Kalender ohne Komma

This commit is contained in:
2026-06-02 21:15:22 +02:00
parent fe899f5287
commit 9f8891395a
4 changed files with 24 additions and 26 deletions

View File

@@ -2,13 +2,12 @@ import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
// ── Build-Zeit Check ──────────────────────────────────────────────────────────
// Globale Variable synchron lesbar, kein dynamischer Import nötig
// ── Build-Zeit Check & Auto-Reload ───────────────────────────────────────────
window.__newBuildAvailable = false;
const STORED_KEY = 'dd_build_time';
async function checkBuildTime() {
async function checkBuildTime({ reloadIfChanged = false } = {}) {
try {
const r = await fetch('/api/build-time', { cache: 'no-store' });
const { buildTime } = await r.json();
@@ -18,33 +17,42 @@ async function checkBuildTime() {
} else if (stored !== buildTime) {
localStorage.setItem(STORED_KEY, buildTime);
window.__newBuildAvailable = true;
// Wenn explizit gewünscht (App-Fokus): sofort neu laden
if (reloadIfChanged) window.location.reload();
}
} catch {}
}
// Sofort beim Start prüfen, dann alle 60s
// Beim Start prüfen
checkBuildTime();
setInterval(checkBuildTime, 60_000);
// Alle 60s im Hintergrund
setInterval(() => checkBuildTime(), 60_000);
// Wenn die App/der Tab wieder in den Vordergrund kommt → prüfen und ggf. sofort neu laden
// Das deckt den Fall ab: PWA vom Homescreen öffnen
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
checkBuildTime({ reloadIfChanged: true });
}
});
window.addEventListener('focus', () => {
checkBuildTime({ reloadIfChanged: true });
});
// ── Service Worker ────────────────────────────────────────────────────────────
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(reg => {
if (reg.waiting) reg.waiting.postMessage('SKIP_WAITING');
reg.addEventListener('updatefound', () => {
const nw = reg.installing;
nw?.addEventListener('statechange', () => {
if (nw.state === 'installed') {
nw.postMessage('SKIP_WAITING');
}
if (nw.state === 'installed') nw.postMessage('SKIP_WAITING');
});
});
// Neuer SW aktiv → beim nächsten Seitenwechsel reloaden
navigator.serviceWorker.addEventListener('controllerchange', () => {
window.__newBuildAvailable = true;
});
});
}).catch(()=>{});
}
ReactDOM.createRoot(document.getElementById('root')).render(