import { forwardRef, memo, useImperativeHandle } from "react"; import { useTranslation } from "react-i18next"; import { Alert, Form, type FormInstance, Input, InputNumber } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; import { type WorkflowNodeConfigForMonitor } from "@/domain/workflow"; import { useAntdForm } from "@/hooks"; import { validDomainName, validIPv4Address, validIPv6Address, validPortNumber } from "@/utils/validators"; type MonitorNodeConfigFormFieldValues = Partial; export type MonitorNodeConfigFormProps = { className?: string; style?: React.CSSProperties; disabled?: boolean; initialValues?: MonitorNodeConfigFormFieldValues; onValuesChange?: (values: MonitorNodeConfigFormFieldValues) => void; }; export type MonitorNodeConfigFormInstance = { getFieldsValue: () => ReturnType["getFieldsValue"]>; resetFields: FormInstance["resetFields"]; validateFields: FormInstance["validateFields"]; }; const initFormModel = (): MonitorNodeConfigFormFieldValues => { return { host: "", port: 443, requestPath: "/", }; }; const MonitorNodeConfigForm = forwardRef( ({ className, style, disabled, initialValues, onValuesChange }, ref) => { const { t } = useTranslation(); const formSchema = z.object({ host: z.string().refine((v) => { return validDomainName(v) || validIPv4Address(v) || validIPv6Address(v); }, t("common.errmsg.host_invalid")), port: z.preprocess( (v) => Number(v), z .number() .int(t("workflow_node.monitor.form.port.placeholder")) .refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")) ), domain: z .string() .nullish() .refine((v) => { if (!v) return true; return validDomainName(v); }, t("common.errmsg.domain_invalid")), requestPath: z.string().nullish(), }); const formRule = createSchemaFieldRule(formSchema); const { form: formInst, formProps } = useAntdForm({ name: "workflowNodeMonitorConfigForm", initialValues: initialValues ?? initFormModel(), }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as MonitorNodeConfigFormFieldValues); }; useImperativeHandle(ref, () => { return { getFieldsValue: () => { return formInst.getFieldsValue(true); }, resetFields: (fields) => { return formInst.resetFields(fields as (keyof MonitorNodeConfigFormFieldValues)[]); }, validateFields: (nameList, config) => { return formInst.validateFields(nameList, config); }, } as MonitorNodeConfigFormInstance; }); return (
} />
); } ); export default memo(MonitorNodeConfigForm);