Skip to content

Instantly share code, notes, and snippets.

@hypeJunction
Last active February 13, 2021 19:03
Show Gist options
  • Select an option

  • Save hypeJunction/cd0abe49ac373973f004a84c0809f47a to your computer and use it in GitHub Desktop.

Select an option

Save hypeJunction/cd0abe49ac373973f004a84c0809f47a to your computer and use it in GitHub Desktop.
export function useMachineTransition (transitionName) {
const {
states,
state,
setState,
context,
setContext,
} = useContext(StateMachineContext)
return useAsyncCallback(async (payload = {}) => {
const definition = states?.[state]?.[transitionName]
if (typeof definition === 'undefined') {
throw new Error(`Invalid transition ${transitionName} from ${state}`)
}
let snapshot = Object.freeze({ ...context })
const setSnapshot = (fn) => {
snapshot = Object.freeze(fn(snapshot))
}
await definition.handlers.reduce((prev, cur) => {
return prev.then(() => cur({
context: snapshot,
setContext: setSnapshot,
}, payload))
}, Promise.resolve())
setState(definition.target)
setContext({ ...snapshot })
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment