import React from "react"; import { useModal } from "../../hooks/useAuth"; import Modal from "../common/Modal"; import { FormProvider, useForm } from "react-hook-form"; import Label from "../common/Label"; import { zodResolver } from "@hookform/resolvers/zod"; import { defaultCollection, newCollection } from "./collectionSchema"; import SelectMultiple from "../common/SelectMultiple"; import { useProjectName } from "../../hooks/useProjects"; import DatePicker from "../common/DatePicker"; import { useCreateCollection } from "../../hooks/useCollections"; import { formatFileSize, localToUtc } from "../../utils/appUtils"; const NewCollection = ({ collectionId, onClose }) => { const { projectNames, projectLoading } = useProjectName(); const methods = useForm({ resolver: zodResolver(newCollection), defaultValues: defaultCollection, }); const { control, watch, register, setValue, handleSubmit, reset, formState: { errors }, } = methods; const { mutate: createNewCollection, isPending } = useCreateCollection(()=>{ handleClose() }); const files = watch("attachments"); const onFileChange = async (e) => { const newFiles = Array.from(e.target.files); if (newFiles.length === 0) return; const existingFiles = 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) => { if (collectionId) { const newFiles = files.map((file, i) => { if (file.documentId !== index) return file; return { ...file, isActive: false, }; }); setValue("attachments", newFiles, { shouldValidate: true }); } else { const newFiles = files.filter((_, i) => i !== index); setValue("attachments", newFiles, { shouldValidate: true }); } }; const onSubmit = (formData) => { const payload = { ...formData, clientSubmitedDate: localToUtc(formData.clientSubmitedDate), invoiceDate: localToUtc(formData.invoiceDate), exceptedPaymentDate: localToUtc(formData.exceptedPaymentDate), }; createNewCollection(payload); }; const handleClose = () => { reset(defaultCollection); onClose(); }; return (
New Collection
{errors.title && ( {errors.title.message} )}
{errors.invoiceId && ( {errors.invoiceId.message} )}
{errors.invoiceId && ( {errors.invoiceId.message} )}
{errors.invoiceDate && ( {errors.invoiceDate.message} )}
{errors.exceptedPaymentDate && ( {errors.exceptedPaymentDate.message} )}
{errors.exceptedPaymentDate && ( {errors.exceptedPaymentDate.message} )}
{errors.projectId && ( {errors.projectId.message} )}
{errors.basicAmount && ( {errors.basicAmount.message} )}
{errors.taxAmount && ( {errors.taxAmount.message} )}
{errors.description && ( {errors.description.message} )}
document.getElementById("attachments").click() } > Click to select or click here to browse (PDF, JPG, PNG, max 5MB) { onFileChange(e); e.target.value = ""; }} />
{errors.attachments && ( {errors.attachments.message} )} {files.length > 0 && (
{files .filter((file) => { if (collectionId) { return file.isActive; } return true; }) .map((file, idx) => (
{file.fileName} {file.fileSize ? formatFileSize(file.fileSize) : ""}
{ e.preventDefault(); removeFile(collectionId ? file.documentId : idx); }} >
))}
)} {Array.isArray(errors.attachments) && errors.attachments.map((fileError, index) => (
{ (fileError?.fileSize?.message || fileError?.contentType?.message || fileError?.base64Data?.message, fileError?.documentId?.message) }
))}
{" "}
); }; export default NewCollection;