Skip to content

Instantly share code, notes, and snippets.

@send2moran
Created January 23, 2022 10:08
Show Gist options
  • Save send2moran/90588b7522d2b3de4b5bbca76ebe0910 to your computer and use it in GitHub Desktop.
Save send2moran/90588b7522d2b3de4b5bbca76ebe0910 to your computer and use it in GitHub Desktop.
useInterpret, useService, useSelector
import { useInterpret, useService, useSelector } from '@xstate/react'
const MyMachineService = React.createContext()
const useMyMachineService = () => {
const service = React.useContext(MyMachineService)
if (!service) {
throw new Error(`useMyMachineService() must be used in a child of <MyMachineProvider>`)
}
return service
}
const MyMachineProvider = (props) => {
const service = useInterpret(myMachine)
return <MyMachineService.Provider value={service}>{props.children}</MyMachineService.Provider>
}
const App = () => {
return <MyMachineProvider>
<SomeComponentThatCouldBeDeepInTheTree />
</MyMachineProvider>
}
const SomeComponentThatCouldBeDeepInTheTree = () => {
const service = useMyMachineService()
// use service.send() to send events
React.useEffect(() => {
service.send({ type: 'TRIGGERED' })
}, [someTrigger])
// if you need only one value from the machine, use a selector
const value = useSelector(service, React.useCallback(state => state.context.value, []))
// or if you need the whole state, use `useService()`
const [state] = useService(service)
//...
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment