/** Bilder eines Gehges — Galerie-Raster + Upload + Löschen (wie der Tier-Fotos-Tab). */ import { useRef, useState, type FormEvent } from 'react' import { de } from '../strings/de' import { deleteEnclosurePhoto, listEnclosurePhotos, photoSrc, uploadEnclosurePhoto, } from '../api/enclosurePhotos' import { useApi, useMutation } from '../hooks/useApi' import { useToast } from './toast' export default function EnclosurePhotosSection({ enclosureId }: { enclosureId: string }) { const tp = de.pages.tierTabs.photos const toast = useToast() const photos = useApi(() => listEnclosurePhotos(enclosureId), [enclosureId]) const fileInput = useRef(null) const [caption, setCaption] = useState('') const [fileError, setFileError] = useState(null) const upload = useMutation((file: File) => uploadEnclosurePhoto(enclosureId, file, caption.trim() === '' ? null : caption.trim()), ) const removal = useMutation((photoId: string) => deleteEnclosurePhoto(photoId)) async function onUpload(e: FormEvent) { e.preventDefault() const file = fileInput.current?.files?.[0] if (!file) { setFileError(tp.validation.fileRequired) return } setFileError(null) const r = await upload.run(file) if (r.ok) { toast.success(de.common.saved) setCaption('') if (fileInput.current) fileInput.current.value = '' photos.reload() } else { toast.error(r.error) } } async function onDelete(photoId: string) { if (!window.confirm(tp.deleteConfirm)) return const r = await removal.run(photoId) if (r.ok) { toast.success(de.common.deleted) photos.reload() } else { toast.error(r.error) } } const items = photos.data ?? [] return (
{upload.error &&
{upload.error}
}
{photos.loading &&

{de.common.loading}

} {photos.error && (
{photos.error}
)} {removal.error &&
{removal.error}
} {!photos.loading && !photos.error && items.length === 0 &&

{tp.empty}

} {items.length > 0 && (
    {[...items] .sort((a, b) => a.sortOrder - b.sortOrder) .map((p) => (
  • {p.caption
    {p.caption ?? ''}
  • ))}
)}
) }