import { useCallback, useEffect, useState } from 'react'; import { get } from '../lib/api'; import type { SitePhoto } from '../lib/types'; import { PhotoCard } from '../components/PhotoCard'; import { Empty } from '../components/Empty'; const PAGE = 24; export function Feed() { const [items, setItems] = useState([]); const [loading, setLoading] = useState(false); const [done, setDone] = useState(false); const [err, setErr] = useState(null); const loadMore = useCallback(async () => { if (loading || done) return; setLoading(true); setErr(null); try { const next = await get(`/feed?take=${PAGE}&skip=${items.length}`); setItems(prev => [...prev, ...next]); if (next.length < PAGE) setDone(true); } catch (e) { setErr((e as Error).message); } finally { setLoading(false); } }, [items.length, loading, done]); // Initial load. useEffect(() => { void loadMore(); /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, []); return (

Photo feed

Pictures from across the server, newest first.

{err && (
{err}
)} {items.length === 0 && !loading && !err && ( )} {items.length > 0 && (
{items.map(p => )}
)}
{!done ? ( ) : items.length > 0 && (
You've reached the end.
)}
); }