({
open,
onOpenChange,
children
}: NodeSelectorProps)
| 94 | }; |
| 95 | |
| 96 | export function NodeSelector({ |
| 97 | open, |
| 98 | onOpenChange, |
| 99 | children |
| 100 | }: NodeSelectorProps) { |
| 101 | const { setNodes, getNodes, screenToFlowPosition } = useReactFlow(); |
| 102 | |
| 103 | const handleNodeSelect = useCallback((selection: NodeTypeOption) => { |
| 104 | // Check if trying to add a manual trigger when one already exists |
| 105 | if (selection.type === NodeType.MANUAL_TRIGGER) { |
| 106 | const nodes = getNodes(); |
| 107 | const hasManualTrigger = nodes.some( |
| 108 | (node) => node.type === NodeType.MANUAL_TRIGGER, |
| 109 | ); |
| 110 | |
| 111 | if (hasManualTrigger) { |
| 112 | toast.error("Only one manual trigger is allowed per workflow"); |
| 113 | return; |
| 114 | } |
| 115 | } |
| 116 | |
| 117 | setNodes((nodes) => { |
| 118 | const hasInitialTrigger = nodes.some( |
| 119 | (node) => node.type === NodeType.INITIAL, |
| 120 | ); |
| 121 | |
| 122 | const centerX = window.innerWidth / 2; |
| 123 | const centerY = window.innerHeight / 2; |
| 124 | |
| 125 | const flowPosition = screenToFlowPosition({ |
| 126 | x: centerX + (Math.random() - 0.5) * 200, |
| 127 | y: centerY + (Math.random() - 0.5) * 200, |
| 128 | }); |
| 129 | |
| 130 | const newNode = { |
| 131 | id: createId(), |
| 132 | data: {}, |
| 133 | position: flowPosition, |
| 134 | type: selection.type, |
| 135 | }; |
| 136 | |
| 137 | if (hasInitialTrigger) { |
| 138 | return [newNode]; |
| 139 | } |
| 140 | |
| 141 | return [...nodes, newNode]; |
| 142 | }); |
| 143 | |
| 144 | onOpenChange(false); |
| 145 | }, [ |
| 146 | setNodes, |
| 147 | getNodes, |
| 148 | onOpenChange, |
| 149 | screenToFlowPosition, |
| 150 | ]); |
| 151 | |
| 152 | return ( |
| 153 | <Sheet open={open} onOpenChange={onOpenChange}> |
nothing calls this directly
no outgoing calls
no test coverage detected