import { useState, useRef } from "react"; import { FileText, UploadCloud, X } from "lucide-react"; import { LuSendHorizontal } from "react-icons/lu"; import SubmitStatusTable from "./SubmissionStatusTable"; import { useSubmission } from "../../../../hooks/useTasks"; import type { TaskSubmissionData } from "../../../../types/task.types"; interface TaskFormFileProps { taskId: string; deadline?: Date; initialSubmission?: TaskSubmissionData | null; } export default function TaskFormFile({ taskId, deadline, initialSubmission }: TaskFormFileProps) { const { submission, loading, submitFile, updateFile, remove } = useSubmission(taskId, initialSubmission); const [files, setFiles] = useState([]); const [isDragActive, setIsDragActive] = useState(false); const [isEditing, setIsEditing] = useState(false); const fileInputRef = useRef(null); const validateAndAddFiles = (selectedFiles: File[]) => { const allowedExtensions = ["pdf", "docx", "zip"]; const validFiles: File[] = []; selectedFiles.forEach((file) => { const ext = file.name.split(".").pop()?.toLowerCase(); if (ext && allowedExtensions.includes(ext)) { if (file.size <= 10 * 1024 * 1024) validFiles.push(file); else alert(`Ukuran file ${file.name} melebihi 10MB.`); } else { alert(`Format ${file.name} tidak didukung. Gunakan PDF, DOCX, atau ZIP.`); } }); if (validFiles.length > 0) setFiles((prev) => [...prev, ...validFiles]); }; const handleDrag = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragActive(e.type === "dragenter" || e.type === "dragover"); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragActive(false); if (e.dataTransfer.files.length > 0) validateAndAddFiles(Array.from(e.dataTransfer.files)); }; const removeFile = (index: number, e: React.MouseEvent) => { e.stopPropagation(); setFiles((prev) => prev.filter((_, i) => i !== index)); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (files.length === 0) { alert("Pilih file terlebih dahulu."); return; } const res = isEditing ? await updateFile(submission!.id, files[0]) : await submitFile(files[0]); if (res) { setIsEditing(false); setFiles([]); } }; const handleDelete = async () => { if (!confirm("Yakin ingin menghapus submission ini?")) return; const ok = await remove(submission!.id); if (ok) { setFiles([]); setIsEditing(false); } }; // Sudah ada submission dan tidak sedang edit → tampilkan status if (submission && !isEditing) { return ( setIsEditing(true)} onDelete={handleDelete} /> ); } return (
e.target.files && validateAndAddFiles(Array.from(e.target.files))} accept=".pdf,.docx,.zip" className="hidden" />
fileInputRef.current?.click()} className={`w-full min-h-[120px] border border-dashed rounded-xl p-4 bg-box-secondary cursor-pointer transition-all ${isDragActive ? "border-[#B30000] bg-red-50/40" : "border-foreground hover:border-gray-500" }`} > {files.length > 0 ? (
{files.map((file, index) => (
e.stopPropagation()}>
{file.name}
))}
) : (

Click to upload or drag & drop

PDF, DOCX, or ZIP (Max. 10MB)

)}
); }