import { useState, useEffect } from "react"; import { FaTasks, FaRegListAlt } from "react-icons/fa"; import { FaPlus, FaRegTrashCan, FaPencil } from "react-icons/fa6"; import { TbChecklist } from "react-icons/tb"; import DatePicker from "react-datepicker"; import "react-datepicker/dist/react-datepicker.css"; import { addSubtasks, deleteSubtasks, getSubtask, updateSubtask } from "src/api/SubTaskApi"; import { updateTodoTaskPartial } from "src/api/TaskApi"; import format from "date-fns/format"; export function TaskDetailModal({ title, description, tags, difficulty, challenge, importance, taskId, updateTask, completed, }) { const [isChallengeChecked, setChallengeChecked] = useState(challenge); const [isImportantChecked, setImportantChecked] = useState(importance); const [currentDifficulty, setCurrentDifficulty] = useState((difficulty - 1) * 25); const [selectedTags, setSelectedTags] = useState([]); const [dateStart, setDateStart] = useState(new Date()); const [dateEnd, setDateEnd] = useState(new Date()); const [startDateEnabled, setStartDateEnabled] = useState(false); const [endDateEnabled, setEndDateEnabled] = useState(false); const [isTaskComplete, setTaskComplete] = useState(completed); const [starteventValue, setStartEventValue] = useState("10:00 PM"); const [endeventValue, setEndEventValue] = useState("11:00 AM"); const [subtaskText, setSubtaskText] = useState(""); const [subtasks, setSubtasks] = useState([]); const [currentTitle, setTitle] = useState(title); const [isTitleEditing, setTitleEditing] = useState(false); const [isCheckboxChecked, setCheckboxChecked] = useState(false); const handleTitleChange = async () => { const data = { title: currentTitle, }; await updateTodoTaskPartial(taskId, data); setTitleEditing(false); }; const handleCheckboxChange = () => { setCheckboxChecked(!isCheckboxChecked); }; const handleStartEventTimeChange = async (timeValue) => { const formattedTime = convertToFormattedTime(timeValue); setStartEventValue(formattedTime); console.log(formattedTime); const data = { startTime: formattedTime, }; await updateTodoTaskPartial(taskId, data); }; const handleEndEventTimeChange = async (timeValue) => { const inputTime = event.target.value; // Validate the input time format if (!validateTimeFormat(inputTime)) { // Display an error message or handle invalid format console.error("Invalid time format. Please use HH:mm AM/PM"); return; } const formattedTime = convertToFormattedTime(timeValue); setEndEventValue(formattedTime); const data = { endTime: formattedTime, }; await updateTodoTaskPartial(taskId, data); }; const convertToFormattedTime = (timeValue) => { const formattedTime = format(timeValue, "HH:mm:ss.SSSX", { timeZone: "UTC" }); return formattedTime; }; const validateTimeFormat = (time) => { const timeFormatRegex = /^(0[1-9]|1[0-2]):[0-5][0-9] (AM|PM)$/i; return timeFormatRegex.test(time); }; const handleChallengeChange = async () => { setChallengeChecked(!isChallengeChecked); const data = { challenge: !isChallengeChecked, }; await updateTodoTaskPartial(taskId, data); }; const handleImportantChange = async () => { setImportantChecked(!isImportantChecked); const data = { important: !isImportantChecked, }; await updateTodoTaskPartial(taskId, data); }; const handleDifficultyChange = async (event) => { setCurrentDifficulty(parseInt(event.target.value, 10)); let diff = event.target.value / 25 + 1; const data = { difficulty: diff, }; await updateTodoTaskPartial(taskId, data); }; const handleTagChange = (tag) => { const isSelected = selectedTags.includes(tag); setSelectedTags(isSelected ? selectedTags.filter((selectedTag) => selectedTag !== tag) : [...selectedTags, tag]); ``; }; const handleStartDateValueChange = (date) => { if (!isTaskComplete) { setDateStart(date); const formattedStartDate = convertToFormattedDate(date); const data = { startTime: formattedStartDate, }; updateTodoTaskPartial(taskId, data); } }; const handleEndDateValueChange = (date) => { if (!isTaskComplete) { setDateEnd(date); const formattedEndDate = convertToFormattedDate(date); const data = { endTime: formattedEndDate, }; updateTodoTaskPartial(taskId, data); } }; const convertToFormattedDate = (dateValue) => { const formattedDate = format(dateValue, "yyyy-MM-dd'T'", { timeZone: "UTC" }); return formattedDate; }; const handleStartDateChange = () => { if (!isTaskComplete) { setStartDateEnabled(!startDateEnabled); } }; const handleEndDateChange = () => { if (!isTaskComplete) { setEndDateEnabled(!endDateEnabled); } }; const handleTaskCompleteChange = async () => { let completed = false; if (isTaskComplete) { setTaskComplete(false); completed = false; } else { setTaskComplete(true); completed = true; setStartDateEnabled(false); setEndDateEnabled(false); } const data = { completed: completed, }; await updateTodoTaskPartial(taskId, data); }; const addSubtask = async () => { try { if (subtaskText.trim() !== "") { const newSubtask = await addSubtasks(taskId, subtaskText.trim()); setSubtasks([...subtasks, newSubtask]); setSubtaskText(""); } } catch (error) { console.error("Error adding subtask:", error); } }; const toggleSubtaskCompletion = async (index) => { try { const updatedSubtasks = [...subtasks]; updatedSubtasks[index].completed = !updatedSubtasks[index].completed; await updateSubtask(updatedSubtasks[index].id, { completed: updatedSubtasks[index].completed }); setSubtasks(updatedSubtasks); } catch (error) { console.error("Error updating subtask:", error); } }; const deleteSubtask = async (index) => { try { await deleteSubtasks(subtasks[index].id); const updatedSubtasks = [...subtasks]; updatedSubtasks.splice(index, 1); setSubtasks(updatedSubtasks); } catch (error) { console.error("Error deleting subtask:", error); } }; const subtaskElements = subtasks.map((subtask, index) => (