/* global React, Tag, Icon, Eyebrow, Reveal */
const { useState, useMemo, useEffect, useRef } = React;
// Distribute photos across N columns, deterministically.
function distribute(items, cols) {
const out = Array.from({ length: cols }, () => []);
items.forEach((it, i) => out[i % cols].push(it));
return out;
}
function Gallery({ onOpenPhoto }) {
const sectionRef = useRef(null);
const [filter, setFilter] = useState('all');
const [inView, setInView] = useState(false);
const all = window.TB_PHOTOS.gallery;
const filtered = filter === 'all' ? all : all.filter((p) => p.genre === filter);
// 4 vertical columns of marquee photos. We duplicate the list inside each
// column so the loop is seamless. Columns alternate scroll direction.
const columns = useMemo(() => distribute(filtered, 4), [filtered]);
useEffect(() => {
if (!sectionRef.current) return;
const observer = new IntersectionObserver(([entry]) => setInView(entry.isIntersecting), { rootMargin: '180px 0px' });
observer.observe(sectionRef.current);
return () => observer.disconnect();
}, []);
return (
twenty-four months,
mostly walking.