import { memo } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import z from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { ChevronsUpDown, Plus, CircleHelp } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; 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 AccessEditDialog from "@/components/certimate/AccessEditDialog"; import EmailsEdit from "@/components/certimate/EmailsEdit"; import StringList from "@/components/certimate/StringList"; import { accessProvidersMap } from "@/domain/access"; import { EmailsSetting } from "@/domain/settings"; import { useConfigContext } from "@/providers/config"; import { Switch } from "@/components/ui/switch"; import { TooltipFast } from "@/components/ui/tooltip"; import { WorkflowNode, WorkflowNodeConfig } from "@/domain/workflow"; import { useWorkflowStore, WorkflowState } from "@/providers/workflow"; import { useShallow } from "zustand/shallow"; import { usePanel } from "./PanelProvider"; type ApplyFormProps = { data: WorkflowNode; }; const selectState = (state: WorkflowState) => ({ updateNode: state.updateNode, }); const ApplyForm = ({ data }: ApplyFormProps) => { const { updateNode } = useWorkflowStore(useShallow(selectState)); const { config: { accesses, emails }, } = useConfigContext(); 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.add")} } />
)} /> {/* DNS 服务商授权 */} (
{t("domain.application.form.access.label")}
{t("common.add")} } op="add" />
)} />

{t("domain.application.form.advanced_settings.label")}
{/* 证书算法 */} ( {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); }} />
)} />
); }; export default memo(ApplyForm);