Skip to content

Variable: PlayRenderer

Documentation / @xmachines/play-solid / PlayRenderer

const PlayRenderer: Component<PlayRendererProps>;

Defined in: PlayRenderer.tsx:66

Main renderer component that subscribes to actor signals and renders UI

Architecture (per XMachines Play patterns):

  • Subscribes to actor.currentView signal via TC39 Signal.subtle.Watcher
  • Dynamically renders catalog components based on view.component string
  • Forwards user events to actor via actor.send()
  • SolidJS signal 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-solidjs";
import { definePlayer } from "@xmachines/play-xstate";
const actor = definePlayer({ machine, catalog })();
actor.start();
const components = {
Dashboard: (props) => <div>User: {props.userId}</div>,
LoginForm: (props) => (
<form onSubmit={(e) => {
e.preventDefault();
props.send({ type: "auth.login", payload: {...} });
}}>...</form>
)
};
<PlayRenderer actor={actor} components={components} />

Param

Component props

Returns

SolidJS 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.

Signal bridge: Uses one-shot re-watch pattern. TC39 Signal watchers stop watching after notification, so watcher.watch() must be called in microtask after getPending() to re-arm for next notification.

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