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 { type WorkflowNode, 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; }; const WorkflowElement = ({ node }: 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: { return (
{node.config?.executionMethod === "auto" ? t("workflow.props.trigger.auto") : node.config?.executionMethod === "manual" ? t("workflow.props.trigger.manual") : ""} {node.config?.executionMethod === "auto" ? (node.config?.crontab as string) : ""}
); } case WorkflowNodeType.Apply: { return {node.config?.domain as string}; } case WorkflowNodeType.Deploy: { const provider = deployProvidersMap.get(node.config?.provider as string); return ( {t(provider?.name ?? "")} ); } case WorkflowNodeType.Notify: { const channel = notifyChannelsMap.get(node.config?.channel as string); return (
{t(channel?.name ?? "")} {(node.config?.subject as string) ?? ""}
); } 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 = () => { showPanel({ name: node.name, children: , }); }; return ( <> , danger: true, onClick: () => { removeNode(node.id); }, }, ], }} trigger={["click"]} >