Skip to content

Variable: PlayRenderer

Documentation / @xmachines/play-react / PlayRenderer

const PlayRenderer: React.FC<PlayRendererProps>;

Defined in: packages/play-react/src/PlayRenderer.tsx:61

Main renderer component that subscribes to actor signals and renders UI

Architecture (per RESEARCH.md Pattern 1):

  • Subscribes to actor.currentView signal via useSignalEffect
  • Dynamically renders catalog components based on view.component string
  • Forwards user events to actor via actor.send()
  • React state only for triggering renders, NOT business logic

Invariant: Actor Authority - Actor decides all state transitions via guards. Invariant: Passive Infrastructure - Component observes signals and sends events. Invariant: Signal-Only Reactivity - Business logic state lives in actor signals.

Example

import { PlayRenderer } from "@xmachines/play-react";
import { definePlayer } from "@xmachines/play-xstate";
const actor = definePlayer({ machine, catalog })();
actor.start();
const components = {
Dashboard: ({ userId, send }) => <div>User: {userId}</div>,
LoginForm: ({ error, send }) => <form onSubmit={(e) => {
e.preventDefault();
send({ type: "intent", name: "login.submit", payload: {...} });
}}>...</form>
};
<PlayRenderer actor={actor} components={components} />

Param

Component props

Returns

React element rendering current view from actor

Remarks

Component lookup: Dynamically looks up component from components map using view.component string from actor.currentView signal.

Event forwarding: Injects send function as prop to components. Components call send(event) to forward intents to actor. Actor guards decide validity.

Error handling: If component not found in catalog, logs error and shows fallback. This indicates missing component registration, not runtime error.

CRITICAL: Never call actor.send() during render - only in event handlers. Calling send during render causes infinite render loops.