import { yupResolver } from '@hookform/resolvers/yup';
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';
import * as Yup from 'yup';
import cityApi from '../api/cityApi';
import { Controller, useForm } from 'react-hook-form';
import districtApi from '../api/districtApi';
import subDistrictApi from '../api/subDistrictApi';
import addressApi from '@/lib/address/api/addressApi';
import editAddressApi from '../api/editAddressApi';
import HookFormSelect from '@/core/components/elements/Select/HookFormSelect';
import { toast } from 'react-hot-toast';
import Menu from '@/lib/auth/components/Menu';
import useAuth from '@/core/hooks/useAuth';
import odooApi from '@/core/api/odooApi';
import stateApi from '../api/stateApi';
import { MapPinIcon } from 'lucide-react';
import { Button } from '@chakra-ui/react';
import { useMaps } from '../../maps/stores/useMaps';
import PinPointMap from '../../maps/components/PinPointMap';
import BottomPopup from '@/core/components/elements/Popup/BottomPopup';
const EditAddress = ({ id, defaultValues }) => {
const auth = useAuth();
const router = useRouter();
const {
register,
formState: { errors },
handleSubmit,
watch,
setValue,
getValues,
control,
} = useForm({
resolver: yupResolver(validationSchema),
defaultValues,
});
const [states, setStates] = useState([]);
const [cities, setCities] = useState([]);
const [districts, setDistricts] = useState([]);
const [subDistricts, setSubDistricts] = useState([]);
const [pinedMaps, setPinedMaps] = useState(false);
const [tempAddress, setTempAddress] = useState(getValues('addressMap'));
const { addressMaps, selectedPosition, detailAddress } = useMaps();
console.log('ini adalah',);
useEffect(() => {
if (addressMaps) {
setTempAddress(addressMaps);
setValue('addressMap', addressMaps);
setValue('longtitude', selectedPosition.lng);
setValue('latitude', selectedPosition.lat);
}
}, [addressMaps, selectedPosition, setValue]);
useEffect(() => {
if (Object.keys(detailAddress).length > 0) {
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?.route);
}
}, [detailAddress, setValue]);
useEffect(() => {
const loadProfile = async () => {
const dataProfile = await addressApi({ id: auth.partnerId });
setValue('industry', dataProfile.industryId);
setValue('companyType', dataProfile.companyTypeId);
setValue('taxName', dataProfile.taxName);
setValue('npwp', dataProfile.npwp);
setValue('alamat_wajib_pajak', dataProfile.alamatWajibPajak);
setValue('alamat_bisnis', dataProfile.alamatBisnis);
setValue('business_name', dataProfile.name);
setValue('city', dataProfile.city?.id);
setValue('district', dataProfile.district?.id);
setValue('subDistrict', dataProfile.subDistrict?.id);
};
if (auth) loadProfile();
}, [auth?.parentId]);
useEffect(() => {
const loadStates = async () => {
let dataStates = await stateApi({ tempo: false });
dataStates = dataStates.map((state) => ({
value: state.id,
label: state.name,
}));
setStates(dataStates);
};
loadStates();
}, []);
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);
let oldCity = getValues('oldCity');
if (oldCity) {
setValue('city', oldCity);
setValue('oldCity', '');
}
};
loadCities();
}
}, [watchState, setValue, getValues]);
useEffect(() => {
if (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]);
const watchCity = watch('city');
useEffect(() => {
if (watchCity) {
// setValue('district', '');
const loadDistricts = async () => {
let dataDistricts = await districtApi({ cityId: watchCity });
dataDistricts = dataDistricts.map((district) => ({
value: district.id,
label: district.name,
}));
setDistricts(dataDistricts);
let oldDistrict = getValues('oldDistrict');
if (oldDistrict) {
// setValue('district', oldDistrict);
setValue('oldDistrict', '');
}
};
loadDistricts();
}
}, [watchCity, setValue, getValues]);
useEffect(() => {
if (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(() => {
if (watchDistrict) {
// setValue('subDistrict', '');
const loadSubDistricts = async () => {
let dataSubDistricts = await subDistrictApi({
districtId: watchDistrict,
});
dataSubDistricts = dataSubDistricts.map((district) => ({
value: district.id,
label: district.name,
}));
setSubDistricts(dataSubDistricts);
let oldSubDistrict = getValues('oldSubDistrict');
if (oldSubDistrict) {
setValue('subDistrict', oldSubDistrict);
setValue('oldSubDistrict', '');
}
};
loadSubDistricts();
}
}, [watchDistrict, setValue, getValues]);
useEffect(() => {
if (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,
phone: values.mobile,
state_id: values.state,
city_id: values.city,
district_id: values.district,
sub_district_id: values.subDistrict,
longtitude: selectedPosition?.lng,
latitude: selectedPosition?.lat,
address_map: addressMaps,
};
if (!auth.company) {
data.alamat_lengkap_text = values.street;
}
try {
const address = await editAddressApi({ id, data });
let dataAlamat;
let isUpdated = true;
if (auth.company) {
if (auth?.partnerId == id) {
dataAlamat = {
id_user: auth.partnerId,
alamat_lengkap_text: values.alamat_wajib_pajak,
street: values.street,
};
isUpdated = await odooApi(
'PUT',
`/api/v1/partner/${auth.parentId}`,
dataAlamat
);
}
}
// if (isUpdated?.id) {
if (address?.id && (auth.company && auth?.partnerId == id ? isUpdated?.id : true)) {
toast.success('Berhasil mengubah alamat');
router.back();
} else {
toast.error('Terjadi kesalahan internal');
router.back();
}
} catch (error) {
console.log(error);
toast.error('Terjadi kesalahan internal');
router.back();
}
// if (isUpdated?.id) {
// if (address?.id && auth.company ? isUpdated?.id : true) {
// toast.success('Berhasil mengubah alamat');
// router.back();
// } else {
// toast.error('Terjadi kesalahan internal');
// router.back();
// }
};
return (
<>