From 209d6703ad2066ed96c25e6a4143eb166b61d5b3 Mon Sep 17 00:00:00 2001 From: rene Date: Sat, 9 May 2026 19:07:52 +0200 Subject: [PATCH] Fix: Media-Uploads direkt ans Netz (kein SW-Clone), SW _nocache-Bypass, Samsung-Dark-Mode-Hint, Update-Button fire-and-forget (SW by-v796) --- backend/main.py | 2 +- backend/static/css/design-system.css | 1 + backend/static/index.html | 3 +++ backend/static/js/app.js | 20 ++++++++++---------- backend/static/js/pages/settings.js | 9 +++++++++ backend/static/sw.js | 9 +++++++++ 6 files changed, 33 insertions(+), 11 deletions(-) diff --git a/backend/main.py b/backend/main.py index 60f5cda..0eb91e8 100644 --- a/backend/main.py +++ b/backend/main.py @@ -327,7 +327,7 @@ MEDIA_DIR = os.getenv("MEDIA_DIR", "/data/media") os.makedirs(MEDIA_DIR, exist_ok=True) app.mount("/media", StaticFiles(directory=MEDIA_DIR), name="media") -APP_VER = "791" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "796" # muss mit APP_VER in app.js übereinstimmen @app.get("/.well-known/assetlinks.json") async def assetlinks(): diff --git a/backend/static/css/design-system.css b/backend/static/css/design-system.css index 8683ab0..12bbb8f 100644 --- a/backend/static/css/design-system.css +++ b/backend/static/css/design-system.css @@ -8,6 +8,7 @@ 1. TOKENS — Farben, Abstände, Typografie, Schatten ------------------------------------------------------------ */ :root { + color-scheme: dark light; /* Primärfarben — Honig-Amber aus Ban Yaros Fell */ --c-primary: #C4843A; --c-primary-dark: #9E6520; diff --git a/backend/static/index.html b/backend/static/index.html index 3a46c5d..a6c708a 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -67,6 +67,9 @@ } + + + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index b4a14ab..b1783e7 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '791'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '796'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.5.0'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; // Cache-Bust-Parameter nach Update-Reload sofort entfernen @@ -976,7 +976,6 @@ const App = (() => { }); } - // ---------------------------------------------------------- // ---------------------------------------------------------- // VERSION-CHECK let _updateBannerShown = false; @@ -1045,18 +1044,19 @@ const App = (() => { banner.querySelector('#upd-btn-close').addEventListener('click', () => banner.remove()); - banner.querySelector('#upd-btn-reload').addEventListener('click', async () => { + banner.querySelector('#upd-btn-reload').addEventListener('click', () => { const btn = banner.querySelector('#upd-btn-reload'); btn.textContent = 'Lädt…'; btn.disabled = true; + // Cleanup fire-and-forget — kein await, nie blockieren try { - // Alle SW deregistrieren + alle Caches löschen → sauberer Neustart - const regs = await navigator.serviceWorker?.getRegistrations() ?? []; - await Promise.all(regs.map(r => r.unregister())); - const keys = await caches.keys(); - await Promise.all(keys.map(k => caches.delete(k))); - } catch { /* ignorieren */ } - location.replace('/?_t=' + Date.now()); + navigator.serviceWorker?.getRegistrations() + .then(regs => regs.forEach(r => r.unregister())).catch(() => {}); + caches.keys() + .then(keys => keys.forEach(k => caches.delete(k))).catch(() => {}); + } catch { } + // Sofort neu laden — nicht auf Cleanup warten + location.href = '/?_nocache=' + Date.now(); }); } diff --git a/backend/static/js/pages/settings.js b/backend/static/js/pages/settings.js index 0999352..8108667 100644 --- a/backend/static/js/pages/settings.js +++ b/backend/static/js/pages/settings.js @@ -329,6 +329,15 @@ window.Page_settings = (() => { + ${/SamsungBrowser/i.test(navigator.userAgent) ? ` +
+ Samsung Internet Tipp: + Für korrekte Farben im Samsung Browser unter + Einstellungen → Webseitenansicht → Dark Mode deaktivieren. +
` : ''}
diff --git a/backend/static/sw.js b/backend/static/sw.js index cb01677..2a89ce1 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -188,6 +188,12 @@ self.addEventListener('activate', event => { self.addEventListener('fetch', event => { const url = new URL(event.request.url); + // Force-Update: SW komplett umgehen → direkt vom Netzwerk + if (url.searchParams.has('_nocache')) { + event.respondWith(fetch(event.request.url.replace(/[?&]_nocache=[^&]*/,'') || '/', { cache: 'no-store' })); + return; + } + // API-Calls mit Timeout, Caching und Write-Queue if (url.pathname.startsWith('/api/')) { const method = event.request.method; @@ -224,6 +230,9 @@ self.addEventListener('fetch', event => { return; } + // Media-Uploads: direkt ans Netzwerk — kein Clone, kein Timeout, kein Queue + if (method === 'POST' && _isMediaUpload(event.request)) return; + // Mutationen (POST/PATCH/PUT/DELETE): mit Timeout, bei Offline → Queue if (['POST', 'PATCH', 'PUT', 'DELETE'].includes(method)) { event.respondWith((async () => {