import { MachineRunner } from '@actyx/machine-runner' import { useEffect, useState } from 'react' import { PrintState } from './UIMachineCommon.js' import { UIPassengerAuction, UIPassengerInitial, UIPassengerRide } from './UIMachinePassenger.js' import { UITaxiAuction, UITaxiFirstBid, UITaxiInitial, UITaxiRide } from './UIMachineTaxi.js' import { Passenger, Taxi, protocol } from './machines/index.js' type ThisMachineRunner = MachineRunner.Of type EventMap = MachineRunner.EventMapOf export const UIMachine = ({ machine, name, }: { name: string machine: MachineRunner.Of }) => { const [state, setState] = useState(machine.get()) useEffect(() => { const onChange: EventMap['change'] = (state) => setState(state) machine.events.on('change', onChange) return () => { machine.events.off('change', onChange) } }, [machine.id]) if (state && state.is(Passenger.Auction)) { const { bids } = state.payload // just to demonstrate that `state.is()` works // inside this block the type below will fail // state.cast(AuctionT) console.log(bids) } return (
{state && ( <> {state.is(Passenger.Initial) && } {state.is(Passenger.Auction) && } {state.is(Passenger.Ride) && } {state.is(Taxi.Initial) && } {state.is(Taxi.FirstBid) && } {state.is(Taxi.Auction) && } {state.is(Taxi.Ride) && } )}
) }