import React, { useEffect, useMemo, useCallback, useState } from "react"; import { AppFormProvider, useAppForm } from "../../hooks/appHooks/useAppForm"; import { zodResolver } from "@hookform/resolvers/zod"; import { defaultPurchaseValue, PurchaseSchema, getStepFields, } from "./PurchaseSchema"; import PurchasePartyDetails from "./PurchasePartyDetails"; import PurchaseTransportDetails from "./PurchaseTransportDetails"; import PurchasePaymentDetails from "./PurchasePaymentDetails"; import { useCreatePurchaseInvoice, usePurchase, useUpdatePurchaseInvoice, } from "../../hooks/usePurchase"; import { error } from "pdf-lib"; const ManagePurchase = ({ onClose, purchaseId }) => { const { data } = usePurchase(purchaseId); const [activeTab, setActiveTab] = useState(0); const [completedTabs, setCompletedTabs] = useState([]); const stepsConfig = useMemo( () => [ { name: "Party Details", icon: "bx bx-user bx-md", subtitle: "Supplier & project information", component: , }, { name: "Invoice & Transport", icon: "bx bx-receipt bx-md", subtitle: "Invoice, eWay bill & transport info", component: , }, { name: "Payment Details", icon: "bx bx-credit-card bx-md", subtitle: "Amount, tax & due date", component: , }, ], [data, purchaseId] ); const purchaseOrder = useAppForm({ resolver: zodResolver(PurchaseSchema), defaultValues: defaultPurchaseValue, mode: "onChange", shouldUnregister: false, }); const { reset, formState } = purchaseOrder; useEffect(() => { if (!purchaseId || !data) return; reset({ ...data, projectId: data?.project?.id, organizationId: data?.organization?.id, supplierId: data?.supplier?.id, invoiceAttachmentTypeId: null, attachments: data?.attachments?.map((doc) => ({ fileName: doc.fileName, base64Data: null, contentType: doc.contentType, documentId: doc.documentId ?? null, invoiceAttachmentTypeId: doc.invoiceAttachmentType?.id ?? null, fileSize: 0, description: "", preSignedUrl: doc.preSignedUrl, isActive: doc.isActive ?? true, })) || [], }); setCompletedTabs([0, 1, 2]); }, [purchaseId, data, reset]); const handleNext = useCallback(async () => { const fields = getStepFields(activeTab); const valid = await purchaseOrder.trigger(fields); if (!valid) return; setCompletedTabs((prev) => [...new Set([...prev, activeTab])]); setActiveTab((prev) => Math.min(prev + 1, stepsConfig.length - 1)); }, [activeTab, purchaseOrder, stepsConfig.length]); const handlePrev = useCallback(() => { setActiveTab((prev) => Math.max(prev - 1, 0)); }, []); const generatePatchOps = useCallback( (formData) => { const { dirtyFields } = formState; return Object.keys(dirtyFields) .filter((key) => key !== "invoiceAttachmentTypeId") .map((key) => ({ operationType: 0, path: `/${key}`, op: "replace", value: formData[key], })); }, [formState] ); const { mutate: CreateInvoice, isPending } = useCreatePurchaseInvoice(() => { reset(); onClose(); }); const { mutate: updatePurchase, isPending: isUpdating } = useUpdatePurchaseInvoice(() => { reset(); onClose(); }); const onSubmit = useCallback( (formData) => { if (purchaseId) { const payload = generatePatchOps(formData); updatePurchase({ purchaseId, payload }); } else { CreateInvoice(formData); } }, [purchaseId, generatePatchOps, updatePurchase, CreateInvoice] ); return (
{/* --- Steps Header --- */}
{stepsConfig.map((step, index) => { const isActive = activeTab === index; const isCompleted = completedTabs.includes(index); return (
{index < stepsConfig.length - 1 && (
)}
); })}
{/* --- Form Content --- */}
{activeTab !== 2 && (
{stepsConfig[activeTab].component}
)} {activeTab === 2 && (
{stepsConfig[2].component}
)}
); }; export default ManagePurchase;