Game.jsx 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import React from "react";
  2. import {
  3. PRE_GAME,
  4. PRE_ROUND,
  5. IN_ROUND,
  6. POST_ROUND,
  7. POST_GAME,
  8. ERROR,
  9. } from "../domain/GameState";
  10. import PreGame from "./screens/PreGame";
  11. import Lobby from "./screens/Lobby";
  12. import GamePanel from "./screens/GamePanel";
  13. import RoundSummary from "./screens/RoundSummary";
  14. import PlayerScores from "./screens/PlayerScores";
  15. import { useGameState, dispatch } from "../domain/gameStore";
  16. const componentMap = {
  17. [PRE_GAME]: PreGame,
  18. [PRE_ROUND]: Lobby,
  19. [IN_ROUND]: GamePanel,
  20. [POST_ROUND]: RoundSummary,
  21. [POST_GAME]: PlayerScores,
  22. [ERROR]: () => <p>Application encountered unrecoverable error, please refresh the page.</p>,
  23. }
  24. const paramRouter = {
  25. join: dispatch.goToLobby,
  26. summary: dispatch.goToSummary,
  27. }
  28. const Game = () => {
  29. const gameState = useGameState();
  30. const url = new URL(window.location.href);
  31. for (let [param, value] of url.searchParams.entries()) {
  32. const route = paramRouter[param];
  33. if (route) {
  34. url.searchParams.delete(param);
  35. window.history.replaceState({}, document.title, url.href);
  36. route(value);
  37. break;
  38. }
  39. }
  40. const Screen = componentMap[gameState];
  41. return <Screen />
  42. }
  43. export default Game;