Skip to content

Commit 9cb7227

Browse files
fix(overmind): properly fix statechart transition and devtools root indication
1 parent 0c2a7cb commit 9cb7227

File tree

2 files changed

+87
-83
lines changed

2 files changed

+87
-83
lines changed

packages/node_modules/overmind-devtools-client/src/components/Charts/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ const Charts: FunctionComponent = () => {
4242
backgroundColor: nameToColor(path),
4343
}}
4444
/>
45-
<span className={textStyles.denseNormal}>{path}</span>
45+
<span className={textStyles.denseNormal}>
46+
{path || '[ROOT]'}
47+
</span>
4648
</div>
4749
)
4850
})}

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

Lines changed: 84 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
filter,
66
map,
77
mutate,
8+
parallel,
89
pipe,
910
} from '../'
1011

@@ -192,98 +193,99 @@ export function statechart<C extends IConfiguration, S extends string>(
192193
filter(function canTransition(_, { transition }) {
193194
return Boolean(transition)
194195
}),
195-
mutate(function runAction(context: any, { transition, payload }) {
196-
if (transition === 'entry' || transition === 'exit') {
197-
actions[key](context, payload)
198-
return
199-
}
196+
parallel(
197+
mutate(function runAction(context: any, { transition, payload }) {
198+
if (transition === 'entry' || transition === 'exit') {
199+
return actions[key](context, payload)
200+
}
200201

201-
return actions[key](context, payload)
202-
}),
203-
mutate(function performTransition(context: any) {
204-
const stateTarget = getTarget(
205-
context.state,
206-
context.execution.namespacePath
207-
)
208-
const resolvedActions = getTarget(
209-
context.actions,
210-
context.execution.namespacePath
211-
)
212-
const oldStatePath = stateTarget.state.slice()
213-
const currentStatePath = stateTarget.state.slice()
214-
const stateTransitions = currentStatePath.map(() => null)
215-
216-
// Build new transition path
217-
while (currentStatePath.length) {
218-
const target = getStateTarget(chart, currentStatePath)
219-
220-
// Collect the new transition state
221-
if (target.on && target.on[key]) {
222-
stateTransitions[currentStatePath.length - 1] =
223-
target.on[key].target || target.on[key]
202+
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()
224228
}
225229

226-
currentStatePath.pop()
227-
}
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()
250+
}
228251

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

248-
traverseOldPath.pop()
249-
}
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)
250260

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

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

268-
traverseNewPath.pop()
269-
}
270-
271-
if (process.env.NODE_ENV === 'development') {
272-
currentInstance.devtools.send({
273-
type: 'chart',
274-
data: {
275-
path: context.execution.namespacePath,
276-
state: stateTarget.state,
277-
chart: chart,
278-
actions: getCanTransitionActions(
279-
config.actions,
280-
chart,
281-
stateTarget
282-
),
283-
},
284-
})
285-
}
286-
})
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+
)
287289
)
288290

289291
return aggr

0 commit comments

Comments
 (0)