* Internal canvas component that uses the contexts
({
initialFlow,
readOnly,
onFlowChange,
onSave,
onFlowGenerated,
showDefaultHeader = true,
enableGenerator = true,
showDefaultPalette = true,
canvasActions,
renderHeader,
renderNodePalette
}: {
initialFlow?: FlowData
readOnly?: boolean
onFlowChange?: FlowDataCallback
onSave?: FlowDataCallback
onFlowGenerated?: FlowDataCallback
showDefaultHeader?: boolean
showDefaultPalette?: boolean
enableGenerator?: boolean
canvasActions?: AgentflowProps['canvasActions']
renderHeader?: AgentflowProps['renderHeader']
renderNodePalette?: AgentflowProps['renderNodePalette']
})
| 33 | * Internal canvas component that uses the contexts |
| 34 | */ |
| 35 | function AgentflowCanvas({ |
| 36 | initialFlow, |
| 37 | readOnly, |
| 38 | onFlowChange, |
| 39 | onSave, |
| 40 | onFlowGenerated, |
| 41 | showDefaultHeader = true, |
| 42 | enableGenerator = true, |
| 43 | showDefaultPalette = true, |
| 44 | canvasActions, |
| 45 | renderHeader, |
| 46 | renderNodePalette |
| 47 | }: { |
| 48 | initialFlow?: FlowData |
| 49 | readOnly?: boolean |
| 50 | onFlowChange?: FlowDataCallback |
| 51 | onSave?: FlowDataCallback |
| 52 | onFlowGenerated?: FlowDataCallback |
| 53 | showDefaultHeader?: boolean |
| 54 | showDefaultPalette?: boolean |
| 55 | enableGenerator?: boolean |
| 56 | canvasActions?: AgentflowProps['canvasActions'] |
| 57 | renderHeader?: AgentflowProps['renderHeader'] |
| 58 | renderNodePalette?: AgentflowProps['renderNodePalette'] |
| 59 | }) { |
| 60 | const { |
| 61 | state, |
| 62 | syncNodesFromReactFlow, |
| 63 | syncEdgesFromReactFlow, |
| 64 | setDirty, |
| 65 | setReactFlowInstance, |
| 66 | closeEditDialog, |
| 67 | registerLocalStateSetters, |
| 68 | registerOnFlowChange, |
| 69 | setComponentNodes, |
| 70 | syncNodes, |
| 71 | hasOutdatedNodes |
| 72 | } = useAgentflowContext() |
| 73 | const { isDarkMode } = useConfigContext() |
| 74 | const agentflow = useAgentflow() |
| 75 | const reactFlowWrapper = useRef<HTMLDivElement>(null) |
| 76 | |
| 77 | // Memoize ReactFlow colors from theme tokens |
| 78 | const reactFlowColors = useMemo(() => { |
| 79 | const mode = isDarkMode ? 'dark' : 'light' |
| 80 | return { |
| 81 | minimapNode: tokens.colors.reactflow.minimap.node[mode], |
| 82 | minimapNodeStroke: tokens.colors.reactflow.minimap.nodeStroke[mode], |
| 83 | minimapBackground: tokens.colors.reactflow.minimap.background[mode], |
| 84 | minimapMask: tokens.colors.reactflow.minimap.mask[mode], |
| 85 | backgroundDots: tokens.colors.reactflow.background.dots[mode] |
| 86 | } |
| 87 | }, [isDarkMode]) |
| 88 | |
| 89 | const safeInitialNodes = Array.isArray(initialFlow?.nodes) ? initialFlow.nodes : [] |
| 90 | const safeInitialEdges = Array.isArray(initialFlow?.edges) ? initialFlow.edges : [] |
| 91 | const [nodes, setLocalNodes, onNodesChange] = useNodesState(safeInitialNodes) |
| 92 | const [edges, setLocalEdges, onEdgesChange] = useEdgesState(safeInitialEdges) |
nothing calls this directly
no test coverage detected