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 editAddressApi from "../api/editAddressApi" import HookFormSelect from "@/core/components/elements/Select/HookFormSelect" import { toast } from "react-hot-toast" const EditAddress = ({ id, defaultValues }) => { const router = useRouter() const { register, formState: { errors }, handleSubmit, watch, setValue, getValues, control, } = useForm({ resolver: yupResolver(validationSchema), defaultValues, }) const [cities, setCities] = useState([]) const [districts, setDistricts] = useState([]) const [subDistricts, setSubDistricts] = useState([]) useEffect(() => { const loadCities = async () => { let dataCities = await cityApi() dataCities = dataCities.map((city) => ({ value: city.id, label: city.name, })) setCities(dataCities) } loadCities() }, []) 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) let oldDistrict = getValues("oldDistrict") if (oldDistrict) { setValue("district", oldDistrict) setValue("oldDistrict", "") } } loadDistricts() } }, [watchCity, setValue, getValues]) 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) let oldSubDistrict = getValues("oldSubDistrict") if (oldSubDistrict) { setValue("subDistrict", oldSubDistrict) setValue("oldSubDistrict", "") } } loadSubDistricts() } }, [watchDistrict, setValue, getValues]) const onSubmitHandler = async (values) => { const data = { ...values, city_id: values.city, district_id: values.district, sub_district_id: values.subDistrict, } const address = await editAddressApi({ id, data }) if (address?.id) { toast.success("Berhasil mengubah alamat") router.back() } } return (
( )} />
{errors.type?.message}
{errors.name?.message}
{errors.email?.message}
{errors.mobile?.message}
{errors.street?.message}
{errors.zip?.message}
} />
{errors.city?.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"), email: Yup.string() .email("Format harus seperti johndoe@example.com") .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"), city: Yup.string().required("Harus di-pilih"), }) const types = [ { value: "contact", label: "Contact Address" }, { value: "invoice", label: "Invoice Address" }, { value: "delivery", label: "Delivery Address" }, { value: "other", label: "Other Address" }, ] export default EditAddress