import HookFormSelect from '@/core/components/elements/Select/HookFormSelect'; import useAuth from '@/core/hooks/useAuth'; import Menu from '@/lib/auth/components/Menu'; import { yupResolver } from '@hookform/resolvers/yup'; import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { toast } from 'react-hot-toast'; import * as Yup from 'yup'; import cityApi from '../api/cityApi'; import createAddressApi from '../api/createAddressApi'; import districtApi from '../api/districtApi'; import stateApi from '../api/stateApi'; import subDistrictApi from '../api/subDistrictApi'; import useAddresses from '../hooks/useAddresses'; import BottomPopup from '@/core/components/elements/Popup/BottomPopup'; import { Button } from '@chakra-ui/react'; import { MapPinIcon } from 'lucide-react'; import PinPointMap from '../../maps/components/PinPointMap'; import { useMaps } from '../../maps/stores/useMaps'; const CreateAddress = () => { const auth = useAuth(); const router = useRouter(); const { register, formState: { errors }, handleSubmit, watch, setValue, control, } = useForm({ resolver: yupResolver(validationSchema), defaultValues, }); const { addresses = [] } = useAddresses(); // Ensure addresses is an array const [states, setState] = useState([]); const [cities, setCities] = useState([]); const [districts, setDistricts] = useState([]); const [subDistricts, setSubDistricts] = useState([]); const [filteredTypes, setFilteredTypes] = useState(types); // State to manage filtered types const { addressMaps, selectedPosition, detailAddress, setAddressMaps, pinedMaps, setPinedMaps } = useMaps(); useEffect(() => { if (detailAddress) { setValue('zip', detailAddress.postalCode); const selectedState = states.find( (state) => detailAddress?.province.includes(state.label) || state.label.includes(detailAddress?.province) ); setValue('state', selectedState?.value); setValue('street', detailAddress?.street); } }, [detailAddress, setValue]); useEffect(() => { const loadState = async () => { let dataState = await stateApi({ tempo: false }); dataState = dataState.map((state) => ({ value: state.id, label: state.name, })); setState(dataState); }; loadState(); setAddressMaps(''); }, []); const watchState = watch('state'); useEffect(() => { setValue('city', ''); if (watchState) { const loadCities = async () => { let dataCities = await cityApi({ stateId: watchState }); dataCities = dataCities.map((city) => ({ value: city.id, label: city.name, })); setCities(dataCities); }; loadCities(); } }, [watchState, setValue]); useEffect(() => { if (detailAddress && Object.keys(detailAddress).length > 0) { const selectedCities = cities.find( (city) => detailAddress?.district .toLowerCase() .includes(city.label.toLowerCase()) || city.label .toLowerCase() .includes(detailAddress?.district.toLowerCase()) ); setValue('city', selectedCities?.value); } }, [cities, detailAddress, setValue]); useEffect(() => { if (addresses) { let hasContactAddress = false; for (let i = 0; i < addresses?.data?.length; i++) { if (addresses.data[i].type === 'contact') { hasContactAddress = true; break; } } if (hasContactAddress) { setFilteredTypes(types.filter((type) => type.value !== 'contact')); } else { setFilteredTypes(types); } } }, [auth]); const watchCity = watch('city'); useEffect(() => { setValue('district', ''); if (watchCity) { const loadDistricts = async () => { let dataDistricts = await districtApi({ cityId: watchCity }); dataDistricts = dataDistricts.map((district) => ({ value: district.id, label: district.name, })); setDistricts(dataDistricts); }; loadDistricts(); } }, [watchCity, setValue]); useEffect(() => { if (detailAddress && Object.keys(detailAddress).length > 0) { const selectedDistrict = districts.find( (district) => detailAddress.subDistrict .toLowerCase() .includes(district.label.toLowerCase()) || district.label .toLowerCase() .includes(detailAddress.subDistrict.toLowerCase()) ); setValue('district', selectedDistrict?.value); } }, [districts, detailAddress, setValue]); const watchDistrict = watch('district'); useEffect(() => { setValue('subDistrict', ''); if (watchDistrict) { const loadSubDistricts = async () => { let dataSubDistricts = await subDistrictApi({ districtId: watchDistrict, }); dataSubDistricts = dataSubDistricts.map((district) => ({ value: district.id, label: district.name, })); setSubDistricts(dataSubDistricts); }; loadSubDistricts(); } }, [watchDistrict, setValue]); useEffect(() => { if (detailAddress && Object.keys(detailAddress).length > 0) { const selectedSubDistrict = subDistricts.find( (district) => detailAddress.village .toLowerCase() .includes(district.label.toLowerCase()) || district.label .toLowerCase() .includes(detailAddress.village.toLowerCase()) ); setValue('subDistrict', selectedSubDistrict?.value); } }, [subDistricts, detailAddress, setValue]); const onSubmitHandler = async (values) => { const data = { ...values, state_id: values.state, city_id: values.city, district_id: values.district, sub_district_id: values.subDistrict, parent_id: auth.partnerId, latitude: selectedPosition?.lat, longtitude: selectedPosition?.lng, address_map: addressMaps, }; const address = await createAddressApi({ data }); if (address?.id) { toast.success('Berhasil menambahkan alamat'); router.back(); } }; return ( <> setPinedMaps(false)} >
{addressMaps ? (
setPinedMaps(true)} />{' '} {addressMaps}
) : ( )}
( )} />
{errors.type?.message}
{errors.name?.message}
{errors.email?.message}
{errors.mobile?.message}
{errors.street?.message}
{errors.zip?.message}
( )} />
{errors.state?.message}
( )} />
{errors.city?.message}
( )} />
{errors.district?.message}
( )} />
); }; const validationSchema = Yup.object().shape({ type: Yup.string().required('Harus di-pilih'), name: Yup.string().min(3, 'Minimal 3 karakter').required('Harus di-isi'), mobile: Yup.string().required('Harus di-isi'), street: Yup.string().required('Harus di-isi'), zip: Yup.string().required('Harus di-isi'), state: Yup.string().required('Harus di-pilih'), city: Yup.string().required('Harus di-pilih'), district: Yup.string().required('Harus di-pilih'), }); const defaultValues = { type: '', name: '', email: '', mobile: '', street: '', state: '', city: '', district: '', subDistrict: '', zip: '', }; const types = [ { value: 'contact', label: 'Contact Address' }, { value: 'invoice', label: 'Invoice Address' }, { value: 'delivery', label: 'Delivery Address' }, { value: 'other', label: 'Other Address' }, ]; export default CreateAddress;