Skip to content

Hooks

The @omega-flow/editor package provides several React hooks for interacting with the editor state.

useWorkflowEditor

The main hook for accessing workflow editor state and actions.

Import

tsx
import { useWorkflowEditor } from "@omega-flow/editor";

Returns

typescript
interface UseWorkflowEditorReturn {
  // State
  workflow: Workflow | null;
  nodes: Node[];
  edges: Edge[];
  options: WorkflowOptions;
  name: string;
  isDirty: boolean;
  selectedNode: Node | null;
  selectedNodeId: string | null;

  // Actions
  loadWorkflow: (workflow: Workflow) => void;
  resetWorkflow: () => void;
  addNode: (type: string, position: { x: number; y: number }) => void;
  updateNode: (nodeId: string, data: Record<string, unknown>) => void;
  removeNode: (nodeId: string) => void;
  selectNode: (nodeId: string | null) => void;
  addEdge: (connection: Connection) => void;
  removeEdge: (edgeId: string) => void;
  setName: (name: string) => void;
  setOptions: (options: WorkflowOptions) => void;
  getWorkflow: () => Workflow;
  markClean: () => void;
}

State Properties

PropertyTypeDescription
workflowWorkflow | nullOriginal workflow being edited
nodesNode[]Current nodes in the flow
edgesEdge[]Current edges in the flow
optionsWorkflowOptionsWorkflow options (frequency, etc.)
namestringWorkflow name
isDirtybooleanWhether there are unsaved changes
selectedNodeNode | nullCurrently selected node
selectedNodeIdstring | nullID of selected node

Actions

ActionDescription
loadWorkflow(workflow)Load a workflow into the editor
resetWorkflow()Reset to initial/empty state
addNode(type, position)Add a new node at position
updateNode(nodeId, data)Update node data
removeNode(nodeId)Remove a node and its edges
selectNode(nodeId)Select a node (or null to deselect)
addEdge(connection)Add a new edge
removeEdge(edgeId)Remove an edge
setName(name)Set workflow name
setOptions(options)Set workflow options
getWorkflow()Get current workflow state
markClean()Mark workflow as saved (clears dirty flag)

Usage

tsx
import { useWorkflowEditor } from "@omega-flow/editor";

function MyComponent() {
  const {
    workflow,
    nodes,
    isDirty,
    getWorkflow,
    addNode,
    markClean,
  } = useWorkflowEditor();

  const handleSave = async () => {
    const currentWorkflow = getWorkflow();
    await saveToServer(currentWorkflow);
    markClean();
  };

  const handleAddTrigger = () => {
    addNode("Trigger", { x: 100, y: 100 });
  };

  return (
    <div>
      <p>Nodes: {nodes.length}</p>
      <p>Has changes: {isDirty ? "Yes" : "No"}</p>
      <button onClick={handleAddTrigger}>Add Trigger</button>
      <button onClick={handleSave} disabled={!isDirty}>
        Save
      </button>
    </div>
  );
}

useNodes

Hook for working with nodes in the workflow.

Import

tsx
import { useNodes } from "@omega-flow/editor";

Returns

typescript
interface UseNodesReturn {
  nodes: Node[];
  onNodesChange: (changes: NodeChange[]) => void;
  addNode: (type: string, position: { x: number; y: number }) => void;
  updateNode: (nodeId: string, data: Record<string, unknown>) => void;
  removeNode: (nodeId: string) => void;
}
PropertyTypeDescription
nodesNode[]Current nodes array
onNodesChange(changes) => voidHandler for ReactFlow node changes
addNode(type, position) => voidAdd a new node
updateNode(nodeId, data) => voidUpdate node data
removeNode(nodeId) => voidRemove a node

Usage

tsx
import { useNodes } from "@omega-flow/editor";
import { ReactFlow } from "@xyflow/react";

function EditorCanvas() {
  const { nodes, onNodesChange, addNode } = useNodes();

  return (
    <ReactFlow
      nodes={nodes}
      onNodesChange={onNodesChange}
      // ...other props
    />
  );
}

useEdges

Hook for working with edges in the workflow.

Import

tsx
import { useEdges } from "@omega-flow/editor";

Returns

typescript
interface UseEdgesReturn {
  edges: Edge[];
  onEdgesChange: (changes: EdgeChange[]) => void;
  onConnect: (connection: Connection) => void;
  addEdge: (connection: Connection) => void;
  removeEdge: (edgeId: string) => void;
}
PropertyTypeDescription
edgesEdge[]Current edges array
onEdgesChange(changes) => voidHandler for ReactFlow edge changes
onConnect(connection) => voidHandler for new connections
addEdge(connection) => voidAdd a new edge
removeEdge(edgeId) => voidRemove an edge

Usage

tsx
import { useEdges } from "@omega-flow/editor";
import { ReactFlow } from "@xyflow/react";

function EditorCanvas() {
  const { edges, onEdgesChange, onConnect } = useEdges();

  return (
    <ReactFlow
      edges={edges}
      onEdgesChange={onEdgesChange}
      onConnect={onConnect}
      // ...other props
    />
  );
}

useNodeRegistry

Hook for accessing registered node types.

Import

tsx
import { useNodeRegistry } from "@omega-flow/editor";

Returns

typescript
interface UseNodeRegistryReturn {
  nodeTypes: Map<string, NodeTypeDefinition>;
  nodeTypesList: NodeTypeDefinition[];
  reactFlowNodeTypes: NodeTypes;
  registerNodeType: (definition: NodeTypeDefinition) => void;
  getNodeType: (type: string) => NodeTypeDefinition | undefined;
}
PropertyTypeDescription
nodeTypesMap<string, NodeTypeDefinition>Map of type name to definition
nodeTypesListNodeTypeDefinition[]Array of all definitions
reactFlowNodeTypesNodeTypesReactFlow-compatible node types object
registerNodeType(definition) => voidRegister a new node type
getNodeType(type) => NodeTypeDefinitionGet definition by type name

Usage

tsx
import { useNodeRegistry } from "@omega-flow/editor";
import { ReactFlow } from "@xyflow/react";

function EditorCanvas() {
  const { reactFlowNodeTypes, nodeTypesList } = useNodeRegistry();

  return (
    <ReactFlow
      nodeTypes={reactFlowNodeTypes}
      // ...other props
    />
  );
}

Accessing Node Types

tsx
function NodeInfo({ nodeType }: { nodeType: string }) {
  const { getNodeType } = useNodeRegistry();
  const definition = getNodeType(nodeType);

  if (!definition) return <span>Unknown type</span>;

  return (
    <div>
      <h3>{definition.label}</h3>
      <p>{definition.description}</p>
    </div>
  );
}

useDragAndDrop

Hook for handling drag-and-drop from the nodes panel to the canvas.

Import

tsx
import { useDragAndDrop } from "@omega-flow/editor";

Returns

typescript
interface UseDragAndDropReturn {
  onDragStart: (event: React.DragEvent, nodeType: string) => void;
  onDragOver: (event: React.DragEvent) => void;
  onDrop: (event: React.DragEvent) => void;
}
PropertyTypeDescription
onDragStart(event, nodeType) => voidStart dragging a node type
onDragOver(event) => voidHandle drag over canvas
onDrop(event) => voidHandle drop on canvas

Usage

tsx
import { useDragAndDrop } from "@omega-flow/editor";
import { ReactFlow } from "@xyflow/react";

function EditorCanvas() {
  const { onDragOver, onDrop } = useDragAndDrop();

  return (
    <ReactFlow
      onDragOver={onDragOver}
      onDrop={onDrop}
      // ...other props
    />
  );
}

Custom Drag Source

If building a custom nodes panel:

tsx
function CustomNodesPanel() {
  const { onDragStart } = useDragAndDrop();

  return (
    <div>
      <div
        draggable
        onDragStart={(e) => onDragStart(e, "Trigger")}
      >
        Trigger Node
      </div>
      <div
        draggable
        onDragStart={(e) => onDragStart(e, "Action")}
      >
        Action Node
      </div>
    </div>
  );
}

useSelectedNode

Hook for working with the currently selected node.

Import

tsx
import { useSelectedNode } from "@omega-flow/editor";

Returns

typescript
interface UseSelectedNodeReturn {
  selectedNode: Node | null;
  selectedNodeId: string | null;
  nodeType: NodeTypeDefinition | undefined;
  selectNode: (nodeId: string | null) => void;
  updateSelectedNode: (data: Record<string, unknown>) => void;
  removeSelectedNode: () => void;
}
PropertyTypeDescription
selectedNodeNode | nullThe selected node object
selectedNodeIdstring | nullID of selected node
nodeTypeNodeTypeDefinition | undefinedDefinition for selected node type
selectNode(nodeId) => voidSelect a node
updateSelectedNode(data) => voidUpdate selected node's data
removeSelectedNode() => voidRemove the selected node

Usage

tsx
import { useSelectedNode } from "@omega-flow/editor";

function SelectionInfo() {
  const {
    selectedNode,
    nodeType,
    updateSelectedNode,
    removeSelectedNode,
  } = useSelectedNode();

  if (!selectedNode) {
    return <p>No node selected</p>;
  }

  return (
    <div>
      <h3>{nodeType?.label || selectedNode.type}</h3>
      <p>ID: {selectedNode.id}</p>
      <button onClick={removeSelectedNode}>Delete</button>
    </div>
  );
}

Context Hook

For advanced use cases, you can access the raw context:

tsx
import { useWorkflowEditorContext } from "@omega-flow/editor";

function AdvancedComponent() {
  const context = useWorkflowEditorContext();
  // Access all state and actions directly
}

WARNING

Prefer the specialized hooks (useWorkflowEditor, useNodes, etc.) over direct context access for better encapsulation.