API reference › @evolu/react › createRunBinding

function createRunBinding<
  R extends DisposableRun<any> = DisposableRun<unknown>,
>(): {
  RunContext: FC<{
    children?: ReactNode;
    value: Run<R extends DisposableRun<D> ? D : never>;
  }>;
  useRun: () => Run<R extends DisposableRun<D> ? D : never>;
};

Defined in: Task.ts:75

Creates typed React Context and hook for Run.

The DisposableRun type argument is used to infer the deps type for the returned API, which exposes only Run.

useRun throws when the provider is missing.

Example

import { assertEqual, createRun } from "@evolu/common";
import { createRunBinding } from "@evolu/react";
import type { FC } from "react";
import { renderToString } from "react-dom/server";

interface GreetingDep {
  readonly greeting: string;
}

await using run = createRun<GreetingDep>({ greeting: "Hello" });
const { RunContext, useRun } = createRunBinding<typeof run>();

const Greeting: FC = () => <p>{useRun().deps.greeting}</p>;

assertEqual(
  renderToString(
    <RunContext value={run}>
      <Greeting />
    </RunContext>,
  ),
  "<p>Hello</p>",
);

Testing

Provide a Run with test dependencies to the app's RunContext.

import { assertEqual, testCreateRun, type DisposableRun } from "@evolu/common";
import { createRunBinding } from "@evolu/react";
import type { FC } from "react";
import { renderToString } from "react-dom/server";

interface GreetingDep {
  readonly greeting: string;
}

const { RunContext, useRun } = createRunBinding<DisposableRun<GreetingDep>>();
const Greeting: FC = () => <p>{useRun().deps.greeting}</p>;

await using run = testCreateRun({ greeting: "Hi" });

assertEqual(
  renderToString(
    <RunContext value={run}>
      <Greeting />
    </RunContext>,
  ),
  "<p>Hi</p>",
);