'use client'; import { useState, useEffect, useCallback, useRef } from 'react'; import { Button } from '@/components/ui/Button'; import { Modal } from '@/components/ui/Modal'; import { listFiles, uploadFile, deleteFile, isImageMime, getThumbnailUrl, getFileDownloadUrl, type FileResponse, } from '@/lib/files'; interface VehicleImagesProps { vehicleId: string; } export function VehicleImages({ vehicleId }: VehicleImagesProps) { const [files, setFiles] = useState([]); const [loading, setLoading] = useState(true); const [uploading, setUploading] = useState(false); const [error, setError] = useState(null); const [selectedImage, setSelectedImage] = useState(null); const fileInputRef = useRef(null); const fetchFiles = useCallback(async () => { setLoading(true); setError(null); try { const data = await listFiles(vehicleId, 1, 100); const imageFiles = data.items.filter(f => isImageMime(f.mime_type)); setFiles(imageFiles); } catch (err: unknown) { const apiErr = err as { error?: { message?: string } }; setError(apiErr?.error?.message || 'Failed to load images'); } finally { setLoading(false); } }, [vehicleId]); useEffect(() => { fetchFiles(); }, [fetchFiles]); const handleUpload = async (e: React.ChangeEvent) => { const selectedFiles = e.target.files; if (!selectedFiles || selectedFiles.length === 0) return; setUploading(true); setError(null); try { for (let i = 0; i < selectedFiles.length; i++) { await uploadFile(vehicleId, selectedFiles[i]); } await fetchFiles(); } catch (err: unknown) { const apiErr = err as { error?: { message?: string } }; setError(apiErr?.error?.message || 'Failed to upload images'); } finally { setUploading(false); if (fileInputRef.current) { fileInputRef.current.value = ''; } } }; const handleDelete = async (fileId: string) => { if (!confirm('Delete this image?')) return; try { await deleteFile(vehicleId, fileId); setFiles(prev => prev.filter(f => f.id !== fileId)); if (selectedImage?.id === fileId) { setSelectedImage(null); } } catch (err: unknown) { const apiErr = err as { error?: { message?: string } }; setError(apiErr?.error?.message || 'Failed to delete image'); } }; return (

Bilder

{error && (
{error}
)} {loading ? (
Loading images...
) : files.length === 0 ? (
Keine Bilder vorhanden
) : (
{files.map(file => { const thumbUrl = getThumbnailUrl(file) || getFileDownloadUrl(vehicleId, file.id); return (
); })}
)} setSelectedImage(null)} title={selectedImage?.original_filename} > {selectedImage && (
{/* eslint-disable-next-line @next/next/no-img-element */} {selectedImage.original_filename}
)}
); }