${v.city || '—'} · ${fmt((v.up||0)-(v.down||0))} głosów · ${fmt(v.views)} wyśw.
OBEJRZYJ NAGRANIE →
`, { maxWidth: 260, minWidth: 240 });
markersRef.current.push(m);
});
}, [filter, videos]);
useEffect(() => {
const handler = (e) => {
const a = e.target.closest('.popup-link');
if (a) { e.preventDefault(); onOpen(a.dataset.vid); }
};
document.addEventListener('click', handler);
return () => document.removeEventListener('click', handler);
}, [onOpen]);
return ;
}
function Home({ setRoute, theme }) {
const [filter, setFilter] = useState('all');
const [videos, setVideos] = useState([]);
const [top, setTop] = useState([]);
const [loading, setLoading] = useState(true);
const [stats, setStats] = useState({ videos: 0, users: 0, views: 0 });
useEffect(() => {
let alive = true;
(async () => {
try {
const [all, t, s] = await Promise.all([
MZ.listVideos({ limit: 200 }),
MZ.topVideos(8),
MZ.stats(),
]);
if (!alive) return;
// If the very first call came back empty but the stats endpoint reports
// videos exist, retry once after a small delay — race with auth init.
if ((!all || all.length === 0) && s && s.videos > 0) {
await new Promise(r => setTimeout(r, 350));
if (!alive) return;
const retry = await MZ.listVideos({ limit: 200 });
if (!alive) return;
setVideos(retry || []);
const totalViews = (retry || []).reduce((a,v) => a + (v.views||0), 0);
setStats({ videos: s.videos, users: s.users, views: totalViews });
} else {
setVideos(all || []);
const totalViews = (all || []).reduce((a,v) => a + (v.views||0), 0);
setStats({ videos: s.videos, users: s.users, views: totalViews });
}
setTop(t || []);
} catch (e) { console.error(e); }
if (alive) setLoading(false);
})();
return () => { alive = false; };
}, []);
const latest = videos.slice(0, 8);
const open = (id) => setRoute({ name: 'video', id });
return (
{loading ? 'Ładowanie nagrań…' : (stats.videos === 0 ? 'Jeszcze nie dodano żadnego nagrania.' : `${stats.videos} ${stats.videos === 1 ? 'nagranie' : 'nagrań'} zebranych i przypiętych do miejsc zdarzeń.`)}
Społecznościowe archiwum nagrań z wideorejestratorów z Polski — wypadki, niebezpieczne sytuacje, pogoda i zwierzęta na drodze. Przeglądaj według lokalizacji.