import { useTranslation } from "react-i18next"; import { CloseCircleOutlined as CloseCircleOutlinedIcon, EllipsisOutlined as EllipsisOutlinedIcon } from "@ant-design/icons"; import { Avatar, Button, Card, Dropdown, Popover, Space, Typography } from "antd"; import { produce } from "immer"; import Show from "@/components/Show"; import { deployProvidersMap } from "@/domain/provider"; import { notifyChannelsMap } from "@/domain/settings"; import { WORKFLOW_TRIGGERS, type WorkflowNode, type WorkflowNodeConfigForApply, type WorkflowNodeConfigForDeploy, type WorkflowNodeConfigForNotify, type WorkflowNodeConfigForStart, WorkflowNodeType, } from "@/domain/workflow"; import { useZustandShallowSelector } from "@/hooks"; import { useWorkflowStore } from "@/stores/workflow"; import PanelBody from "./PanelBody"; import { usePanel } from "./PanelProvider"; import AddNode from "./node/AddNode"; export type NodeProps = { node: WorkflowNode; disabled?: boolean; }; const WorkflowElement = ({ node, disabled }: NodeProps) => { const { t } = useTranslation(); const { updateNode, removeNode } = useWorkflowStore(useZustandShallowSelector(["updateNode", "removeNode"])); const { showPanel } = usePanel(); const renderNodeContent = () => { if (!node.validated) { return {t("workflow_node.action.configure_node")}; } switch (node.type) { case WorkflowNodeType.Start: { const config = (node.config as WorkflowNodeConfigForStart) ?? {}; return (
{config.trigger === WORKFLOW_TRIGGERS.AUTO ? t("workflow.props.trigger.auto") : config.trigger === WORKFLOW_TRIGGERS.MANUAL ? t("workflow.props.trigger.manual") : " "} {config.trigger === WORKFLOW_TRIGGERS.AUTO ? config.triggerCron : ""}
); } case WorkflowNodeType.Apply: { const config = (node.config as WorkflowNodeConfigForApply) ?? {}; return {config.domains || " "}; } case WorkflowNodeType.Deploy: { const config = (node.config as WorkflowNodeConfigForDeploy) ?? {}; const provider = deployProvidersMap.get(config.provider); return ( {t(provider?.name ?? "")} ); } case WorkflowNodeType.Notify: { const config = (node.config as WorkflowNodeConfigForNotify) ?? {}; const channel = notifyChannelsMap.get(config.channel as string); return (
{t(channel?.name ?? " ")} {config.subject ?? ""}
); } default: { return <>; } } }; const handleNodeNameBlur = (e: React.FocusEvent) => { const oldName = node.name; const newName = e.target.innerText.trim(); if (oldName === newName) { return; } updateNode( produce(node, (draft) => { draft.name = newName; }) ); }; const handleNodeClick = () => { if (disabled) return; showPanel({ name: node.name, children: , }); }; return ( <> , danger: true, onClick: () => { if (disabled) return; removeNode(node.id); }, }, ], }} trigger={["click"]} >