fix: xREL badges – stabile ID-String dependency, kein cancelled-Flag Race
This commit is contained in:
@@ -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); }
|
||||
|
||||
Reference in New Issue
Block a user