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 (
{item.comment}
{file.fileName}
{formatFileSize(file.fileSize)}