forked from yoone/WEB
1
0
Fork 0
WEB/src/pages/Site/Shop/EditSiteForm.tsx

200 lines
6.2 KiB
TypeScript

import { areacontrollerGetarealist } from '@/servers/api/area';
import { stockcontrollerGetallstockpoints } from '@/servers/api/stock';
import {
DrawerForm,
ProFormDependency,
ProFormSelect,
ProFormSwitch,
ProFormText,
ProFormTextArea,
} from '@ant-design/pro-components';
import { Form } from 'antd';
import React, { useEffect } from 'react';
import * as countries from 'i18n-iso-countries';
import zhCN from 'i18n-iso-countries/langs/zh';
// 定义组件的 props 类型
interface EditSiteFormProps {
open: boolean; // 控制抽屉表单的显示和隐藏
onOpenChange: (visible: boolean) => void; // 当抽屉表单显示状态改变时调用
onFinish: (values: any) => Promise<boolean | void>; // 表单提交成功时的回调
initialValues?: any; // 表单的初始值
isEdit: boolean; // 标记当前是编辑模式还是新建模式
}
const EditSiteForm: React.FC<EditSiteFormProps> = ({
open,
onOpenChange,
onFinish,
initialValues,
isEdit,
}) => {
const [form] = Form.useForm();
// 初始化中文语言包
countries.registerLocale(zhCN);
// 当 initialValues 或 open 状态变化时, 更新表单的值
useEffect(() => {
// 如果抽屉是打开的
if (open) {
// 如果是编辑模式并且有初始值
if (isEdit && initialValues) {
// 编辑模式下, 设置表单值为初始值
const { token, consumerKey, consumerSecret, ...safeInitialValues } = initialValues;
// 清空敏感字段, 让用户输入最新的数据
form.setFieldsValue({
...safeInitialValues,
isDisabled: initialValues.isDisabled === 1, // 将后端的 1/0 转换成 true/false
});
} else {
// 新建模式或抽屉关闭时, 重置表单
form.resetFields();
}
}
}, [initialValues, isEdit, open, form]);
// 获取所有国家/地区的选项
const getCountryOptions = () => {
// 获取所有国家的 ISO 代码
const countryCodes = countries.getAlpha2Codes();
// 将国家代码转换为选项数组
return Object.keys(countryCodes).map((code) => ({
label: countries.getName(code, 'zh') || code, // 使用中文名称, 如果没有则使用代码
value: code,
}));
};
return (
<DrawerForm
title={isEdit ? '编辑站点' : '新建站点'}
form={form}
open={open}
onOpenChange={onOpenChange}
onFinish={async (values) => {
// 直接将表单值传递给 onFinish 回调
// 后端需要布尔值, 而 ProFormSwitch 已经提供了布尔值
return onFinish(values);
}}
layout="vertical"
>
<ProFormText
name="name"
label="名称"
rules={[{ required: true, message: '请输入名称' }]}
placeholder="请输入名称"
/>
<ProFormTextArea
name="description"
label="描述"
placeholder="请输入描述"
/>
<ProFormText
name="apiUrl"
label="API 地址"
rules={[{ required: true, message: '请输入 API 地址' }]}
placeholder="请输入 API 地址"
/>
<ProFormText
name="websiteUrl"
label="网站地址"
placeholder="请输入网站地址"
/>
<ProFormText
name="webhookUrl"
label="Webhook 地址"
placeholder="请输入 Webhook 地址"
/>
<ProFormSelect
name="type"
label="平台"
options={[
{ label: 'WooCommerce', value: 'woocommerce' },
{ label: 'Shopyy', value: 'shopyy' },
]}
rules={[{ required: true, message: '请选择平台' }]}
placeholder="请选择平台"
/>
{/* 根据选择的平台动态显示不同的认证字段 */}
<ProFormDependency name={['type']}>
{({ type }) => {
// 如果平台是 woocommerce
if (type === 'woocommerce') {
return (
<>
<ProFormText
name="consumerKey"
label="Consumer Key"
rules={[
{ required: !isEdit, message: '请输入 Consumer Key' },
]}
placeholder={
isEdit ? '留空表示不修改' : '请输入 Consumer Key'
}
/>
<ProFormText
name="consumerSecret"
label="Consumer Secret"
rules={[
{ required: !isEdit, message: '请输入 Consumer Secret' },
]}
placeholder={
isEdit ? '留空表示不修改' : '请输入 Consumer Secret'
}
/>
</>
);
}
// 如果平台是 shopyy
if (type === 'shopyy') {
return (
<ProFormText
name="token"
label="Token"
rules={[{ required: !isEdit, message: '请输入 Token' }]}
placeholder={isEdit ? '留空表示不修改' : '请输入 Token'}
/>
);
}
return null;
}}
</ProFormDependency>
<ProFormText
name="skuPrefix"
label="SKU 前缀"
placeholder="请输入 SKU 前缀"
/>
<ProFormSelect
name="areas"
label="区域"
mode="multiple"
placeholder="请选择区域"
showSearch
filterOption={(input, option) =>
(option?.label ?? '').toLowerCase().includes(input.toLowerCase())
}
options={getCountryOptions()}
/>
<ProFormSelect
name="stockPointIds"
label="关联仓库"
mode="multiple"
placeholder="请选择关联仓库"
request={async () => {
// 从后端接口获取仓库数据
const res = await stockcontrollerGetallstockpoints();
// 使用可选链和空值合并运算符来安全地处理可能未定义的数据
return (
res?.data?.map((sp: any) => ({ label: sp.name, value: sp.id })) ??
[]
);
}}
/>
<ProFormSwitch name="isDisabled" label="是否禁用" />
</DrawerForm>
);
};
export default EditSiteForm;