import React, { useEffect, useState } from "react"; import Avatar from "../common/Avatar"; import { useAppForm } from "../../hooks/appHooks/useAppForm"; import { zodResolver } from "@hookform/resolvers/zod"; import { JobCommentSchema } from "./ServiceProjectSchema"; import { useAddCommentJob, useJobComments, } from "../../hooks/useServiceProject"; import { ITEMS_PER_PAGE } from "../../utils/constants"; import { formatUTCToLocalTime } from "../../utils/dateUtils"; import Filelist from "../Expenses/Filelist"; import { formatFileSize, getIconByFileType } from "../../utils/appUtils"; const JobComments = ({ data }) => { const { register, handleSubmit, watch, reset, setValue, formState: { errors }, } = useAppForm({ resolver: zodResolver(JobCommentSchema), defaultValues: { comment: "", attachments: [] }, }); const { data: comments, fetchNextPage, hasNextPage, isFetchingNextPage, } = useJobComments(data?.id, ITEMS_PER_PAGE, 1); const jobComments = comments?.pages?.flatMap((p) => p?.data ?? []) ?? []; const { mutate: AddComment, isPending } = useAddCommentJob(() => reset()); const onSubmit = (formData) => { formData.jobTicketId = data?.id; AddComment(formData); }; useEffect(() => { document.documentElement.style.setProperty("--sticky-top", `-25px`); }, []); const files = watch("attachments"); const onFileChange = async (e) => { const newFiles = Array.from(e.target.files); if (newFiles.length === 0) return; const existingFiles = Array.isArray(watch("attachments")) ? watch("attachments") : []; const parsedFiles = await Promise.all( newFiles.map(async (file) => { const base64Data = await toBase64(file); return { fileName: file.name, base64Data, contentType: file.type, fileSize: file.size, description: "", isActive: true, }; }) ); const combinedFiles = [ ...existingFiles, ...parsedFiles.filter( (newFile) => !existingFiles?.some( (f) => f.fileName === newFile.fileName && f.fileSize === newFile.fileSize ) ), ]; setValue("attachments", combinedFiles, { shouldDirty: true, shouldValidate: true, }); }; const toBase64 = (file) => new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => resolve(reader.result.split(",")[1]); reader.onerror = (error) => reject(error); }); const removeFile = (index) => { const newFiles = files.filter((_, i) => i !== index); setValue("attachments", newFiles, { shouldValidate: true }); }; return (
Add Comment
{errors?.comment && ( {errors?.comment?.message} )}
{files?.length > 0 && ( )}
document.getElementById("attachments").click()} className="cursor-pointer" style={{ whiteSpace: "nowrap" }} > { onFileChange(e); e.target.value = ""; }} /> Add Attachment
{jobComments?.map((item) => { const user = item?.createdBy; return (
{user?.firstName} {user?.lastName} {formatUTCToLocalTime(item?.createdAt, true)}
{user?.jobRoleName}

{item.comment}

{item.attachments?.map((file) => (

{file.fileName}

{formatFileSize(file.fileSize)}
))}
); })}
); }; export default JobComments;