import { memo, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Alert, Button, Form, Input, Radio } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import dayjs from "dayjs"; import { produce } from "immer"; import { z } from "zod"; import Show from "@/components/Show"; import { WORKFLOW_TRIGGERS, type WorkflowNode, type WorkflowNodeConfigAsStart } from "@/domain/workflow"; import { useAntdForm, useZustandShallowSelector } from "@/hooks"; import { useWorkflowStore } from "@/stores/workflow"; import { getNextCronExecutions, validCronExpression } from "@/utils/cron"; import { usePanel } from "../PanelProvider"; export type StartNodeFormProps = { node: WorkflowNode; }; const initFormModel = (): WorkflowNodeConfigAsStart => { return { trigger: WORKFLOW_TRIGGERS.AUTO, triggerCron: "0 0 * * *", }; }; const StartNodeForm = ({ node }: StartNodeFormProps) => { const { t } = useTranslation(); const { updateNode } = useWorkflowStore(useZustandShallowSelector(["updateNode"])); const { hidePanel } = usePanel(); const formSchema = z .object({ trigger: z.string({ message: t("workflow_node.start.form.trigger.placeholder") }).min(1, t("workflow_node.start.form.trigger.placeholder")), triggerCron: z.string().nullish(), }) .superRefine((data, ctx) => { if (data.trigger !== WORKFLOW_TRIGGERS.AUTO) { return; } if (!validCronExpression(data.triggerCron!)) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: t("workflow_node.start.form.trigger_cron.errmsg.invalid"), path: ["triggerCron"], }); } }); const formRule = createSchemaFieldRule(formSchema); const { form: formInst, formPending, formProps, } = useAntdForm>({ initialValues: (node?.config as WorkflowNodeConfigAsStart) ?? initFormModel(), onSubmit: async (values) => { await formInst.validateFields(); await updateNode( produce(node, (draft) => { draft.config = { ...values }; draft.validated = true; }) ); hidePanel(); }, }); const fieldTrigger = Form.useWatch("trigger", formInst); const fieldTriggerCron = Form.useWatch("triggerCron", formInst); const [fieldTriggerCronExpectedExecutions, setFieldTriggerCronExpectedExecutions] = useState([]); useEffect(() => { setFieldTriggerCronExpectedExecutions(getNextCronExecutions(fieldTriggerCron, 5)); }, [fieldTriggerCron]); const handleTriggerChange = (value: string) => { if (value === WORKFLOW_TRIGGERS.AUTO) { formInst.setFieldValue("triggerCron", formInst.getFieldValue("triggerCron") || initFormModel().triggerCron); } }; return (
} > handleTriggerChange(e.target.value)}> {t("workflow_node.start.form.trigger.option.auto.label")} {t("workflow_node.start.form.trigger.option.manual.label")} } />
); }; export default memo(StartNodeForm);