'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 { WarehouseFormSchema, WarehouseFormValues, UpdateWarehouseFormSchema, } from '@/components/pages/master-data/warehouse/form/WarehouseForm.schema'; import { isResponseError } from '@/lib/api-helper'; import { Warehouse, CreateWarehousePayload, UpdateWarehousePayload, } from '@/types/api/master-data/warehouse'; import { AreaApi, KandangApi, LocationApi, WarehouseApi, } from '@/services/api/master-data'; import { cn } from '@/lib/helper'; import { WAREHOUSE_TYPE_OPTIONS } from '@/config/constant'; import { useFormikErrorList } from '@/services/hooks/useFormikErrorList'; import AlertErrorList from '@/components/helper/form/FormErrors'; import { Area } from '@/types/api/master-data/area'; import { Kandang } from '@/types/api/master-data/kandang'; interface WarehouseFormProps { type?: 'add' | 'edit' | 'detail'; initialValues?: Warehouse; } const WarehouseForm = ({ type = 'add', initialValues }: WarehouseFormProps) => { const router = useRouter(); const deleteModal = useModal(); const [warehouseFormErrorMessage, setWarehouseFormErrorMessage] = useState(''); const [isDeleteLoading, setIsDeleteLoading] = useState(false); const createWarehouseHandler = useCallback( async (payload: CreateWarehousePayload) => { const createWarehouseRes = await WarehouseApi.create(payload); if (isResponseError(createWarehouseRes)) { setWarehouseFormErrorMessage(createWarehouseRes.message); return; } toast.success(createWarehouseRes?.message as string); router.push('/master-data/warehouse'); }, [router] ); const updateWarehouseHandler = useCallback( async (warehouseId: number, payload: UpdateWarehousePayload) => { const updateWarehouseRes = await WarehouseApi.update( warehouseId, payload ); if (updateWarehouseRes?.status === 'error') { setWarehouseFormErrorMessage(updateWarehouseRes.message); return; } toast.success(updateWarehouseRes?.message as string); router.refresh(); router.push('/master-data/warehouse'); }, [router] ); const formikInitialValues = useMemo(() => { switch (initialValues?.type) { case 'AREA': return { name: initialValues?.name ?? '', type: initialValues?.type ?? 'AREA', areaId: initialValues?.area?.id ?? 0, area: initialValues?.area ? { value: initialValues.area.id, label: initialValues.area.name, } : null, locationId: 0, location: null, kandangId: 0, kandang: null, }; case 'LOKASI': return { name: initialValues?.name ?? '', type: initialValues?.type ?? 'LOKASI', areaId: initialValues?.area?.id ?? 0, area: initialValues?.area ? { value: initialValues.area.id, label: initialValues.area.name, } : null, locationId: initialValues?.location?.id ?? 0, location: initialValues?.location ? { value: initialValues.location.id, label: initialValues.location.name, } : null, kandangId: 0, kandang: null, }; case 'KANDANG': return { name: initialValues?.name ?? '', type: initialValues?.type ?? 'KANDANG', areaId: initialValues?.area?.id ?? 0, area: initialValues?.area ? { value: initialValues.area.id, label: initialValues.area.name, } : null, locationId: initialValues?.location?.id ?? 0, location: initialValues?.location ? { value: initialValues.location.id, label: initialValues.location.name, } : null, kandangId: initialValues?.kandang?.id ?? 0, kandang: initialValues?.kandang ? { value: initialValues.kandang.id, label: initialValues.kandang.name, } : null, }; default: return { name: '', type: 'AREA', areaId: 0, area: null, locationId: 0, location: null, kandangId: 0, kandang: null, }; } }, [initialValues]); const formik = useFormik({ initialValues: formikInitialValues, validationSchema: type === 'edit' ? UpdateWarehouseFormSchema : WarehouseFormSchema, onSubmit: async (values) => { setWarehouseFormErrorMessage(''); let warehousePayload: CreateWarehousePayload | undefined = undefined; switch (values.type) { case 'AREA': warehousePayload = { name: values.name, type: values.type, area_id: values.areaId as number, }; break; case 'LOKASI': warehousePayload = { name: values.name, type: values.type, area_id: values.areaId as number, location_id: values.locationId as number, }; break; case 'KANDANG': warehousePayload = { name: values.name, type: values.type, area_id: values.areaId as number, location_id: values.locationId as number, kandang_id: values.kandangId as number, }; break; } switch (type) { case 'add': await createWarehouseHandler(warehousePayload); break; case 'edit': await updateWarehouseHandler( initialValues?.id as number, warehousePayload ); break; } }, }); const { setValues: formikSetValues } = formik; // Area const { setInputValue: setAreaSelectInputValue, options: areaOptions, isLoadingOptions: isLoadingAreaOptions, loadMore: loadMoreAreas, } = useSelect(AreaApi.basePath, 'id', 'name'); // Location const { setInputValue: setLocationSelectInputValue, options: locationOptions, isLoadingOptions: isLoadingLocationOptions, loadMore: loadMoreLocations, } = useSelect(LocationApi.basePath, 'id', 'name'); // Kandang const { setInputValue: setKandangSelectInputValue, options: kandangOptions, isLoadingOptions: isLoadingKandangOptions, loadMore: loadMoreKandangs, } = useSelect(KandangApi.basePath, 'id', 'name'); const typeChangeHandler = (val: OptionType | OptionType[] | null) => { formik.setFieldTouched('type', true); formik.setFieldValue('type', (val as OptionType)?.value); }; 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 locationChangeHandler = (val: OptionType | OptionType[] | null) => { formik.setFieldTouched('location', true); formik.setFieldValue('location', val); formik.setFieldTouched('locationId', true); formik.setFieldValue('locationId', (val as OptionType)?.value); }; const kandangChangeHandler = (val: OptionType | OptionType[] | null) => { formik.setFieldTouched('kandang', true); formik.setFieldValue('kandang', val); formik.setFieldTouched('kandangId', true); formik.setFieldValue('kandangId', (val as OptionType)?.value); }; const deleteWarehouseClickHandler = () => { deleteModal.openModal(); }; const confirmationModalDeleteClickHandler = async () => { setIsDeleteLoading(true); await WarehouseApi.delete(initialValues?.id as number); deleteModal.closeModal(); toast.success('Successfully delete Warehouse!'); setIsDeleteLoading(false); router.push('/master-data/warehouse'); }; useEffect(() => { formikSetValues(formikInitialValues); }, [formikSetValues, formikInitialValues]); // ===== Formik Error List ===== const { formErrorList, close, handleFormSubmit } = useFormikErrorList(formik); return ( <>

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

{(formik.values.type === 'LOKASI' || formik.values.type === 'KANDANG') && ( )} {formik.values.type === 'KANDANG' && ( )}
{type !== 'add' && (
{type !== 'edit' && ( )}
)} {type !== 'detail' && (
)}
{warehouseFormErrorMessage && (
{warehouseFormErrorMessage}
)}
{type !== 'add' && ( )} ); }; export default WarehouseForm;