import { zodResolver } from "@hookform/resolvers/zod"; import React, { useState } from "react"; import { useForm } from "react-hook-form"; import { ExpenseSchema } from "./ExpenseSchema"; import { formatFileSize } from "../../utils/appUtils"; const CreateExpense = () => { const { register, handleSubmit, watch, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(ExpenseSchema), defaultValues: { projectId: "", expensesTypeId: "", paymentModeId: "", paidById: "", transactionDate: "", transactionId: "", description: "", location: "", supplerName: "", amount: "", noOfPersons: "", statusId: "", billAttachments: [], }, }); const files = watch("billAttachments"); const onFileChange = async (e) => { const newFiles = Array.from(e.target.files); if (newFiles.length === 0) return; const existingFiles = watch("billAttachments") || []; 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: "", }; }) ); // Avoid duplicates based on file name + size const combinedFiles = [ ...existingFiles, ...parsedFiles.filter( (newFile) => !existingFiles.some( (f) => f.fileName === newFile.fileName && f.fileSize === newFile.fileSize ) ), ]; setValue("billAttachments", 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]); // base64 only, no prefix reader.onerror = (error) => reject(error); }); const removeFile = (index) => { const newFiles = files.filter((_, i) => i !== index); setValue("billAttachments", newFiles, { shouldValidate: true }); }; const onSubmit = (data) => { console.log("Form Data:", data); }; return (

Create New Expense

document.getElementById("billAttachments").click()} > Click to select or click here to browse { onFileChange(e); e.target.value = ""; // ← this line resets the file input }} />
{files.length > 0 && (
{files.map((file, idx) => (
{file.fileName} {formatFileSize(file.fileSize )}
removeFile(idx)}>
))}
)} {Array.isArray(errors.billAttachments) && errors.billAttachments.map((fileError, index) => (
{fileError?.fileSize?.message || fileError?.contentType?.message}
))}
{" "}
); }; export default CreateExpense;