Skip to content

Instantly share code, notes, and snippets.

@Zlass
Created August 5, 2020 15:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Zlass/ba914b70f993f195d148fb3905636232 to your computer and use it in GitHub Desktop.
Save Zlass/ba914b70f993f195d148fb3905636232 to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
const States = {
collapsed: 'collapsed',
expanded: 'expanded',
};
const Event = {
expand: 'expand',
collapse: 'collapse',
batteryStateChange: 'battery-state-change',
levelChange: 'level_change',
};
const BatteryState = {
LowBattery: 'low-battery',
NotCharging: 'not-charging',
Charging: 'charging',
};
const CombinedBatteryStateConfig = {
initial: BatteryState.NotCharging,
context: {
level: 1,
batteries: {
left: {
charging: false,
level: 1,
},
right: {
charging: false,
level: 1,
},
},
},
states: {
[BatteryState.NotCharging]: {
always: [{ target: BatteryState.LowBattery, cond: 'AnyBatteryLow' }],
on: {
[Event.batteryStateChange]: [
{
target: BatteryState.Charging,
cond: 'BothBatteriesCharging',
action: 'AssignBatteryStatus',
},
{
action: 'AssignBatteryStatus',
},
],
},
},
[BatteryState.Charging]: {
on: {
[Event.batteryStateChange]: {
target: BatteryState.NotCharging,
cond: 'AnyBatteryNotCharging',
action: 'AssignBatteryStatus',
},
},
},
[BatteryState.LowBattery]: {},
},
};
const SingleBatteryStateConfig = (side, level, status) => ({
initial: status,
context: {
side,
level,
},
states: {
[BatteryState.Charging]: {
on: {
[Event.batteryStateChange]: {
target: BatteryState.NotCharging,
cond: 'IsNoLongerCharging',
},
},
},
[BatteryState.NotCharging]: {
always: [{ target: BatteryState.LowBattery, cond: 'LowBatteryLevel' }],
on: {
[Event.batteryStateChange]: {
target: BatteryState.Charging,
cond: 'IsCharging',
},
},
},
[BatteryState.LowBattery]: {
on: {
[Event.batteryStateChange]: {
target: BatteryState.Charging,
cond: 'IsCharging',
},
},
},
},
});
const BatteryStatusMachine = Machine({
id: 'BatteryCollapseMachine',
initial: States.collapsed,
states: {
[States.collapsed]: {
on: {
[Event.expand]: States.expanded,
},
...CombinedBatteryStateConfig,
},
[States.expanded]: {
type: 'parallel',
on: {
[Event.collapse]: States.collapsed,
},
states: {
left: { ...SingleBatteryStateConfig('left', 1, BatteryState.NotCharging) },
right: { ...SingleBatteryStateConfig('right', 1, BatteryState.NotCharging) },
},
},
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment