import { forwardRef, useImperativeHandle, useMemo } from "react"; import { useTranslation } from "react-i18next"; import { Form, type FormInstance, Input } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; import AccessProviderSelect from "@/components/provider/AccessProviderSelect"; import { type AccessModel } from "@/domain/access"; import { ACCESS_PROVIDERS } from "@/domain/provider"; import { useAntdForm, useAntdFormName } from "@/hooks"; import AccessEditFormACMEHttpReqConfig from "./AccessEditFormACMEHttpReqConfig"; import AccessEditFormAWSConfig from "./AccessEditFormAWSConfig"; import AccessEditFormAliyunConfig from "./AccessEditFormAliyunConfig"; import AccessEditFormBaiduCloudConfig from "./AccessEditFormBaiduCloudConfig"; import AccessEditFormBytePlusConfig from "./AccessEditFormBytePlusConfig"; import AccessEditFormCloudflareConfig from "./AccessEditFormCloudflareConfig"; import AccessEditFormDogeCloudConfig from "./AccessEditFormDogeCloudConfig"; import AccessEditFormGoDaddyConfig from "./AccessEditFormGoDaddyConfig"; import AccessEditFormHuaweiCloudConfig from "./AccessEditFormHuaweiCloudConfig"; import AccessEditFormKubernetesConfig from "./AccessEditFormKubernetesConfig"; import AccessEditFormLocalConfig from "./AccessEditFormLocalConfig"; import AccessEditFormNameDotComConfig from "./AccessEditFormNameDotComConfig"; import AccessEditFormNameSiloConfig from "./AccessEditFormNameSiloConfig"; import AccessEditFormPowerDNSConfig from "./AccessEditFormPowerDNSConfig"; import AccessEditFormQiniuConfig from "./AccessEditFormQiniuConfig"; import AccessEditFormSSHConfig from "./AccessEditFormSSHConfig"; import AccessEditFormTencentCloudConfig from "./AccessEditFormTencentCloudConfig"; import AccessEditFormVolcEngineConfig from "./AccessEditFormVolcEngineConfig"; import AccessEditFormWebhookConfig from "./AccessEditFormWebhookConfig"; type AccessEditFormFieldValues = Partial>; type AccessEditFormPresets = "add" | "edit"; export type AccessEditFormProps = { className?: string; style?: React.CSSProperties; disabled?: boolean; initialValues?: AccessEditFormFieldValues; preset: AccessEditFormPresets; onValuesChange?: (values: AccessEditFormFieldValues) => void; }; export type AccessEditFormInstance = { getFieldsValue: () => ReturnType["getFieldsValue"]>; resetFields: FormInstance["resetFields"]; validateFields: FormInstance["validateFields"]; }; const AccessEditForm = forwardRef(({ className, style, disabled, initialValues, preset, onValuesChange }, ref) => { const { t } = useTranslation(); const formSchema = z.object({ name: z .string({ message: t("access.form.name.placeholder") }) .min(1, t("access.form.name.placeholder")) .max(64, t("common.errmsg.string_max", { max: 64 })) .trim(), provider: z.nativeEnum(ACCESS_PROVIDERS, { message: t("access.form.provider.placeholder") }), config: z.any(), }); const formRule = createSchemaFieldRule(formSchema); const { form: formInst, formProps } = useAntdForm({ initialValues: initialValues, }); const configProvider = Form.useWatch("provider", formInst); const [configFormInst] = Form.useForm(); const configFormName = useAntdFormName({ form: configFormInst, name: "accessEditConfigForm" }); const configFormComponent = useMemo(() => { /* 注意:如果追加新的子组件,请保持以 ASCII 排序。 NOTICE: If you add new child component, please keep ASCII order. */ const configFormProps = { form: configFormInst, formName: configFormName, disabled: disabled, initialValues: initialValues?.config }; switch (configProvider) { case ACCESS_PROVIDERS.ACMEHTTPREQ: return ; case ACCESS_PROVIDERS.ALIYUN: return ; case ACCESS_PROVIDERS.AWS: return ; case ACCESS_PROVIDERS.BAIDUCLOUD: return ; case ACCESS_PROVIDERS.BYTEPLUS: return ; case ACCESS_PROVIDERS.CLOUDFLARE: return ; case ACCESS_PROVIDERS.DOGECLOUD: return ; case ACCESS_PROVIDERS.GODADDY: return ; case ACCESS_PROVIDERS.HUAWEICLOUD: return ; case ACCESS_PROVIDERS.KUBERNETES: return ; case ACCESS_PROVIDERS.LOCAL: return ; case ACCESS_PROVIDERS.NAMEDOTCOM: return ; case ACCESS_PROVIDERS.NAMESILO: return ; case ACCESS_PROVIDERS.POWERDNS: return ; case ACCESS_PROVIDERS.QINIU: return ; case ACCESS_PROVIDERS.SSH: return ; case ACCESS_PROVIDERS.TENCENTCLOUD: return ; case ACCESS_PROVIDERS.VOLCENGINE: return ; case ACCESS_PROVIDERS.WEBHOOK: return ; } }, [disabled, initialValues, configProvider, configFormInst, configFormName]); const handleFormProviderChange = (name: string) => { if (name === configFormName) { formInst.setFieldValue("config", configFormInst.getFieldsValue()); onValuesChange?.(formInst.getFieldsValue(true)); } }; const handleFormChange = (_: unknown, values: AccessEditFormFieldValues) => { if (values.provider !== configProvider) { formInst.setFieldValue("provider", values.provider); } onValuesChange?.(values); }; useImperativeHandle(ref, () => { return { getFieldsValue: () => { return formInst.getFieldsValue(true); }, resetFields: (fields) => { return formInst.resetFields(fields); }, validateFields: (nameList, config) => { const t1 = formInst.validateFields(nameList, config); const t2 = configFormInst.validateFields(undefined, config); return Promise.all([t1, t2]).then(() => t1); }, } as AccessEditFormInstance; }); return (
} >
{configFormComponent}
); }); export default AccessEditForm;