"use client"; import { useState, useRef, useCallback } from "react"; import Button from "@/components/ui/Button"; export default function FileUploadBox({ projectId, onFileUploaded }) { const [uploading, setUploading] = useState(false); const [dragOver, setDragOver] = useState(false); const fileInputRef = useRef(null); const acceptedTypes = ".pdf,.doc,.docx,.xls,.xlsx,.jpg,.jpeg,.png,.gif,.txt,.dwg,.zip"; const uploadFiles = async (files) => { const validFiles = Array.from(files).filter(file => { const isValidType = acceptedTypes.split(',').some(type => file.name.toLowerCase().endsWith(type.replace('*', '')) ); const isValidSize = file.size <= 10 * 1024 * 1024; // 10MB limit return isValidType && isValidSize; }); if (validFiles.length === 0) { alert('No valid files selected (invalid type or size > 10MB)'); return; } if (validFiles.length !== files.length) { alert('Some files were skipped due to invalid type or size (max 10MB)'); } setUploading(true); const uploadPromises = validFiles.map(async (file) => { const formData = new FormData(); formData.append("file", file); formData.append("entityType", "project"); formData.append("entityId", projectId.toString()); try { const response = await fetch("/api/files", { method: "POST", body: formData, }); if (response.ok) { const uploadedFile = await response.json(); onFileUploaded?.(uploadedFile); return { success: true }; } else { const error = await response.json(); return { success: false, error: error.error || "Upload failed" }; } } catch (error) { return { success: false, error: "Network error" }; } }); const results = await Promise.all(uploadPromises); const failed = results.filter(r => !r.success); if (failed.length > 0) { alert(`Failed to upload ${failed.length} file(s)`); } setUploading(false); }; const handleInputChange = (e) => { if (e.target.files.length > 0) { uploadFiles(e.target.files); } e.target.value = ''; // Reset input }; const handleDrop = useCallback((e) => { e.preventDefault(); setDragOver(false); if (e.dataTransfer.files.length > 0) { uploadFiles(e.dataTransfer.files); } }, []); const handleDragOver = useCallback((e) => { e.preventDefault(); setDragOver(true); }, []); const handleDragLeave = useCallback((e) => { e.preventDefault(); setDragOver(false); }, []); const handleClick = () => { fileInputRef.current?.click(); }; return (