import { useTranslation } from "react-i18next"; import { z } from "zod"; import { Input } from "@/components/ui/input"; import { DeployFormProps } from "./DeployForm"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "../ui/form"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { WorkflowNode, WorkflowNodeConfig } from "@/domain/workflow"; import { useWorkflowStore, WorkflowState } from "@/stores/workflow"; import { useShallow } from "zustand/shallow"; import { usePanel } from "./PanelProvider"; import { Button } from "../ui/button"; import { useEffect, useState } from "react"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "../ui/select"; import { SelectLabel } from "@radix-ui/react-select"; import AccessSelect from "./AccessSelect"; import AccessEditDialog from "../certimate/AccessEditDialog"; import { Plus } from "lucide-react"; type TencentResourceType = "ssl-deploy" | "loadbalancer" | "listener" | "ruledomain"; const selectState = (state: WorkflowState) => ({ updateNode: state.updateNode, getWorkflowOuptutBeforeId: state.getWorkflowOuptutBeforeId, }); const DeployToTencentCLB = ({ data }: DeployFormProps) => { const { updateNode, getWorkflowOuptutBeforeId } = useWorkflowStore(useShallow(selectState)); const { hidePanel } = usePanel(); const { t } = useTranslation(); const [resourceType, setResourceType] = useState(); useEffect(() => { setResourceType(data.config?.resourceType as TencentResourceType); }, [data]); const [beforeOutput, setBeforeOutput] = useState([]); useEffect(() => { const rs = getWorkflowOuptutBeforeId(data.id, "certificate"); setBeforeOutput(rs); }, [data]); const formSchema = z .object({ providerType: z.string(), access: z.string().min(1, t("domain.deployment.form.access.placeholder")), certificate: z.string().min(1), region: z.string().min(1, t("domain.deployment.form.tencent_clb_region.placeholder")), resourceType: z.union([z.literal("ssl-deploy"), z.literal("loadbalancer"), z.literal("listener"), z.literal("ruledomain")], { message: t("domain.deployment.form.tencent_clb_resource_type.placeholder"), }), loadbalancerId: z.string().min(1, t("domain.deployment.form.tencent_clb_loadbalancer_id.placeholder")), listenerId: z.string().optional(), domain: z.string().regex(/^$|^(?:\*\.)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/, { message: t("common.errmsg.domain_invalid"), }), }) .refine( (data) => { switch (data.resourceType) { case "ssl-deploy": case "listener": case "ruledomain": return !!data.listenerId?.trim(); } return true; }, { message: t("domain.deployment.form.tencent_clb_listener_id.placeholder"), path: ["listenerId"], } ) .refine((data) => (data.resourceType === "ruledomain" ? !!data.domain?.trim() : true), { message: t("domain.deployment.form.tencent_clb_ruledomain.placeholder"), path: ["domain"], }); let config: WorkflowNodeConfig = { certificate: "", providerType: "", access: "", resouceType: "", domain: "", loadbalancerId: "", listenerId: "", }; if (data) config = data.config ?? config; const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { providerType: "tencent-clb", access: config.access as string, certificate: config.certificate as string, region: config.region as string, resourceType: config.resourceType as TencentResourceType, domain: config.certificateId as string, loadbalancerId: config.loadbalancerId as string, listenerId: config.listenerId as string, }, }); const onSubmit = async (config: z.infer) => { updateNode({ ...data, config: { ...config }, validated: true }); hidePanel(); }; return ( <>
{ e.stopPropagation(); form.handleSubmit(onSubmit)(e); }} className="space-y-8" > (
{t("domain.deployment.form.access.label")}
{t("common.add")} } op="add" outConfigType="tencent" />
{ form.setValue("access", value); }} providerType="tencent-clb" />
)} /> ( {t("workflow.common.certificate.label")} )} /> ( {t("domain.deployment.form.huaweicloud_cdn_region.label")} )} /> ( {t("domain.deployment.form.tencent_clb_resource_type.label")} )} /> ( {t("domain.deployment.form.tencent_clb_loadbalancer_id.label")} )} /> {(resourceType === "ssl-deploy" || resourceType === "listener" || resourceType === "ruledomain") && ( ( {t("domain.deployment.form.tencent_clb_listener_id.label")} )} /> )} {resourceType === "ssl-deploy" && ( ( {t("domain.deployment.form.tencent_clb_domain.label")} )} /> )} {resourceType === "ruledomain" && ( ( {t("domain.deployment.form.tencent_clb_ruledomain.label")} )} /> )}
); }; export default DeployToTencentCLB;