()
| 23 | |
| 24 | // router finds first state match of <Route path='' /> |
| 25 | const useStateMachine = (): Output => { |
| 26 | const [state, send] = useMachine<T.MachineContext, any>(createMachine({ editorSend })) |
| 27 | |
| 28 | // event bus listener |
| 29 | React.useEffect(() => { |
| 30 | const listener = 'message' |
| 31 | // propagate channel event to state machine |
| 32 | const handler = (event: any) => { |
| 33 | // NOTE: must call event.data, cannot destructure. VSCode acts odd |
| 34 | const action = event.data |
| 35 | |
| 36 | if (action.source !== 'coderoad') { |
| 37 | // filter out events from other extensions |
| 38 | return |
| 39 | } |
| 40 | send(action) |
| 41 | } |
| 42 | window.addEventListener(listener, handler) |
| 43 | return () => { |
| 44 | window.removeEventListener(listener, handler) |
| 45 | } |
| 46 | }, []) // eslint-disable-line |
| 47 | |
| 48 | // convert route to a string to avoid unnecessary React re-renders on deeply nested objects |
| 49 | const route = createRouteString(state.value) |
| 50 | logger(`STATE: "${route}"`) |
| 51 | |
| 52 | return { |
| 53 | context: state.context, |
| 54 | route, |
| 55 | send, |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | export default useStateMachine |
no test coverage detected