Use XState Machines as components.
ember install ember-statechart-component
# or
npm install ember-statechart-component
# or
yarn add ember-statechart-componentTo be able to use XState state.matches
method in our templates,
we will first need a HelperManager for
handling vanilla functions.
ember-functions-as-helper-polyfill
provides one:
ember install ember-functions-as-helper-polyfill
# or
npm install ember-functions-as-helper-polyfill
# or
yarn add ember-functions-as-helper-polyfillExample with Ember Octane
// app/components/toggle.js
import { createMachine } from 'xstate';
export default createMachine({
initial: 'inactive',
states: {
inactive: { on: { TOGGLE: 'active' } },
active: { on: { TOGGLE: 'inactive' } },
},
});Usage:
The default template for every createMachine(..) is
but that can be overriden to suit your needs by defining your own template.
The this is an instance of the XState Interpreter
// app/components/authenticated-toggle.js
import { getService } from 'ember-statechart-component';
import { createMachine } from 'xstate';
export default createMachine({
initial: 'inactive',
states: {
inactive: {
on: {
TOGGLE: [
{
target: 'active',
cond: 'isAuthenticated',
},
{ actions: ['notify'] },
],
},
},
active: { on: { TOGGLE: 'inactive' } },
},
}, {
actions: {
notify: (ctx) => {
getService(ctx, 'toasts').notify('You must be logged in');
},
},
guards: {
isAuthenticated: (ctx) => getService(ctx, 'session').isAuthenticated,
},
});Usage:
This argument allows you to pass a MachineConfig for actions, services, guards, etc.
Usage:
Toggle machine that needs a config
// app/components/toggle.js
import { createMachine, assign } from 'xstate';
export default createMachine({
initial: 'inactive',
states: {
inactive: { on: { TOGGLE: 'active' } },
active: {
on: {
TOGGLE: {
target: 'inactive',
actions: ['toggleIsOn']
}
}
},
},
});Sets the initial context. The current value of the context can then be accessed via state.context.
Usage:
Toggle machine that interacts with context
// app/components/toggle.js
import { createMachine, assign } from 'xstate';
export default createMachine({
initial: 'inactive',
states: {
inactive: {
on: {
TOGGLE: {
target: 'active',
actions: ['increaseCounter']
}
}
},
active: {
on: {
TOGGLE: {
target: 'inactive',
actions: ['increaseCounter']
}
}
},
},
}, {
actions: {
increaseCounter: assign({
counter: (context) => context.counter + 1
})
}
});The machine will use @state as the initial state.
Any changes to this argument
are not automatically propagated to the machine.
An ARGS_UPDATE event (see details below) is sent instead.
An event will be sent to the machine for you, ARGS_UPDATE, along
with all named arguments used to invoke the component.
- Ember.js v3.25 or above
- Node.js v12 or above
- A browser that supports Proxy
See the Contributing guide for details.
This project is licensed under the MIT License.