import { memo, useEffect } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Collapse, Divider, Switch, Tooltip, Typography } from "antd"; import z from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { ChevronsUpDown as ChevronsUpDownIcon, Plus as PlusIcon, CircleHelp as CircleHelpIcon } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from "@/components/ui/select"; import AccessEditModal from "@/components/access/AccessEditModal"; import EmailsEdit from "@/components/certimate/EmailsEdit"; import StringList from "@/components/certimate/StringList"; import { accessProvidersMap } from "@/domain/access"; import { useZustandShallowSelector } from "@/hooks"; import { useAccessStore } from "@/stores/access"; import { useContactStore } from "@/stores/contact"; import { WorkflowNode, WorkflowNodeConfig } from "@/domain/workflow"; import { useWorkflowStore } from "@/stores/workflow"; import { usePanel } from "./PanelProvider"; type ApplyFormProps = { data: WorkflowNode; }; const ApplyForm = ({ data }: ApplyFormProps) => { const { updateNode } = useWorkflowStore(useZustandShallowSelector(["updateNode"])); const { accesses } = useAccessStore(); const { emails, fetchEmails } = useContactStore(); useEffect(() => { fetchEmails(); }, []); const { t } = useTranslation(); const { hidePanel } = usePanel(); const formSchema = z.object({ domain: z.string().min(1, { message: "common.errmsg.domain_invalid", }), email: z.string().email("common.errmsg.email_invalid").optional(), access: z.string().regex(/^[a-zA-Z0-9]+$/, { message: "domain.application.form.access.placeholder", }), keyAlgorithm: z.string().optional(), nameservers: z.string().optional(), timeout: z.number().optional(), disableFollowCNAME: z.boolean().optional(), }); let config: WorkflowNodeConfig = { domain: "", email: "", access: "", keyAlgorithm: "RSA2048", nameservers: "", timeout: 60, disableFollowCNAME: true, }; if (data) config = data.config ?? config; const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { domain: config.domain as string, email: config.email as string, access: config.access as string, keyAlgorithm: config.keyAlgorithm as string, nameservers: config.nameservers as string, timeout: config.timeout as number, disableFollowCNAME: config.disableFollowCNAME as boolean, }, }); const onSubmit = async (config: z.infer) => { updateNode({ ...data, config, validated: true }); hidePanel(); }; return ( <>
{/* 域名 */} ( <> { form.setValue("domain", domain); }} /> )} /> {/* 邮箱 */} (
{t("domain.application.form.email.label") + " " + t("domain.application.form.email.tips")}
{t("common.button.add")} } />
)} /> {/* DNS 服务商授权 */} (
{t("domain.application.form.access.label")}
{t("common.button.add")} } />
)} /> {t("domain.application.form.advanced_settings.label")}, children: (
{/* 证书算法 */} ( {t("domain.application.form.key_algorithm.label")} )} /> {/* DNS */} ( { form.setValue("nameservers", val); }} valueType="dns" > )} /> {/* DNS 超时时间 */} ( {t("domain.application.form.timeout.label")} { form.setValue("timeout", parseInt(e.target.value)); }} /> )} /> {/* 禁用 CNAME 跟随 */} (
{t("domain.application.form.disable_follow_cname.label")} {t("domain.application.form.disable_follow_cname.tips")} {t("domain.application.form.disable_follow_cname.tips_link")}

} >
{ form.setValue(field.name, value); }} />
)} />
), extra: , forceRender: true, showArrow: false, }, ]} />
); }; export default memo(ApplyForm);