import React, { useEffect, useState, useRef } from "react"; import moment from "moment"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { TasksRepository } from "../../repositories/TaskRepository"; import showToast from "../../services/toastService"; import Avatar from "../common/Avatar"; import { getBgClassFromHash } from "../../utils/projectStatus"; import { cacheData, getCachedData } from "../../slices/apiDataManager"; import ImagePreview from "../common/ImagePreview"; import { useAuditStatus, useSubmitTaskComment } from "../../hooks/useTasks"; import Label from "../common/Label"; const ReportTaskComments = ({ commentsData, closeModal, actionAllow = false, handleCloseAction, }) => { const defaultCompletedTask = Number(commentsData?.completedTask) || 0; const schema = actionAllow ? z.object({ comment: z.string().min(1, "Comment cannot be empty"), workStatus: z .string() .nonempty({ message: "Audit status is required" }) .default(""), approvedTask: z.preprocess( (val) => val === "" || val === null || Number.isNaN(val) ? undefined : Number(val), z .number({ required_error: "Completed Work must be a number", invalid_type_error: "Completed Work must be a number", }) .min(0, "Completed Work must be greater than 0") .max(defaultCompletedTask, { message: `Completed task cannot exceed: ${defaultCompletedTask}`, }) ), }) : z.object({ comment: z.string().min(1, "Comment cannot be empty"), }); const [loading, setloading] = useState(false); const [comments, setComment] = useState([]); const { status, loading: auditStatusLoading } = useAuditStatus(); const [ IsNeededSubTask, setIsNeededSubTask ] = useState( false ); const { submitComment, isPending } = useSubmitTaskComment({ actionAllow, onSuccessCallback: (data) => { setComment((prev) => [...prev, data]); reset(); if ( actionAllow ) { handleCloseAction(IsNeededSubTask); } }, }); const { watch, register, handleSubmit, setValue, formState: { errors }, reset, } = useForm({ resolver: zodResolver(schema), }); const containerRef = useRef(null); const firstRender = useRef(true); useEffect(() => { const taskList = getCachedData("taskList"); if (taskList && taskList.data && commentsData?.id) { const currentTask = taskList.data.find( (task) => task.id === commentsData.id ); if (currentTask && currentTask.comments) { setComment(currentTask.comments); } else { setComment(commentsData?.comments || []); } } else { setComment(commentsData?.comments || []); } firstRender.current = true; }, [commentsData]); useEffect(() => { if (!firstRender.current && containerRef.current) { containerRef.current.scrollTop = containerRef.current.scrollHeight; } else { firstRender.current = false; } }, [comments]); const onSubmit = (formData) => { submitComment({ data: formData, commentsData }); }; const selectedAuditStatus = watch("workStatus"); useEffect(() => { reset({ approvedTask: defaultCompletedTask || 0, }); }, [defaultCompletedTask]); const completed_Task = watch("approvedTask") return (
Team :
Attachment :
{fullName}
{moment.utc(data?.commentDate).local().fromNow()}
{data?.comment}
{data?.preSignedUrls?.length > 0 && (