From 36113f6c2ad839a0c47f5dfb9762598ac6687701 Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Sat, 4 Oct 2025 12:18:15 +0700 Subject: [PATCH] feat(FE-40,41): create UomForm component --- .../pages/master-data/uom/form/UomForm.tsx | 174 ++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 src/components/pages/master-data/uom/form/UomForm.tsx diff --git a/src/components/pages/master-data/uom/form/UomForm.tsx b/src/components/pages/master-data/uom/form/UomForm.tsx new file mode 100644 index 00000000..87cbdf34 --- /dev/null +++ b/src/components/pages/master-data/uom/form/UomForm.tsx @@ -0,0 +1,174 @@ +'use client'; + +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useRouter } from 'next/navigation'; +import { useFormik } from 'formik'; +import { toast } from 'react-hot-toast'; + +import { Icon } from '@iconify/react'; +import Button from '@/components/Button'; +import TextInput from '@/components/input/TextInput'; + +import { + UomFormSchema, + UomFormValues, + UpdateUomFormSchema, +} from '@/components/pages/master-data/uom/form/UomForm.schema'; +import { isResponseError } from '@/lib/api-helper'; +import { + CreateUomPayload, + Uom, + UpdateUomPayload, +} from '@/types/api/master-data/uom'; +import { UomApi } from '@/services/api/master-data'; + +interface UomFormProps { + type?: 'add' | 'edit' | 'detail'; + initialValues?: Uom; +} + +const UomForm = ({ type = 'add', initialValues }: UomFormProps) => { + const router = useRouter(); + + const [uomFormErrorMessage, setUomFormErrorMessage] = useState(''); + + const createUomHandler = useCallback( + async (payload: CreateUomPayload) => { + const createUomRes = await UomApi.create(payload); + + if (isResponseError(createUomRes)) { + setUomFormErrorMessage(createUomRes.message); + return; + } + + toast.success(createUomRes?.message as string); + router.push('/master-data/uom'); + }, + [router] + ); + + const updateUomHandler = useCallback( + async (uomId: number, payload: UpdateUomPayload) => { + const updateUomRes = await UomApi.update(uomId, payload); + + if (updateUomRes?.status === 'error') { + setUomFormErrorMessage(updateUomRes.message); + return; + } + + toast.success(updateUomRes?.message as string); + router.refresh(); + router.push('/master-data/uom'); + }, + [router] + ); + + const formikInitialValues = useMemo(() => { + return { + name: initialValues?.name ?? '', + }; + }, [initialValues]); + + const formik = useFormik({ + initialValues: formikInitialValues, + validationSchema: type === 'edit' ? UpdateUomFormSchema : UomFormSchema, + onSubmit: async (values) => { + setUomFormErrorMessage(''); + + const uomPayload: CreateUomPayload = { + name: values.name, + }; + + switch (type) { + case 'add': + await createUomHandler(uomPayload); + break; + + case 'edit': + await updateUomHandler(initialValues?.id as number, uomPayload); + break; + } + }, + }); + + const { setValues: formikSetValues } = formik; + + useEffect(() => { + formikSetValues(formikInitialValues); + }, [formikSetValues, formikInitialValues]); + + return ( +
+
+ + +

+ {type === 'add' && 'Tambah UOM'} + {type === 'edit' && 'Edit UOM'} + {type === 'detail' && 'Detail UOM'} +

+
+ +
+
+ +
+ + {type !== 'detail' && ( + <> +
+ + + +
+ + {uomFormErrorMessage && ( +
+ + {uomFormErrorMessage} +
+ )} + + )} +
+
+ ); +}; + +export default UomForm;