import { useRef, useEffect, useState } from "react"; import { X } from "lucide-react"; import { LuSave } from "react-icons/lu"; import { useUpdateTask } from "../../../../hooks/useTasks"; import type { ProjectTask, SubmissionType, UpdateTaskPayload } from "../../../../types/task.types"; import { customToast } from "../../../utils/showToast"; interface EditTaskModalProps { isOpen: boolean; onClose: () => void; task: ProjectTask; onSuccess: (updatedTask: ProjectTask) => void; } export default function EditSubmissionModal({ isOpen, onClose, task, onSuccess, }: EditTaskModalProps) { const dialogRef = useRef(null); const { update, loading, error } = useUpdateTask(); const [taskTitle, setTaskTitle] = useState(task.title); const [description, setDescription] = useState(task.description); const [deadlineDate, setDeadlineDate] = useState( task.deadline_at ? task.deadline_at.split("T")[0] : "" ); const [specificTime, setSpecificTime] = useState( task.deadline_at ? task.deadline_at.split("T")[1]?.slice(0, 5) ?? "" : "" ); const [submissionType, setSubmissionType] = useState(task.submission_type); const today = new Date().toISOString().split("T")[0]; const isDeadlinePast = !!deadlineDate && deadlineDate < today; useEffect(() => { setTaskTitle(task.title); setDescription(task.description); setDeadlineDate(task.deadline_at ? task.deadline_at.split("T")[0] : ""); setSpecificTime(task.deadline_at ? task.deadline_at.split("T")[1]?.slice(0, 5) ?? "" : ""); setSubmissionType(task.submission_type); }, [task]); useEffect(() => { const dialog = dialogRef.current; if (!dialog) return; if (isOpen) { dialog.showModal(); document.body.style.overflow = "hidden"; } else { dialog.close(); document.body.style.overflow = "unset"; } const handleCancel = (e: Event) => { e.preventDefault(); }; dialog.addEventListener("cancel", handleCancel); return () => { dialog.removeEventListener("cancel", handleCancel); document.body.style.overflow = "unset"; }; }, [isOpen, onClose]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const payload: UpdateTaskPayload = {}; if (taskTitle.trim() !== task.title) payload.title = taskTitle.trim(); if (description !== task.description) payload.description = description; if (deadlineDate !== task.deadline_at.split("T")[0]) payload.deadline_date = deadlineDate; if (specificTime !== (task.deadline_at.split("T")[1]?.slice(0, 5) ?? "")) payload.specific_time = specificTime; if (submissionType !== task.submission_type) payload.submission_type = submissionType; if (Object.keys(payload).length === 0) { onClose(); return; } const result = await update(task.id, payload, String(task.id_project)); if (result.data) { customToast.success("Task diperbarui", result.message); onSuccess(result.data); onClose(); } else { customToast.error("Gagal", result.message); } }; return ( {/* Header */}

Edit Task

{/* Form Body */}
{/* Error Message */} {error && (
{error}
)} {/* Title */}
setTaskTitle(e.target.value)} className="w-full px-3 py-2.5 bg-white border border-gray-200 rounded-lg text-sm font-medium text-gray-800 placeholder-gray-400 focus:outline-none focus:border-[#B30000] focus:ring-1 focus:ring-[#B30000]" />
{/* Description */}