"use client" import { useEffect, useMemo, useRef } from "react" import type { NodePanelRenderProps } from "@flowgram.ai/free-node-panel-plugin" import { useClientContext } from "@flowgram.ai/free-layout-editor" import type { AIWorkflowDefinition, AIWorkflowNodeSpec } from "@/lib/api/admin" import { WorkflowNodeIcon } from "./workflow-node-icon" import { createWorkflowNodeFromSpec } from "./workflow-utils" export function WorkflowLineNodePanel({ position, onSelect, onClose, nodeSpecs, }: NodePanelRenderProps & { nodeSpecs: AIWorkflowNodeSpec[] }) { const context = useClientContext() const panelRef = useRef(null) const insertableNodeSpecs = useMemo( () => nodeSpecs.filter((spec) => spec.type !== "start" && spec.type !== "end"), [nodeSpecs] ) useEffect(() => { const closeOnPointerDown = (event: PointerEvent) => { const target = event.target if (target instanceof Node && panelRef.current?.contains(target)) { return } onClose() } const closeOnEscape = (event: KeyboardEvent) => { if (event.key === "Escape") { onClose() } } window.addEventListener("pointerdown", closeOnPointerDown) window.addEventListener("keydown", closeOnEscape) return () => { window.removeEventListener("pointerdown", closeOnPointerDown) window.removeEventListener("keydown", closeOnEscape) } }, [onClose]) return (
event.stopPropagation()} >
插入节点
{insertableNodeSpecs.map((spec) => ( ))}
) }