root.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import React, { useCallback, useState } from 'react';
  2. import { useReducer } from 'reinspect';
  3. import { nameSet } from '../actions';
  4. import { DispatchContext, StateContext } from '../context/state';
  5. import { useDispatchWithEffects, useOnMessage, useSocket } from '../hooks/socket';
  6. import { globalReducer, initialState } from '../reducer';
  7. import { init } from '../utils/state';
  8. import { App } from './app';
  9. import { Identify } from './identify';
  10. export const Root: React.FC = () => {
  11. const [state, dispatch] = useReducer(globalReducer, initialState, init, 'global');
  12. const onMessage = useOnMessage(dispatch);
  13. const onLogin = useCallback(
  14. (name: string): void => {
  15. dispatch(nameSet(name));
  16. },
  17. [dispatch],
  18. );
  19. const { identified, onIdentify, ready, connecting, error, socket } = useSocket(
  20. onMessage,
  21. onLogin,
  22. );
  23. const dispatchWithEffects = useDispatchWithEffects(state, dispatch, socket);
  24. const [interacted, setInteracted] = useState<boolean>(false);
  25. if (!identified) {
  26. return (
  27. <Identify connecting={connecting} onIdentify={onIdentify} setInteracted={setInteracted} />
  28. );
  29. }
  30. return (
  31. <StateContext.Provider value={state}>
  32. <DispatchContext.Provider value={dispatchWithEffects}>
  33. <App
  34. socket={socket}
  35. connecting={connecting}
  36. ready={ready}
  37. error={error}
  38. interacted={interacted}
  39. setInteracted={setInteracted}
  40. />
  41. </DispatchContext.Provider>
  42. </StateContext.Provider>
  43. );
  44. };