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"; import { customToast } from "../../../utils/showToast"; interface TaskFormFileProps { taskId: string; projectId?: string; deadline?: Date; initialSubmission?: TaskSubmissionData | null; isProjectActive?: boolean; } export default function TaskFormFile({ taskId, projectId, deadline, initialSubmission, isProjectActive = true }: TaskFormFileProps) { const { submission, loading, submitFile, updateFile, remove } = useSubmission(taskId, initialSubmission, projectId); 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"]; const validFiles: File[] = []; selectedFiles.forEach((file) => { const ext = file.name.split(".").pop()?.toLowerCase(); if (ext && allowedExtensions.includes(ext)) { if (file.size <= 5 * 1024 * 1024) { validFiles.push(file); } else { customToast.error( "File terlalu besar!", `File ${file.name} melebihi batas ukuran 5MB.` ); } } }); 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) { customToast.error( "File belum dipilih!", "Choose your file before submit it!" ); return; } const res = await customToast.promise( isEditing ? updateFile(submission!.id, files) : submitFile(files), { loading: isEditing ? "Memperbarui file..." : "Mengirim file...", success: (res) => ({ title: isEditing ? "File berhasil diperbarui!" : "File berhasil dikirim!", description: res?.message ?? (isEditing ? "Perubahan submission Anda telah disimpan." : "Link berhasil dikirim."), }), error: (err) => ({ title: isEditing ? "Gagal memperbarui file!" : "Gagal mengirim file!", description: err?.response?.data?.message || err?.message || "Terjadi kesalahan saat memproses file Anda.", }), } ); if (res) { setIsEditing(false); setFiles([]); } }; const handleDelete = async () => { try { const ok = await remove(submission!.id); if (ok) { setFiles([]); setIsEditing(false); customToast.success( "Submission berhasil dihapus!", ok.message ); } } catch (err: any) { customToast.error( "Gagal menghapus submission!", err?.response?.data?.message || "Terjadi kesalahan saat menghapus submission." ); } }; const handleCancelEdit = () => { setFiles([]); setIsEditing(false); }; if (submission && !isEditing) { return ( setIsEditing(true)} onDelete={handleDelete} disabled={!isProjectActive} /> ); } return (
e.target.files && validateAndAddFiles(Array.from(e.target.files))} accept=".pdf" 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}
))}
) : isEditing && submission?.files && submission.files.length > 0 ? (
{submission.files.map((f) => (
{f.original_name}
))}

Upload ulang files yang akan diganti ke dalam submissions, atau klik batal

) : (

Click to upload or drag & drop

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

)}
{isEditing && ( )}
); }