redhare-demo/components/modals/AddressModal.jsx

172 lines
4.6 KiB
JavaScript

'use client'
import { useEffect, useState } from 'react'
import { useEditUserMutation } from '@/store/services'
import { SubmitHandler, useForm } from 'react-hook-form'
import { yupResolver } from '@hookform/resolvers/yup'
import { addressSchema } from 'utils'
import { useUserInfo } from 'hooks'
import regions from 'china-citys'
import {
TextField,
DisplayError,
SubmitModalBtn,
Combobox,
Modal,
HandleResponse,
} from 'components'
const AddressModal = props => {
//? Porps
const { isShow, onClose, address } = props
//? Assets
let AllProvinces = regions.getProvinces()
//? Get User Data
const { userInfo } = useUserInfo()
//? State
const [cities, setCities] = useState([])
const [areas, setAreas] = useState([])
//? Form Hook
const {
handleSubmit,
control,
formState: { errors: formErrors },
setValue,
getValues,
watch,
} = useForm({
resolver: yupResolver(addressSchema),
defaultValues: address,
})
//? Edit User-Info Query
const [editUser, { data, isSuccess, isLoading, isError, error }] = useEditUserMutation()
//? Re-Renders
//* Change cities beside on province
useEffect(() => {
setValue('area', {})
getValues('city')?.code ? setAreas(regions.getAreasByCity(getValues('city')?.code)) : ''
watch('city')
}, [getValues('city')?.code])
useEffect(() => {
setValue('city', {})
setCities(regions.getCitysByProvince(getValues('province')?.code))
watch('province')
}, [getValues('province')?.code])
useEffect(() => {
if (userInfo?.address) {
setValue('city', userInfo.address.city)
setValue('area', userInfo.address.area)
}
}, [])
//? Handlers
const submitHander = address => {
editUser({
body: { address },
})
}
//? Render(s)
return (
<>
{/* Handle Edit Address Response */}
{(isSuccess || isError) && (
<HandleResponse
isError={isError}
isSuccess={isSuccess}
error={error?.data?.message}
message={data?.message}
onSuccess={onClose}
/>
)}
<Modal isShow={isShow} onClose={onClose} effect="bottom-to-top">
<Modal.Content
onClose={onClose}
className="flex flex-col h-full px-5 py-3 bg-white md:rounded-lg gap-y-5 "
>
<Modal.Header onClose={onClose}>地址管理</Modal.Header>
<Modal.Body>
<p>请输入您的收货地址</p>
<form
className="flex flex-col justify-between flex-1 pl-4 overflow-y-auto"
onSubmit={handleSubmit(submitHander)}
>
<div className="space-y-12 md:grid md:grid-cols-3 md:gap-x-12 md:gap-y-5 md:items-baseline ">
<div className="space-y-2">
<Combobox
control={control}
name="province"
list={AllProvinces}
placeholder="请选择您所在的省份"
/>
<DisplayError errors={formErrors.province?.name} />
</div>
<div className="space-y-2 ">
<Combobox
control={control}
name="city"
list={cities}
placeholder="请选择您所在的城市"
/>
<DisplayError errors={formErrors.city?.name} />
</div>
<div className="space-y-2 ">
<Combobox
control={control}
name="area"
list={areas}
placeholder="请选择您所在的区县"
/>
<DisplayError errors={formErrors.area?.name} />
</div>
<TextField
label="街道信息"
control={control}
errors={formErrors.street}
name="street"
/>
<TextField
label="邮政编码"
control={control}
errors={formErrors.postalCode}
name="postalCode"
type="number"
direction="ltr"
inputMode="numeric"
/>
</div>
<div className="py-3 border-t-2 border-gray-200 lg:pb-0 flex">
<SubmitModalBtn isLoading={isLoading} className="ml-auto">
确定
</SubmitModalBtn>
</div>
</form>
</Modal.Body>
</Modal.Content>
</Modal>
</>
)
}
export default AddressModal