'use client'; import { useState, useEffect, useCallback } from 'react'; import { listFiles, isImageMime, getThumbnailUrl, type FileResponse, } from '@/lib/files'; import { FilePreview } from './FilePreview'; interface FileGalleryProps { vehicleId: string; } export function FileGallery({ vehicleId }: FileGalleryProps) { const [images, setImages] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [selectedImage, setSelectedImage] = useState(null); const fetchImages = useCallback(async () => { setLoading(true); setError(null); try { // Fetch all files and filter for images const data = await listFiles(vehicleId, 1, 100); const imageFiles = data.items.filter((f) => isImageMime(f.mime_type)); setImages(imageFiles); } catch (err: unknown) { const apiErr = err as { error?: { message?: string } }; setError(apiErr?.error?.message || 'Failed to load images'); } finally { setLoading(false); } }, [vehicleId]); useEffect(() => { fetchImages(); }, [fetchImages]); if (loading && images.length === 0) { return (
Loading gallery...
); } if (error) { return (
{error}
); } if (images.length === 0) { return (
No images available for this vehicle.
); } return (
{images.map((image) => { const thumbUrl = getThumbnailUrl(image); return (
setSelectedImage(image)} data-testid={`gallery-item-${image.id}`} > {thumbUrl && ( {image.original_filename} )}
{image.original_filename}
); })}
{/* Full preview modal */} setSelectedImage(null)} />
); }