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 [pinedMaps, setPinedMaps] = useState(false);
const {
addressMaps,
selectedPosition,
detailAddress,
setAddressMaps,
} = 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();
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) {
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) {
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) {
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 (
<>