'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 SelectInput, { OptionType, useSelect, } from '@/components/input/SelectInput'; import { useModal } from '@/components/Modal'; import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import { LocationFormSchema, LocationFormValues, UpdateLocationFormSchema, } from '@/components/pages/master-data/location/form/LocationForm.schema'; import { isResponseError } from '@/lib/api-helper'; import { Location, CreateLocationPayload, UpdateLocationPayload, } from '@/types/api/master-data/location'; import { AreaApi, LocationApi } from '@/services/api/master-data'; import { cn } from '@/lib/helper'; import { useFormikErrorList } from '@/services/hooks/useFormikErrorList'; import AlertErrorList from '@/components/helper/form/FormErrors'; import { Area } from '@/types/api/master-data/area'; interface LocationFormProps { type?: 'add' | 'edit' | 'detail'; initialValues?: Location; } const LocationForm = ({ type = 'add', initialValues }: LocationFormProps) => { const router = useRouter(); const deleteModal = useModal(); const [locationFormErrorMessage, setLocationFormErrorMessage] = useState(''); const [isDeleteLoading, setIsDeleteLoading] = useState(false); const createLocationHandler = useCallback( async (payload: CreateLocationPayload) => { const createLocationRes = await LocationApi.create(payload); if (isResponseError(createLocationRes)) { setLocationFormErrorMessage(createLocationRes.message); return; } toast.success(createLocationRes?.message as string); router.push('/master-data/location'); }, [router] ); const updateLocationHandler = useCallback( async (locationId: number, payload: UpdateLocationPayload) => { const updateLocationRes = await LocationApi.update(locationId, payload); if (updateLocationRes?.status === 'error') { setLocationFormErrorMessage(updateLocationRes.message); return; } toast.success(updateLocationRes?.message as string); router.refresh(); router.push('/master-data/location'); }, [router] ); const formikInitialValues = useMemo(() => { return { name: initialValues?.name ?? '', address: initialValues?.address ?? '', areaId: initialValues?.area?.id ?? 0, area: initialValues?.area ? { value: initialValues.area.id, label: initialValues.area.name, } : null, }; }, [initialValues]); const formik = useFormik({ initialValues: formikInitialValues, validationSchema: type === 'edit' ? UpdateLocationFormSchema : LocationFormSchema, onSubmit: async (values) => { setLocationFormErrorMessage(''); const locationPayload: CreateLocationPayload = { name: values.name, address: values.address, area_id: values.areaId, }; switch (type) { case 'add': await createLocationHandler(locationPayload); break; case 'edit': await updateLocationHandler( initialValues?.id as number, locationPayload ); break; } }, }); const { setValues: formikSetValues } = formik; const { setInputValue: setAreaSelectInputValue, options: areaOptions, isLoadingOptions: isLoadingAreaOptions, loadMore: loadMoreAreas, } = useSelect(AreaApi.basePath, 'id', 'name'); const areaChangeHandler = (val: OptionType | OptionType[] | null) => { formik.setFieldTouched('area', true); formik.setFieldValue('area', val); formik.setFieldTouched('areaId', true); formik.setFieldValue('areaId', (val as OptionType)?.value); }; const deleteLocationClickHandler = () => { deleteModal.openModal(); }; const confirmationModalDeleteClickHandler = async () => { setIsDeleteLoading(true); await LocationApi.delete(initialValues?.id as number); deleteModal.closeModal(); toast.success('Successfully delete Location!'); setIsDeleteLoading(false); router.push('/master-data/location'); }; useEffect(() => { formikSetValues(formikInitialValues); }, [formikSetValues, formikInitialValues]); // ===== Formik Error List ===== const { formErrorList, close, handleFormSubmit } = useFormikErrorList(formik); return ( <>

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

{type !== 'add' && (
{type !== 'edit' && ( )}
)} {type !== 'detail' && (
)}
{locationFormErrorMessage && (
{locationFormErrorMessage}
)}
{type !== 'add' && ( )} ); }; export default LocationForm;