Uecko_ERP/modules/customers/src/web/update/ui/pages/customer-update-page.tsx

103 lines
3.3 KiB
TypeScript
Raw Normal View History

2026-03-16 17:45:45 +00:00
import { ErrorAlert, NotFoundCard, PageHeader } from "@erp/core/components";
import { FormCommitButtonGroup, UnsavedChangesProvider } from "@erp/core/hooks";
2026-03-16 17:45:45 +00:00
import { AppContent, AppHeader, BackHistoryButton } from "@repo/rdx-ui/components";
2026-04-20 17:20:42 +00:00
import { Spinner } from "@repo/shadcn-ui/components";
2026-04-03 22:06:54 +00:00
import { FormProvider } from "react-hook-form";
2026-03-16 17:45:45 +00:00
import { useTranslation } from "../../../i18n";
2026-04-03 22:06:54 +00:00
import { useCustomerUpdatePageController } from "../../controllers";
2026-03-16 17:45:45 +00:00
import { CustomerEditorSkeleton } from "../components";
2026-04-04 16:58:32 +00:00
import { CustomerUpdateEditorForm } from "../editor";
2026-03-16 17:45:45 +00:00
export const CustomerUpdatePage = () => {
const { t } = useTranslation();
2026-04-03 22:06:54 +00:00
const { updateCtrl } = useCustomerUpdatePageController();
2026-04-20 17:20:42 +00:00
if (updateCtrl.isLoading) {
2026-03-16 17:45:45 +00:00
return <CustomerEditorSkeleton />;
}
2026-04-20 17:20:42 +00:00
if (updateCtrl.isLoadError) {
2026-03-16 17:45:45 +00:00
return (
2026-04-20 17:20:42 +00:00
<AppContent>
<ErrorAlert
message={
updateCtrl.loadError instanceof Error
? updateCtrl.loadError.message
: t("pages.update.loadErrorMsg", "Inténtalo de nuevo más tarde.")
}
title={t("pages.update.loadErrorTitle", "No se pudo cargar el cliente")}
/>
2026-03-16 17:45:45 +00:00
2026-04-20 17:20:42 +00:00
<div className="flex items-center justify-end">
<BackHistoryButton />
</div>
</AppContent>
2026-03-16 17:45:45 +00:00
);
}
2026-04-20 17:20:42 +00:00
if (!updateCtrl.customerData)
2026-03-16 17:45:45 +00:00
return (
2026-04-20 17:20:42 +00:00
<AppContent>
<NotFoundCard
message={t("pages.update.notFoundMsg", "Revisa el identificador o vuelve al listado.")}
title={t("pages.update.notFoundTitle", "Cliente no encontrado")}
/>
</AppContent>
2026-03-16 17:45:45 +00:00
);
return (
2026-04-20 17:20:42 +00:00
<UnsavedChangesProvider isDirty={updateCtrl.form.formState.isDirty}>
<AppHeader className="space-y-4 max-w-5xl mx-auto">
2026-03-16 17:45:45 +00:00
<PageHeader
backIcon
description={t("pages.update.description")}
rightSlot={
<FormCommitButtonGroup
2026-03-16 17:45:45 +00:00
cancel={{
2026-04-20 17:20:42 +00:00
formId: updateCtrl.formId,
2026-03-16 17:45:45 +00:00
to: "/customers/list",
2026-04-20 17:20:42 +00:00
disabled: updateCtrl.isUpdating,
2026-03-16 17:45:45 +00:00
}}
2026-04-20 17:20:42 +00:00
disabled={updateCtrl.isUpdating}
isLoading={updateCtrl.isUpdating}
onReset={updateCtrl.resetForm}
2026-03-16 17:45:45 +00:00
submit={{
2026-04-20 17:20:42 +00:00
formId: updateCtrl.formId,
disabled: updateCtrl.isUpdating,
2026-03-16 17:45:45 +00:00
}}
/>
}
title={t("pages.update.title")}
/>
</AppHeader>
2026-04-20 17:20:42 +00:00
<AppContent className="space-y-4 max-w-5xl mx-auto">
2026-03-16 17:45:45 +00:00
{/* Alerta de error de actualización (si ha fallado el último intento) */}
2026-04-20 17:20:42 +00:00
{updateCtrl.isUpdateError && (
2026-03-16 17:45:45 +00:00
<ErrorAlert
message={
2026-04-20 17:20:42 +00:00
(updateCtrl.updateError as Error)?.message ??
2026-03-16 17:45:45 +00:00
t("pages.update.errorMsg", "Revisa los datos e inténtalo de nuevo.")
}
title={t("pages.update.errorTitle", "No se pudo guardar los cambios")}
/>
)}
2026-04-20 17:20:42 +00:00
{updateCtrl.isLoading && <Spinner />}
{!updateCtrl.isLoading && (
<FormProvider {...updateCtrl.form}>
<CustomerUpdateEditorForm
formId={updateCtrl.formId}
isSubmitting={updateCtrl.isUpdating}
onReset={updateCtrl.resetForm}
onSubmit={updateCtrl.onSubmit}
/>
</FormProvider>
)}
2026-03-16 17:45:45 +00:00
</AppContent>
</UnsavedChangesProvider>
);
};