Hello everyone, I'm new to xstate and I'm trying to make a wrapper to have something reusable with React
So based on this code https://github.com/astahmer/pastable/blob/main/src/react/createContextWithHook.ts
I tried to adapt it to work with xstate hooks
import { useActor, useSelector } from '@xstate/react'
import type { ContextFrom, EventFrom, InterpreterFrom, StateFrom, StateMachine } from 'xstate'
import { createContextWithHook } from './createContextWithHooks'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export const createContextForMachineWithHooks = <
TMachine extends StateMachine<ContextFrom<TMachine>, StateFrom<TMachine>, EventFrom<TMachine>>
>({
name,
}: {
name: string
}) => {
const {
Consumer,
Provider,
hook: useAppService,
Context,
} = createContextWithHook<InterpreterFrom<TMachine>>(name, {
name: name,
})
const useAppActor = () => {
const machine = useAppService()
return useActor(machine)
}
const useAppSend = () => {
const machine = useAppService()
return machine.send
}
const useAppSelector = <T>(selector: (state: StateFrom<TMachine>) => T) => {
const machine = useAppService()
return useSelector(machine, selector)
}
return {
Consumer,
Provider,
useAppService,
Context,
useAppActor,
useAppSend,
useAppSelector,
}
}
Then
//TODO: Wanna Cry ? 🤯
export const {
Provider,
useAppService,
useAppSelector: useEditorSelector,
useAppSend: useEditorSend,
useAppActor: useEditorActor,
} = createContextForMachineWithHooks<typeof editorMachine>({
name: 'editorMachineReactContext',
machine: editorMachine,
})
export const EditorPage = (): JSX.Element => {
const editorMachineService = useInterpret(editorMachine, {
context: {},
})
return (
<Provider value={editorMachineService}>
Everything works at runtime, but I don't have the typegen, so I don't have the typing for the events