From 0c53234a149fb5d9a07be9d792fd45cf053f08ab Mon Sep 17 00:00:00 2001 From: Dicken Date: Thu, 18 Jun 2026 18:20:32 +0200 Subject: [PATCH] fix: setUnackedFavs als Prop, user-notify beim Favoriten-Tab, Admin-Badge in Liste --- backend/src/tools/media/routes.js | 8 +++++++- frontend/src/App.jsx | 6 +++--- frontend/src/tools/media.jsx | 23 ++++++++++++++++++----- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/backend/src/tools/media/routes.js b/backend/src/tools/media/routes.js index 08ba547..0d9b67b 100644 --- a/backend/src/tools/media/routes.js +++ b/backend/src/tools/media/routes.js @@ -503,6 +503,12 @@ router.get('/favorites/all', authenticate, requireAdmin, (req, res) => { res.json(favs); }); +// POST /favorites/user-notify – User hat quittierte Favoriten gesehen +router.post('/favorites/user-notify', authenticate, (req, res) => { + db.prepare('UPDATE movie_favorites SET user_notified=1 WHERE user_id=? AND acknowledged=1 AND user_notified=0').run(req.user.id); + res.json({ ok: true }); +}); + // GET /favorites/unacked – unquittierte Zählung (Admin: neue Favoriten; User: quittierte aber unbestätigte) router.get('/favorites/unacked', authenticate, (req, res) => { const isAdmin = req.user.role === 'admin'; @@ -511,7 +517,7 @@ router.get('/favorites/unacked', authenticate, (req, res) => { res.json({ count: count.n, isAdmin: true }); } else { // User: Favoriten die vom Admin quittiert wurden aber User noch nicht gesehen hat - const count = db.prepare('SELECT COUNT(*) as n FROM movie_favorites WHERE user_id=? AND acknowledged=1').get(req.user.id); + const count = db.prepare('SELECT COUNT(*) as n FROM movie_favorites WHERE user_id=? AND acknowledged=1 AND user_notified=0').get(req.user.id); res.json({ count: count.n, isAdmin: false }); } }); diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 51225d2..38d3a83 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1903,7 +1903,7 @@ function GlobalSearch({ setActive, setDevToolsNav, mobile }) { } -function Dashboard({ toast, mobile, setActive, setDevToolsNav, unreadMsgs=0, unreadBoard=0, unreadPromoted=0, onBoardRead, unreadChangelog=0, onChangelogRead, unackedFavs, user }) { +function Dashboard({ toast, mobile, setActive, setDevToolsNav, unreadMsgs=0, unreadBoard=0, unreadPromoted=0, onBoardRead, unreadChangelog=0, onChangelogRead, unackedFavs, onClearUnackedFavs, user }) { const [now, setNow] = useState(new Date()); const [showBoard, setShowBoard] = useState(false); const [showChangelog, setShowChangelog] = useState(false); @@ -1988,7 +1988,7 @@ function Dashboard({ toast, mobile, setActive, setDevToolsNav, unreadMsgs=0, unr setActive('media'); setTimeout(()=>window.dispatchEvent(new CustomEvent('media-navigate',{detail:'favoriten'})),200); } else { - setUnackedFavs({count:0,isAdmin:false}); + onClearUnackedFavs?.(); setActive('media'); setTimeout(()=>window.dispatchEvent(new CustomEvent('media-navigate',{detail:'favoriten'})),200); } @@ -3734,7 +3734,7 @@ export default function App() { unreadMsgs={unreadMsgs}/> )}
- {active==='dashboard' && { setUnreadBoard(0); setUnreadPromoted(0); }} unreadChangelog={unreadChangelog} onChangelogRead={()=>setUnreadChangelog(0)} unackedFavs={unackedFavs} user={user}/>} + {active==='dashboard' && { setUnreadBoard(0); setUnreadPromoted(0); }} unreadChangelog={unreadChangelog} onChangelogRead={()=>setUnreadChangelog(0)} unackedFavs={unackedFavs} onClearUnackedFavs={()=>setUnackedFavs({count:0,isAdmin:false})} user={user}/>} {active==='admin' && } {activeTool && setMediaInitTab(null)} : {})}/>}
diff --git a/frontend/src/tools/media.jsx b/frontend/src/tools/media.jsx index 9f17179..afd068a 100644 --- a/frontend/src/tools/media.jsx +++ b/frontend/src/tools/media.jsx @@ -48,6 +48,13 @@ export default function Media({ toast, mobile, initTab, onInitTabConsumed }) { window.addEventListener('media-navigate', handler); return () => window.removeEventListener('media-navigate', handler); }, []); + + // Wenn Favoriten-Tab geöffnet wird → user-notify (Badge verschwindet) + useEffect(() => { + if (activeTool === 'favoriten') { + api('/tools/media/favorites/user-notify', { method:'POST', body:{} }).catch(()=>{}); + } + }, [activeTool]); const [modal, setModal] = useState(null); // { id, media_type } const [xrelIds, setXrelIds] = useState(new Set()); // tmdb_ids mit bekannten Releases @@ -627,11 +634,17 @@ function FavoritenKalender({ onOpenModal }) { ← Meine Favoriten {unacked > 0 && ( - + <> + + ⚠ {unacked} unquittiert + + + )} {!allFavs.length