Skip to content

Commit ebf5e0f

Browse files
refactor(overmind): change how statecharts transition for better devtools
1 parent 807abfb commit ebf5e0f

File tree

1 file changed

+82
-83
lines changed

1 file changed

+82
-83
lines changed

packages/node_modules/overmind/src/config/statechart.ts

Lines changed: 82 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -193,99 +193,98 @@ export function statechart<C extends IConfiguration, S extends string>(
193193
filter(function canTransition(_, { transition }) {
194194
return Boolean(transition)
195195
}),
196-
parallel(
197-
mutate(function runAction(context: any, { transition, payload }) {
198-
if (transition === 'entry' || transition === 'exit') {
199-
return actions[key](context, payload)
200-
}
201-
196+
mutate(function runAction(context: any, { transition, payload }) {
197+
if (transition === 'entry' || transition === 'exit') {
202198
return actions[key](context, payload)
203-
}),
204-
mutate(function performTransition(context: any) {
205-
const stateTarget = getTarget(
206-
context.state,
207-
context.execution.namespacePath
208-
)
209-
const resolvedActions = getTarget(
210-
context.actions,
211-
context.execution.namespacePath
212-
)
213-
const oldStatePath = stateTarget.state.slice()
214-
const currentStatePath = stateTarget.state.slice()
215-
const stateTransitions = currentStatePath.map(() => null)
216-
217-
// Build new transition path
218-
while (currentStatePath.length) {
219-
const target = getStateTarget(chart, currentStatePath)
220-
221-
// Collect the new transition state
222-
if (target.on && target.on[key]) {
223-
stateTransitions[currentStatePath.length - 1] =
224-
target.on[key].target || target.on[key]
225-
}
226-
227-
currentStatePath.pop()
228-
}
199+
}
229200

230-
const newStatePath = createNewStatePath(
231-
stateTarget.state,
232-
stateTransitions,
233-
chart
234-
)
235-
236-
// Go down old path and trigger exits where the state has changed
237-
const traverseOldPath = oldStatePath.slice()
238-
while (traverseOldPath.length) {
239-
const target = getStateTarget(chart, traverseOldPath)
240-
241-
if (
242-
target.exit &&
243-
newStatePath[traverseOldPath.length - 1] !==
244-
oldStatePath[traverseOldPath.length - 1]
245-
) {
246-
resolvedActions[target.exit]()
247-
}
248-
249-
traverseOldPath.pop()
201+
const result = actions[key](context, payload)
202+
203+
const stateTarget = getTarget(
204+
context.state,
205+
context.execution.namespacePath
206+
)
207+
const resolvedActions = getTarget(
208+
context.actions,
209+
context.execution.namespacePath
210+
)
211+
const oldStatePath = stateTarget.state.slice()
212+
const currentStatePath = stateTarget.state.slice()
213+
const stateTransitions = currentStatePath.map(() => null)
214+
215+
// Build new transition path
216+
while (currentStatePath.length) {
217+
const target = getStateTarget(chart, currentStatePath)
218+
219+
// Collect the new transition state
220+
if (target.on && target.on[key]) {
221+
stateTransitions[currentStatePath.length - 1] =
222+
target.on[key].target || target.on[key]
250223
}
251224

252-
if (newStatePath.join() !== oldStatePath.join()) {
253-
stateTarget.state = newStatePath.slice()
225+
currentStatePath.pop()
226+
}
227+
228+
const newStatePath = createNewStatePath(
229+
stateTarget.state,
230+
stateTransitions,
231+
chart
232+
)
233+
234+
// Go down old path and trigger exits where the state has changed
235+
const traverseOldPath = oldStatePath.slice()
236+
while (traverseOldPath.length) {
237+
const target = getStateTarget(chart, traverseOldPath)
238+
239+
if (
240+
target.exit &&
241+
newStatePath[traverseOldPath.length - 1] !==
242+
oldStatePath[traverseOldPath.length - 1]
243+
) {
244+
resolvedActions[target.exit]()
254245
}
255246

256-
// Go down new path and trigger any entry on new states
257-
const traverseNewPath = newStatePath.slice()
258-
while (traverseNewPath.length) {
259-
const target = getStateTarget(chart, traverseNewPath)
247+
traverseOldPath.pop()
248+
}
260249

261-
if (
262-
target.entry &&
263-
newStatePath[traverseNewPath.length - 1] !==
264-
oldStatePath[traverseNewPath.length - 1]
265-
) {
266-
resolvedActions[target.entry]()
267-
}
250+
if (newStatePath.join() !== oldStatePath.join()) {
251+
stateTarget.state = newStatePath.slice()
252+
}
268253

269-
traverseNewPath.pop()
254+
// Go down new path and trigger any entry on new states
255+
const traverseNewPath = newStatePath.slice()
256+
while (traverseNewPath.length) {
257+
const target = getStateTarget(chart, traverseNewPath)
258+
259+
if (
260+
target.entry &&
261+
newStatePath[traverseNewPath.length - 1] !==
262+
oldStatePath[traverseNewPath.length - 1]
263+
) {
264+
resolvedActions[target.entry]()
270265
}
271266

272-
if (process.env.NODE_ENV === 'development') {
273-
currentInstance.devtools.send({
274-
type: 'chart',
275-
data: {
276-
path: context.execution.namespacePath,
277-
state: stateTarget.state,
278-
chart: chart,
279-
actions: getCanTransitionActions(
280-
config.actions,
281-
chart,
282-
stateTarget
283-
),
284-
},
285-
})
286-
}
287-
})
288-
)
267+
traverseNewPath.pop()
268+
}
269+
270+
if (process.env.NODE_ENV === 'development') {
271+
currentInstance.devtools.send({
272+
type: 'chart',
273+
data: {
274+
path: context.execution.namespacePath,
275+
state: stateTarget.state,
276+
chart: chart,
277+
actions: getCanTransitionActions(
278+
config.actions,
279+
chart,
280+
stateTarget
281+
),
282+
},
283+
})
284+
}
285+
286+
return result
287+
})
289288
)
290289

291290
return aggr

0 commit comments

Comments
 (0)