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));
}, []);
// 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); }