fix: xREL badges – stabile ID-String dependency, kein cancelled-Flag Race

This commit is contained in:
2026-06-10 22:20:09 +02:00
parent 69535562d6
commit bceaf49bfa

View File

@@ -265,25 +265,24 @@ function KinoGrid({ onOpenModal }) {
.finally(() => setLoading(false)); .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(() => { useEffect(() => {
if (!movies.length) return; if (!movieIds) return;
let cancelled = false;
const moviesMeta = movies.map(m => ({ id: m.id, title: m.title, original_title: m.original_title })); const moviesMeta = movies.map(m => ({ id: m.id, title: m.title, original_title: m.original_title }));
let active = true;
(async () => { (async () => {
for (let i = 0; i < moviesMeta.length; i += 1) { for (const m of moviesMeta) {
if (cancelled) break; if (!active) break;
try { try {
const chunk = moviesMeta.slice(i, i + 1); const result = await api('/tools/media/xrel-check', { method:'POST', body:{ movies: [m] } });
const result = await api('/tools/media/xrel-check', { method:'POST', body:{ movies: chunk } }); if (!active) break;
if (cancelled) break; if (result[m.id]) setXrelIds(prev => new Set([...prev, m.id]));
const hits = Object.entries(result).filter(([,v]) => v).map(([k]) => Number(k));
if (hits.length > 0) setXrelIds(prev => new Set([...prev, ...hits]));
} catch (_) {} } catch (_) {}
} }
})(); })();
return () => { cancelled = true; }; return () => { active = false; };
}, [movies]); }, [movieIds]);
const onToggle = async (movie, isFav) => { const onToggle = async (movie, isFav) => {
try { await toggleFav(movie, isFav); } catch (e) { alert(e.message); } try { await toggleFav(movie, isFav); } catch (e) { alert(e.message); }
@@ -334,25 +333,24 @@ function DemnächstGrid({ onOpenModal }) {
.finally(() => setLoading(false)); .finally(() => setLoading(false));
}, []); }, []);
const groupIds = Object.values(groups).flat().map(m => m.id).join(',');
useEffect(() => { useEffect(() => {
if (!groupIds) return;
const allMovies = Object.values(groups).flat(); 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 })); const moviesMeta = allMovies.map(m => ({ id: m.id, title: m.title, original_title: m.original_title }));
let active = true;
(async () => { (async () => {
for (let i = 0; i < moviesMeta.length; i += 1) { for (const m of moviesMeta) {
if (cancelled) break; if (!active) break;
try { try {
const chunk = moviesMeta.slice(i, i + 1); const result = await api('/tools/media/xrel-check', { method:'POST', body:{ movies: [m] } });
const result = await api('/tools/media/xrel-check', { method:'POST', body:{ movies: chunk } }); if (!active) break;
if (cancelled) break; if (result[m.id]) setXrelIds(prev => new Set([...prev, m.id]));
const hits = Object.entries(result).filter(([,v]) => v).map(([k]) => Number(k));
if (hits.length > 0) setXrelIds(prev => new Set([...prev, ...hits]));
} catch (_) {} } catch (_) {}
} }
})(); })();
return () => { cancelled = true; }; return () => { active = false; };
}, [groups]); }, [groupIds]);
const onToggle = async (movie, isFav) => { const onToggle = async (movie, isFav) => {
try { await toggleFav(movie, isFav); } catch (e) { alert(e.message); } try { await toggleFav(movie, isFav); } catch (e) { alert(e.message); }