'use client'; import { useState, useRef, useCallback } from 'react'; import { authFetch } from '@/lib/authFetch'; interface UploadResult { url: string; filename: string; originalName: string; size: number; mimeType: string; } interface FileUploadProps { onUpload: (result: UploadResult) => void; accept?: string; maxSize?: number; className?: string; } export function FileUpload({ onUpload, accept, maxSize = 50 * 1024 * 1024, className }: FileUploadProps) { const [uploading, setUploading] = useState(false); const [dragOver, setDragOver] = useState(false); const [error, setError] = useState(null); const inputRef = useRef(null); const handleUpload = useCallback(async (file: File) => { if (file.size > maxSize) { setError(`File too large (max ${Math.round(maxSize / 1024 / 1024)}MB)`); return; } setUploading(true); setError(null); try { const formData = new FormData(); formData.append('file', file); const res = await authFetch('/api/uploads', { method: 'POST', body: formData, }); if (!res.ok) { const data = await res.json(); throw new Error(data.error || 'Upload failed'); } const result: UploadResult = await res.json(); onUpload(result); } catch (err) { setError(err instanceof Error ? err.message : 'Upload failed'); } finally { setUploading(false); } }, [maxSize, onUpload]); const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault(); setDragOver(false); const file = e.dataTransfer.files[0]; if (file) handleUpload(file); }, [handleUpload]); const handleChange = useCallback((e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) handleUpload(file); }, [handleUpload]); return (
{ e.preventDefault(); setDragOver(true); }} onDragLeave={() => setDragOver(false)} onDrop={handleDrop} onClick={() => inputRef.current?.click()} className={`border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors ${ dragOver ? 'border-amber-500 bg-amber-500/10' : 'border-slate-700 hover:border-slate-600 bg-slate-800/30' }`} > {uploading ? (
Uploading...
) : (

Drop a file here or click to browse

Max {Math.round(maxSize / 1024 / 1024)}MB

)}
{error && (

{error}

)}
); }