diff --git a/frontend/src/tools/media.jsx b/frontend/src/tools/media.jsx index 02e2e88..c3385ab 100644 --- a/frontend/src/tools/media.jsx +++ b/frontend/src/tools/media.jsx @@ -265,25 +265,24 @@ function KinoGrid({ onOpenModal }) { .finally(() => setLoading(false)); }, []); - // xREL-Badges: eigener Effect, startet wenn movies gefüllt sind + // xREL-Badges: startet einmalig wenn Filme geladen, ID-String als stable dependency + const movieIds = movies.map(m => m.id).join(','); useEffect(() => { - if (!movies.length) return; - let cancelled = false; + if (!movieIds) return; const moviesMeta = movies.map(m => ({ id: m.id, title: m.title, original_title: m.original_title })); + let active = true; (async () => { - for (let i = 0; i < moviesMeta.length; i += 1) { - if (cancelled) break; + for (const m of moviesMeta) { + if (!active) break; try { - const chunk = moviesMeta.slice(i, i + 1); - const result = await api('/tools/media/xrel-check', { method:'POST', body:{ movies: chunk } }); - if (cancelled) break; - const hits = Object.entries(result).filter(([,v]) => v).map(([k]) => Number(k)); - if (hits.length > 0) setXrelIds(prev => new Set([...prev, ...hits])); + const result = await api('/tools/media/xrel-check', { method:'POST', body:{ movies: [m] } }); + if (!active) break; + if (result[m.id]) setXrelIds(prev => new Set([...prev, m.id])); } catch (_) {} } })(); - return () => { cancelled = true; }; - }, [movies]); + return () => { active = false; }; + }, [movieIds]); const onToggle = async (movie, isFav) => { try { await toggleFav(movie, isFav); } catch (e) { alert(e.message); } @@ -334,25 +333,24 @@ function DemnächstGrid({ onOpenModal }) { .finally(() => setLoading(false)); }, []); + const groupIds = Object.values(groups).flat().map(m => m.id).join(','); useEffect(() => { + if (!groupIds) return; const allMovies = Object.values(groups).flat(); - if (!allMovies.length) return; - let cancelled = false; const moviesMeta = allMovies.map(m => ({ id: m.id, title: m.title, original_title: m.original_title })); + let active = true; (async () => { - for (let i = 0; i < moviesMeta.length; i += 1) { - if (cancelled) break; + for (const m of moviesMeta) { + if (!active) break; try { - const chunk = moviesMeta.slice(i, i + 1); - const result = await api('/tools/media/xrel-check', { method:'POST', body:{ movies: chunk } }); - if (cancelled) break; - const hits = Object.entries(result).filter(([,v]) => v).map(([k]) => Number(k)); - if (hits.length > 0) setXrelIds(prev => new Set([...prev, ...hits])); + const result = await api('/tools/media/xrel-check', { method:'POST', body:{ movies: [m] } }); + if (!active) break; + if (result[m.id]) setXrelIds(prev => new Set([...prev, m.id])); } catch (_) {} } })(); - return () => { cancelled = true; }; - }, [groups]); + return () => { active = false; }; + }, [groupIds]); const onToggle = async (movie, isFav) => { try { await toggleFav(movie, isFav); } catch (e) { alert(e.message); }