Uecko_ERP/modules/customer-invoices/src/web/pages/update/invoice-update-comp.tsx

117 lines
3.7 KiB
TypeScript
Raw Normal View History

2025-10-12 18:36:33 +00:00
import {
UnsavedChangesProvider,
2025-10-19 19:04:16 +00:00
UpdateCommitButtonGroup,
2025-10-12 18:36:33 +00:00
useHookForm
} from "@erp/core/hooks";
2025-10-19 19:04:16 +00:00
import { AppContent, AppHeader } from "@repo/rdx-ui/components";
2025-10-12 18:36:33 +00:00
import { showErrorToast, showSuccessToast } from "@repo/rdx-ui/helpers";
import { useMemo } from 'react';
import { FieldErrors, FormProvider } from "react-hook-form";
import { useNavigate } from "react-router-dom";
import {
2025-10-15 09:40:22 +00:00
InvoiceEditForm,
2025-10-12 18:36:33 +00:00
PageHeader
} from "../../components";
import { useInvoiceContext } from '../../context';
2025-10-13 17:41:21 +00:00
import { useUpdateCustomerInvoice } from "../../hooks";
2025-10-12 18:36:33 +00:00
import { useTranslation } from "../../i18n";
import {
CustomerInvoice,
InvoiceFormData,
InvoiceFormSchema,
defaultCustomerInvoiceFormData,
invoiceDtoToFormAdapter
} from "../../schemas";
export type InvoiceUpdateCompProps = {
invoice: CustomerInvoice,
}
export const InvoiceUpdateComp = ({
invoice: invoiceData,
}: InvoiceUpdateCompProps) => {
const { t } = useTranslation();
const navigate = useNavigate();
const { invoice_id } = useInvoiceContext(); // ahora disponible desde el inicio
const context = useInvoiceContext();
const isPending = !invoiceData;
const {
mutate,
isPending: isUpdating,
isError: isUpdateError,
error: updateError,
} = useUpdateCustomerInvoice();
const initialValues = useMemo(() => {
return invoiceData
? invoiceDtoToFormAdapter.fromDto(invoiceData, context)
: defaultCustomerInvoiceFormData
2025-10-16 17:59:13 +00:00
}, [invoiceData, context]);
2025-10-12 18:36:33 +00:00
const form = useHookForm<InvoiceFormData>({
resolverSchema: InvoiceFormSchema,
initialValues,
disabled: !invoiceData || isUpdating
});
const handleSubmit = (formData: InvoiceFormData) => {
2025-10-18 19:57:52 +00:00
const dto = invoiceDtoToFormAdapter.toDto(formData, context)
console.log("dto => ", dto);
2025-10-12 18:36:33 +00:00
mutate(
2025-10-18 19:57:52 +00:00
{ id: invoice_id, data: dto as Partial<InvoiceFormData> },
2025-10-12 18:36:33 +00:00
{
onSuccess: () => showSuccessToast(t("pages.update.successTitle")),
onError: (e) => showErrorToast(t("pages.update.errorTitle"), e.message),
}
);
};
const handleReset = () =>
form.reset((invoiceData as unknown as InvoiceFormData) ?? defaultCustomerInvoiceFormData);
const handleBack = () => {
navigate(-1);
};
const handleError = (errors: FieldErrors<InvoiceFormData>) => {
console.error("Errores en el formulario:", errors);
// Aquí puedes manejar los errores, por ejemplo, mostrar un mensaje al usuario
};
return (
<UnsavedChangesProvider isDirty={form.formState.isDirty}>
<AppHeader>
<PageHeader
title={`${t("pages.edit.title")} ${invoiceData.invoice_number}`}
rightSlot={
2025-10-19 19:04:16 +00:00
<UpdateCommitButtonGroup
2025-10-12 18:36:33 +00:00
isLoading={isPending}
2025-10-19 19:04:16 +00:00
submit={{ formId: "invoice-update-form", variant: 'default', disabled: isPending, label: t("pages.edit.actions.save_draft") }}
2025-10-12 18:36:33 +00:00
cancel={{ to: "/customer-invoices/list" }}
onBack={() => navigate(-1)}
/>
2025-10-19 19:04:16 +00:00
2025-10-12 18:36:33 +00:00
}
/>
</AppHeader>
<AppContent>
<FormProvider {...form}>
2025-10-15 09:40:22 +00:00
<InvoiceEditForm
2025-10-12 18:36:33 +00:00
formId="invoice-update-form"
onSubmit={handleSubmit}
onError={handleError}
className="max-w-full"
/>
</FormProvider>
</AppContent>
</UnsavedChangesProvider>
);
};