import { useCallback, useState } from 'react' import { ReactFlow, Background, Controls, ControlButton, BackgroundVariant, ConnectionMode, SelectionMode, type Node, type Edge, type Connection, } from '@xyflow/react' import { MousePointer2, Hand } from 'lucide-react' import '@xyflow/react/dist/style.css' import { useCanvasStore } from '@/stores/canvasStore' import { useThemeStore } from '@/stores/themeStore' import { THEMES } from '@/utils/themes' import { nodeTypes } from './nodes/nodeTypes' import { edgeTypes } from './edges/edgeTypes' import { SearchBar } from './SearchBar' import type { NodeData, EdgeData } from '@/types' interface CanvasContainerProps { onConnect?: (connection: Connection) => void onEdgeDoubleClick?: (edge: Edge) => void onNodeDragStart?: () => void } export function CanvasContainer({ onConnect: onConnectProp, onEdgeDoubleClick, onNodeDragStart }: CanvasContainerProps) { const [lassoMode, setLassoMode] = useState(true) const { nodes, edges, onNodesChange, onEdgesChange, setSelectedNode, snapshotHistory, } = useCanvasStore() const activeTheme = useThemeStore((s) => s.activeTheme) const theme = THEMES[activeTheme] const onNodeClick = useCallback((e: React.MouseEvent, node: Node) => { if (e.ctrlKey || e.metaKey) { setSelectedNode(null) } else { setSelectedNode(node.id) } }, [setSelectedNode]) const onPaneClick = useCallback(() => { setSelectedNode(null) }, [setSelectedNode]) const handleEdgeDoubleClick = useCallback((_: React.MouseEvent, edge: Edge) => { onEdgeDoubleClick?.(edge) }, [onEdgeDoubleClick]) return (
{ snapshotHistory(); return true }} selectionOnDrag={lassoMode} panOnDrag={lassoMode ? [1, 2] : true} panActivationKeyCode="Space" selectionMode={SelectionMode.Partial} multiSelectionKeyCode={['Meta', 'Control']} snapToGrid snapGrid={[16, 16]} fitView colorMode={theme.colors.reactFlowColorMode} elevateNodesOnSelect={false} connectionMode={ConnectionMode.Loose} isValidConnection={(connection) => connection.source !== connection.target} > setLassoMode((m) => !m)} title={lassoMode ? 'Switch to pan mode (Space to pan)' : 'Switch to lasso mode'} > {lassoMode ? : }
) }