diff --git a/src/components/pages/master-data/area/form/AreaForm.tsx b/src/components/pages/master-data/area/form/AreaForm.tsx new file mode 100644 index 00000000..6cdb4c5d --- /dev/null +++ b/src/components/pages/master-data/area/form/AreaForm.tsx @@ -0,0 +1,236 @@ +'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 { useModal } from '@/components/Modal'; +import ConfirmationModal from '@/components/modal/ConfirmationModal'; + +import { + AreaFormSchema, + AreaFormValues, + UpdateAreaFormSchema, +} from '@/components/pages/master-data/area/form/AreaForm.schema'; +import { isResponseError } from '@/lib/api-helper'; +import { + Area, + CreateAreaPayload, + UpdateAreaPayload, +} from '@/types/api/master-data/area'; +import { AreaApi } from '@/services/api/master-data'; +import { cn } from '@/lib/helper'; + +interface AreaFormProps { + type?: 'add' | 'edit' | 'detail'; + initialValues?: Area; +} + +const AreaForm = ({ type = 'add', initialValues }: AreaFormProps) => { + const router = useRouter(); + const deleteModal = useModal(); + + const [areaFormErrorMessage, setAreaFormErrorMessage] = useState(''); + const [isDeleteLoading, setIsDeleteLoading] = useState(false); + + const createAreaHandler = useCallback( + async (payload: CreateAreaPayload) => { + const createAreaRes = await AreaApi.create(payload); + + if (isResponseError(createAreaRes)) { + setAreaFormErrorMessage(createAreaRes.message); + return; + } + + toast.success(createAreaRes?.message as string); + router.push('/master-data/area'); + }, + [router] + ); + + const updateAreaHandler = useCallback( + async (areaId: number, payload: UpdateAreaPayload) => { + const updateAreaRes = await AreaApi.update(areaId, payload); + + if (updateAreaRes?.status === 'error') { + setAreaFormErrorMessage(updateAreaRes.message); + return; + } + + toast.success(updateAreaRes?.message as string); + router.refresh(); + router.push('/master-data/area'); + }, + [router] + ); + + const formikInitialValues = useMemo(() => { + return { + name: initialValues?.name ?? '', + }; + }, [initialValues]); + + const formik = useFormik({ + initialValues: formikInitialValues, + validationSchema: type === 'edit' ? UpdateAreaFormSchema : AreaFormSchema, + onSubmit: async (values) => { + setAreaFormErrorMessage(''); + + const areaPayload: CreateAreaPayload = { + name: values.name, + }; + + switch (type) { + case 'add': + await createAreaHandler(areaPayload); + break; + + case 'edit': + await updateAreaHandler(initialValues?.id as number, areaPayload); + break; + } + }, + }); + + const { setValues: formikSetValues } = formik; + + const deleteAreaClickHandler = () => { + deleteModal.openModal(); + }; + + const confirmationModalDeleteClickHandler = async () => { + setIsDeleteLoading(true); + + await AreaApi.delete(initialValues?.id as number); + + deleteModal.closeModal(); + toast.success('Successfully delete Area!'); + setIsDeleteLoading(false); + router.push('/master-data/area'); + }; + + useEffect(() => { + formikSetValues(formikInitialValues); + }, [formikSetValues, formikInitialValues]); + + return ( + <> +
+
+ + +

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

+
+ +
+
+ +
+ +
+ {type !== 'add' && ( +
+ +
+ )} + + {type !== 'detail' && ( +
+ + + +
+ )} +
+ + {areaFormErrorMessage && ( +
+ + {areaFormErrorMessage} +
+ )} +
+
+ + {type !== 'add' && ( + + )} + + ); +}; + +export default AreaForm;