import { formHasAnyDirty, pickFormDirtyValues } from "@erp/core/client"; import { FormCommitButtonGroup, UnsavedChangesProvider, useHookForm, useUrlParamId, } from "@erp/core/hooks"; import { ErrorAlert, NotFoundCard } from "@erp/customers/components"; import { AppBreadcrumb, AppContent, AppHeader, BackHistoryButton } from "@repo/rdx-ui/components"; import { showErrorToast, showSuccessToast, showWarningToast } from "@repo/rdx-ui/helpers"; import { FilePenIcon } from "lucide-react"; import { FieldErrors, FormProvider } from "react-hook-form"; import { useNavigate } from "react-router-dom"; import { CustomerInvoiceEditForm, CustomerInvoiceEditorSkeleton, PageHeader, } from "../../components"; import { useCustomerInvoiceQuery, useUpdateCustomerInvoice } from "../../hooks"; import { useTranslation } from "../../i18n"; import { CustomerInvoiceFormData, CustomerInvoiceFormSchema, defaultCustomerInvoiceFormData } from "../../schemas"; export const CustomerInvoiceUpdatePage = () => { const invoiceId = useUrlParamId(); const { t } = useTranslation(); const navigate = useNavigate(); // 1) Estado de carga de la factura (query) const { data: invoiceData, isLoading: isLoadingInvoice, isError: isLoadError, error: loadError, } = useCustomerInvoiceQuery(invoiceId, { enabled: !!invoiceId }); // 2) Estado de actualización (mutación) const { mutate, isPending: isUpdating, isError: isUpdateError, error: updateError, } = useUpdateCustomerInvoice(); // 3) Form hook const form = useHookForm({ resolverSchema: CustomerInvoiceFormSchema, initialValues: (invoiceData as unknown as CustomerInvoiceFormData) ?? defaultCustomerInvoiceFormData, disabled: isUpdating, }); const handleSubmit = (formData: CustomerInvoiceFormData) => { const { dirtyFields } = form.formState; if (!formHasAnyDirty(dirtyFields)) { showWarningToast("No hay cambios para guardar"); return; } const patchData = pickFormDirtyValues(formData, dirtyFields); console.log(patchData); mutate( { id: invoiceId!, data: patchData }, { onSuccess(data) { showSuccessToast(t("pages.update.successTitle"), t("pages.update.successMsg")); // 🔹 limpiar el form e isDirty pasa a false form.reset(data as unknown as CustomerInvoiceFormData); }, onError(error) { showErrorToast(t("pages.update.errorTitle"), error.message); }, } ); }; const handleReset = () => form.reset((invoiceData as unknown as CustomerInvoiceFormData) ?? defaultCustomerInvoiceFormData); const handleBack = () => { navigate(-1); }; const handleError = (errors: FieldErrors) => { console.error("Errores en el formulario:", errors); // Aquí puedes manejar los errores, por ejemplo, mostrar un mensaje al usuario }; if (isLoadingInvoice) { return ; } if (isLoadError) { return ( <>
); } if (!invoiceData) return ( <> ); return ( {t("pages.edit.title")} {invoiceData.invoice_number} } description={t("pages.edit.description")} icon={} rightSlot={ } /> {/* Alerta de error de actualización (si ha fallado el último intento) */} {isUpdateError && ( )} ); };