import React from 'react'; import { Page } from './_util'; import { useParams } from 'react-router-dom'; import { usePollGalleryDelta } from '../polling/usePollGalleryDelta'; import { Card, CardContent } from '@/components/ui/card'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Button } from '@/components/ui/button'; import FiltersBar, { type GalleryFilter } from '../components/FiltersBar'; import { Link } from 'react-router-dom'; import { Heart } from 'lucide-react'; import { likePhoto } from '../services/photosApi'; export default function GalleryPage() { const { slug } = useParams(); const { photos, loading, newCount, acknowledgeNew } = usePollGalleryDelta(slug!); const [filter, setFilter] = React.useState('latest'); const myPhotoIds = React.useMemo(() => { try { const raw = localStorage.getItem('my-photo-ids'); return new Set(raw ? JSON.parse(raw) : []); } catch { return new Set(); } }, []); const list = React.useMemo(() => { let arr = photos.slice(); if (filter === 'popular') { arr.sort((a: any, b: any) => (b.likes_count ?? 0) - (a.likes_count ?? 0)); } else if (filter === 'mine') { arr = arr.filter((p: any) => myPhotoIds.has(p.id)); } else { arr.sort((a: any, b: any) => new Date(b.created_at ?? 0).getTime() - new Date(a.created_at ?? 0).getTime()); } return arr; }, [photos, filter, myPhotoIds]); const [liked, setLiked] = React.useState>(new Set()); const [counts, setCounts] = React.useState>({}); async function onLike(id: number) { if (liked.has(id)) return; setLiked(new Set(liked).add(id)); try { const c = await likePhoto(id); setCounts((m) => ({ ...m, [id]: c })); // keep a simple record of liked items try { const raw = localStorage.getItem('liked-photo-ids'); const arr: number[] = raw ? JSON.parse(raw) : []; if (!arr.includes(id)) localStorage.setItem('liked-photo-ids', JSON.stringify([...arr, id])); } catch {} } catch { const s = new Set(liked); s.delete(id); setLiked(s); } } return ( {newCount > 0 && ( {newCount} neue Fotos verfügbar.{' '} )} {loading &&

Lade…

}
{list.map((p) => ( Foto
{counts[p.id] ?? p.likes_count ?? 0}
))}
); }