diff --git a/frontend/src/app.js b/frontend/src/app.js index 21ca376..9443491 100644 --- a/frontend/src/app.js +++ b/frontend/src/app.js @@ -1196,24 +1196,45 @@ mountBuildBadge(); /* ---------- Update-Detection (Client-seitig, einfach & zuverlässig) ---------- */ async function checkForUpdates(){ try { - const resp = await fetch('?' + new Date().getTime(), { cache: 'no-store' }); + /* Cache-Busting: HEAD-Request zuerst, um Last-Modified/ETag zu prüfen */ + const headResp = await fetch(location.href, { method: 'HEAD', cache: 'no-store' }); + if(!headResp.ok) throw new Error(`HTTP ${headResp.status}`); + + const lastModified = headResp.headers.get('last-modified'); + const etag = headResp.headers.get('etag'); + const storedETag = localStorage.getItem('werkbaum-etag'); + const storedModified = localStorage.getItem('werkbaum-last-modified'); + + /* Wenn ETag/Last-Modified gleich, ist nichts geändert */ + if((etag && etag === storedETag) || (lastModified && lastModified === storedModified)){ + logUpdate('✓ Alles aktuell'); + return; + } + + /* Neue Version: Vollständiges HTML fetchen */ + const resp = await fetch(location.href, { cache: 'no-store' }); if(!resp.ok) throw new Error(`HTTP ${resp.status}`); const html = await resp.text(); - /* Einfacher Check: Suche nach der Build-Badge (existiert nur in Nicht-Prod). - Wenn sich der Badge ändert oder der Content sich ändert, ist eine neue Version da. */ + + /* Prüfe auf echte Änderung via Content-Hash */ const stored = localStorage.getItem('werkbaum-html-hash'); - const hash = html.substring(0, 200) + html.substring(html.length - 200); /* First & last 200 chars */ - const isNewVersion = stored && stored !== hash; - if(isNewVersion){ + const hash = html.substring(0, 300) + html.substring(html.length - 300); + + if(stored && stored !== hash){ localStorage.setItem('werkbaum-update-available', 'true'); - logUpdate('✅ Neue Version erkannt!'); + logUpdate('✅ NEUE VERSION ERKANNT!'); if(!document.hidden) checkAndShowUpdateNotification(); - } else if(stored) { - logUpdate('✓ Alles aktuell'); + } else if(!stored) { + logUpdate('✓ Erste Prüfung – Hash gespeichert'); + } else { + logUpdate('✓ Headers änderten sich, aber Content gleich'); } + localStorage.setItem('werkbaum-html-hash', hash); + if(etag) localStorage.setItem('werkbaum-etag', etag); + if(lastModified) localStorage.setItem('werkbaum-last-modified', lastModified); } catch(err) { - logUpdate('⚠ Fehler: ' + (err.message || 'Unbekannt')); + logUpdate('⚠ ' + (err.message || 'Unbekannter Fehler')); } }