// Available variables: // - Machine // - interpret // - assign // - send // - sendParent // - spawn // - raise // - actions // - XState (all XState exports) const fetchMachine = Machine({ id: 'fetch', initial: 'idle', context: { item: undefined, retries: 0 }, states: { idle: { on: { FETCH: 'loading', }, after: { 1000: { target: 'loading' } } }, loading: { on: { RESOLVE: 'item', REJECT: 'failure' } }, item: { on: { FETCH: 'loading' } }, failure: { on: { RETRY: { target: 'loading', actions: assign({ retries: (context, event) => context.retries + 1 }) } } } } }); const orderMachine = Machine({ id: 'order', context: { item: undefined }, initial: 'loading', states: { loading: { invoke: { id: 'fetch', src: fetchMachine, onDone: { target: 'nuu', actions: assign({ item: (context, event) => event.data }) }, } }, nuu: { on: { MAKE_PENDING: 'pending', }, }, pending: { on: { ACCEPT: 'accepted', CANCEL: 'canceled', HOLD: 'held', } }, accepted: { on: { UNPEND: 'pending', PROCESS: 'in_process', CANCEL: 'canceled', HOLD: 'held', } }, in_process: { on: { COMPLETE: 'completed', CANCEL: 'canceled', HOLD: 'held', } }, completed: { on: { DELIVER: 'delivered', PICKUP: 'delivered', CANCEL: 'canceled', HOLD: 'held', } }, held: { on: { UNHOLD: 'completed' } }, delivered: { type: 'final' }, canceled: { type: 'final' }, } })