'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 { BankFormSchema, BankFormValues, UpdateBankFormSchema, } from '@/components/pages/master-data/bank/form/BankForm.schema'; import { isResponseError } from '@/lib/api-helper'; import { CreateBankPayload, Bank, UpdateBankPayload, } from '@/types/api/master-data/bank'; import { BankApi } from '@/services/api/master-data'; import { cn } from '@/lib/helper'; interface BankFormProps { type?: 'add' | 'edit' | 'detail'; initialValues?: Bank; } const BankForm = ({ type = 'add', initialValues }: BankFormProps) => { const router = useRouter(); const deleteModal = useModal(); const [bankFormErrorMessage, setBankFormErrorMessage] = useState(''); const [isDeleteLoading, setIsDeleteLoading] = useState(false); const createBankHandler = useCallback( async (payload: CreateBankPayload) => { const createBankRes = await BankApi.create(payload); if (isResponseError(createBankRes)) { setBankFormErrorMessage(createBankRes.message); return; } toast.success(createBankRes?.message as string); router.push('/master-data/bank'); }, [router] ); const updateBankHandler = useCallback( async (bankId: number, payload: UpdateBankPayload) => { const updateBankRes = await BankApi.update(bankId, payload); if (updateBankRes?.status === 'error') { setBankFormErrorMessage(updateBankRes.message); return; } toast.success(updateBankRes?.message as string); router.refresh(); router.push('/master-data/bank'); }, [router] ); const formikInitialValues = useMemo(() => { return { name: initialValues?.name ?? '', alias: initialValues?.alias ?? '', account_number: initialValues?.account_number ?? '', owner: initialValues?.owner, }; }, [initialValues]); const formik = useFormik({ initialValues: formikInitialValues, validationSchema: type === 'edit' ? UpdateBankFormSchema : BankFormSchema, onSubmit: async (values) => { setBankFormErrorMessage(''); const bankPayload: CreateBankPayload = { name: values.name, alias: values.alias, account_number: values.account_number.toString(), owner: values.owner ? values.owner : '', }; switch (type) { case 'add': await createBankHandler(bankPayload); break; case 'edit': await updateBankHandler(initialValues?.id as number, bankPayload); break; } }, }); const { setValues: formikSetValues } = formik; const deleteBankClickHandler = () => { deleteModal.openModal(); }; const confirmationModalDeleteClickHandler = async () => { setIsDeleteLoading(true); await BankApi.delete(initialValues?.id as number); deleteModal.closeModal(); toast.success('Successfully delete Bank!'); setIsDeleteLoading(false); router.push('/master-data/bank'); }; useEffect(() => { formikSetValues(formikInitialValues); }, [formikSetValues, formikInitialValues]); return ( <>

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

{type !== 'add' && (
{type !== 'edit' && ( )}
)} {type !== 'detail' && (
)}
{bankFormErrorMessage && (
{bankFormErrorMessage}
)}
{type !== 'add' && ( )} ); }; export default BankForm;