import { memo, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { Avatar, Flex, Typography } from "antd"; import { produce } from "immer"; import { notificationProvidersMap } from "@/domain/provider"; import { notifyChannelsMap } from "@/domain/settings"; import { type WorkflowNodeConfigForNotify, WorkflowNodeType } from "@/domain/workflow"; import { useZustandShallowSelector } from "@/hooks"; import { useWorkflowStore } from "@/stores/workflow"; import SharedNode, { type SharedNodeProps } from "./_SharedNode"; import NotifyNodeConfigForm, { type NotifyNodeConfigFormInstance } from "./NotifyNodeConfigForm"; export type NotifyNodeProps = SharedNodeProps; const NotifyNode = ({ node, disabled }: NotifyNodeProps) => { if (node.type !== WorkflowNodeType.Notify) { console.warn(`[certimate] current workflow node type is not: ${WorkflowNodeType.Notify}`); } const { t } = useTranslation(); const { updateNode } = useWorkflowStore(useZustandShallowSelector(["updateNode"])); const formRef = useRef(null); const [formPending, setFormPending] = useState(false); const [drawerOpen, setDrawerOpen] = useState(false); const getFormValues = () => formRef.current!.getFieldsValue() as WorkflowNodeConfigForNotify; const wrappedEl = useMemo(() => { if (node.type !== WorkflowNodeType.Notify) { console.warn(`[certimate] current workflow node type is not: ${WorkflowNodeType.Notify}`); } if (!node.validated) { return {t("workflow_node.action.configure_node")}; } const config = (node.config as WorkflowNodeConfigForNotify) ?? {}; const channel = notifyChannelsMap.get(config.channel as string); const provider = notificationProvidersMap.get(config.provider); return ( {t(channel?.name ?? provider?.name ?? " ")} {config.subject ?? ""} ); }, [node]); const handleDrawerConfirm = async () => { setFormPending(true); try { await formRef.current!.validateFields(); } catch (err) { setFormPending(false); throw err; } try { const newValues = getFormValues(); const newNode = produce(node, (draft) => { draft.config = { ...newValues, }; draft.validated = true; }); await updateNode(newNode); } finally { setFormPending(false); } }; return ( <> setDrawerOpen(true)}> {wrappedEl} setDrawerOpen(open)} getFormValues={() => formRef.current!.getFieldsValue()} > ); }; export default memo(NotifyNode);