'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 RequirePermission from '@/components/helper/RequirePermission'; 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'; import { cn } from '@/lib/helper'; interface UomFormProps { type?: 'add' | 'edit' | 'detail'; initialValues?: Uom; } const UomForm = ({ type = 'add', initialValues }: UomFormProps) => { const router = useRouter(); const deleteModal = useModal(); const [uomFormErrorMessage, setUomFormErrorMessage] = useState(''); const [isDeleteLoading, setIsDeleteLoading] = useState(false); 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; const deleteUomClickHandler = () => { deleteModal.openModal(); }; const confirmationModalDeleteClickHandler = async () => { setIsDeleteLoading(true); await UomApi.delete(initialValues?.id as number); deleteModal.closeModal(); toast.success('Successfully delete UOM!'); setIsDeleteLoading(false); router.push('/master-data/uom'); }; useEffect(() => { formikSetValues(formikInitialValues); }, [formikSetValues, formikInitialValues]); return ( <>

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

{type !== 'add' && (
{type !== 'edit' && ( )}
)} {type !== 'detail' && (
)}
{uomFormErrorMessage && (
{uomFormErrorMessage}
)}
{type !== 'add' && ( )} ); }; export default UomForm;