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

116 lines
3.8 KiB
TypeScript
Raw Normal View History

2025-10-20 09:35:24 +00:00
import { PageHeader } from '@erp/core/components';
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";
2025-10-20 18:40:28 +00:00
import { useId, useMemo } from 'react';
2025-10-12 18:36:33 +00:00
import { FieldErrors, FormProvider } from "react-hook-form";
import { useNavigate } from "react-router-dom";
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";
2025-10-20 07:44:56 +00:00
import { InvoiceUpdateForm } from './invoice-update-form';
2025-10-12 18:36:33 +00:00
export type InvoiceUpdateCompProps = {
invoice: CustomerInvoice,
}
export const InvoiceUpdateComp = ({
invoice: invoiceData,
}: InvoiceUpdateCompProps) => {
const { t } = useTranslation();
const navigate = useNavigate();
2025-10-20 18:40:28 +00:00
const formId = useId();
2025-10-12 18:36:33 +00:00
2025-10-21 18:05:12 +00:00
const context = useInvoiceContext();
const { invoice_id } = context;
2025-10-12 18:36:33 +00:00
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,
2025-10-21 18:05:12 +00:00
disabled: !invoiceData || isUpdating,
2025-10-12 18:36:33 +00:00
});
const handleSubmit = (formData: InvoiceFormData) => {
2025-10-20 18:40:28 +00:00
console.log('Guardo factura')
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
{
2025-10-20 18:40:28 +00:00
onSuccess: () => showSuccessToast(t("pages.update.success.title"), t("pages.update.success.message")),
2025-10-12 18:36:33 +00:00
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
2025-10-20 10:26:29 +00:00
backIcon
title={`${t("pages.edit.title")} #${invoiceData.invoice_number}`}
description={t("pages.edit.description")}
2025-10-21 18:05:12 +00:00
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
2025-10-20 18:40:28 +00:00
submit={{ formId, variant: 'default', disabled: isPending, label: t("pages.edit.actions.save_draft") }}
cancel={{ formId, to: "/customer-invoices/list" }}
2025-10-12 18:36:33 +00:00
/>
2025-10-21 18:05:12 +00:00
</>}
2025-10-12 18:36:33 +00:00
/>
</AppHeader>
<AppContent>
<FormProvider {...form}>
2025-10-20 07:44:56 +00:00
<InvoiceUpdateForm
2025-10-20 18:40:28 +00:00
formId={formId}
2025-10-12 18:36:33 +00:00
onSubmit={handleSubmit}
onError={handleError}
2025-10-20 10:26:29 +00:00
className="bg-white rounded-xl border shadow-xl max-w-full"
2025-10-12 18:36:33 +00:00
/>
</FormProvider>
</AppContent>
</UnsavedChangesProvider>
);
};