Skip to content

React Getting Started ​

The React adapter maps graph nodes to React components.

Unlike component-as-node approaches, Graphlet uses stable node IDs such as strings or enums. This makes snapshots, history and debug output readable in development and production.

Install ​

bash
npm install @graphlet/core @graphlet/react

Define nodes ​

You can use strings directly, but enums are convenient for larger flows.

ts
export enum FlowNode {
  Welcome = "welcome",
  Profile = "profile",
  Plan = "plan",
  Review = "review",
  Success = "success"
}

Create React graph ​

tsx
import { createReactGraph } from "@graphlet/react";

import { FlowNode } from "./nodes";

const graph = createReactGraph()(
  [
    [FlowNode.Welcome, [FlowNode.Profile]],
    [FlowNode.Profile, [FlowNode.Plan]],
    [FlowNode.Plan, [FlowNode.Review]],
    [FlowNode.Review, [FlowNode.Plan, FlowNode.Success]],
    [FlowNode.Success, [FlowNode.Welcome]]
  ] as const,
  {
    initial: FlowNode.Welcome,
    components: {
      [FlowNode.Welcome]: WelcomeScreen,
      [FlowNode.Profile]: ProfileScreen,
      [FlowNode.Plan]: PlanScreen,
      [FlowNode.Review]: ReviewScreen,
      [FlowNode.Success]: SuccessScreen
    }
  }
);

Render current node ​

tsx
import { GraphOutlet } from "@graphlet/react";

export function App() {
  return <GraphOutlet graph={graph} />;
}

GraphOutlet passes graph and snapshot to the current component.

tsx
function WelcomeScreen({ graph }) {
  return (
    <button onClick={() => graph.goTo(FlowNode.Profile)}>
      Start
    </button>
  );
}

The component decides when to move to another node.

Graphlet only checks if the target node is allowed by the graph.

Subscribe inside components ​

Use useGraph(graph) when the component needs reactive access to context, history or events.

tsx
import { useGraph } from "@graphlet/react";

function DebugPanel({ graph }) {
  const { snapshot, event } = useGraph(graph);

  return (
    <pre>
      {JSON.stringify({ snapshot, event }, null, 2)}
    </pre>
  );
}