Skip to content

Instantly share code, notes, and snippets.

@J4si3k
Forked from darrenjennings/useMachine.ts
Created September 17, 2022 08:55
Show Gist options
  • Save J4si3k/4da4ae348460f6070320f8d9e559fcf6 to your computer and use it in GitHub Desktop.
Save J4si3k/4da4ae348460f6070320f8d9e559fcf6 to your computer and use it in GitHub Desktop.
vue useMachine.ts
import { StateMachine, interpret, EventObject } from '@xstate/fsm'
import { ref, Ref, onBeforeMount } from '@vue/composition-api'
export default function useMachine<TContext, TEvent extends EventObject = EventObject> (
stateMachine: StateMachine.Machine<TContext, TEvent, any>): {
current: Ref<StateMachine.State<TContext, TEvent, any>>,
send: StateMachine.Service<TContext, TEvent>['send'],
service: StateMachine.Service<TContext, TEvent>,
} {
const current = ref(stateMachine.initialState) as Ref<StateMachine.State<TContext, TEvent, any>>
const service = interpret(stateMachine).start()
onBeforeMount(() => {
service.subscribe(state => {
current.value = state
})
})
return {
current,
send: service.send,
service
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment