import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; import countriesISO from 'i18n-iso-countries'; import langZh from 'i18n-iso-countries/langs/zh.json'; import Form from '../form'; import Input from '../input'; import Select from '../select'; import Modal, { ModalProps } from '../modal'; import countries from './countries'; import Row from '../row'; import Col from '../col'; countriesISO.registerLocale(langZh); interface State { code: string; name: string; } interface Country { code: string; name: string; states: State[]; } export interface AddressProps { firstName?: string; lastName?: string; address1?: string; address2?: string; city?: string; country?: string; province?: string; zip?: string | number; phone?: string | number; } export interface AddressModalProps extends Omit { /** 额外的 FormItem */ extraItem?: React.ReactNode; /** 值 */ value?: AddressProps; /** 更新事件 */ onChange?: (values: AddressProps) => void; onOk?: (values: AddressProps) => void; } const AddressModal: FC = ({ extraItem, title, visible, value, onOk, onChange, ...rest }) => { const [form] = Form.useForm(); // 选择国家代码,用于计算获取国家下面的省 / 州 const [selectCountryCode, setSelectCountryCode] = useState(); // 获取国家下面的省 / 州 const states: State[] | undefined = useMemo( () => (countries as Country[]).find((item: Country) => item.code === selectCountryCode)?.states, [selectCountryCode], ); // 弹窗点击确认时将填写的信息丢出去 const handleOk = useCallback(async () => { if (form) { const values = await form.validateFields(); onOk?.({ ...values, province: values?.province || null, }); } }, [form, onOk]); // 传进来的数据进行初始化设置 useEffect(() => { if (visible) { if (form) { form.resetFields(); if (value) { form.setFieldsValue(value); setSelectCountryCode(value?.country); } else { setSelectCountryCode(''); } } } }, [value, visible, form]); return (
{ onChange?.({ ...values, province: values?.province || null, }); }} > ({ label: state.name, value: state.code }))} /> ) : null} {extraItem}
); }; export default AddressModal;