import { Plus, Upload, X } from 'lucide-react'; import { useEffect, useRef, useState, useCallback } from 'react'; import { uploadFile, UploadError, getTemporaryUrl } from '@/lib/upload'; type FileUploadMultipleItem = { key: string; url: string | null; }; type FileUploadMultipleProps = { value: FileUploadMultipleItem[]; onChange: (items: FileUploadMultipleItem[]) => void; maxItems?: number; folder?: string; accept?: string; onUploadingChange?: (uploading: boolean) => void; }; export function FileUploadMultiple({ value, onChange, maxItems = 5, folder, accept = 'image/jpeg,image/png,image/webp,image/gif', onUploadingChange, }: FileUploadMultipleProps) { const inputRef = useRef(null); const [error, setError] = useState(null); const [uploadingCount, setUploadingCount] = useState(0); const onUploadingChangeRef = useRef(onUploadingChange); useEffect(() => { onUploadingChangeRef.current = onUploadingChange; }); useEffect(() => { onUploadingChangeRef.current?.(uploadingCount > 0); }, [uploadingCount]); const handleFileChange = useCallback( async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) { return; } if (value.length >= maxItems) { setError(`Maksimal ${maxItems} gambar.`); return; } setError(null); setUploadingCount((prev) => prev + 1); try { const key = await uploadFile(file, folder); const newItem: FileUploadMultipleItem = { key, url: getTemporaryUrl(key), }; onChange([...value, newItem]); } catch (err) { const message = err instanceof UploadError ? err.message : 'Gagal mengunggah file.'; setError(message); } finally { setUploadingCount((prev) => prev - 1); if (inputRef.current) { inputRef.current.value = ''; } } }, [value, maxItems, folder, onChange], ); function handleRemove(index: number) { const updated = value.filter((_, i) => i !== index); onChange(updated); setError(null); } const canAdd = value.length < maxItems; return (
{value.map((item, index) => (
{`Foto {index === 0 && ( Utama )}
))} {canAdd && ( )}
{error && (

{error}

)}

{value.length}/{maxItems} foto ยท Klik foto pertama sebagai thumbnail utama

); }