gameStore.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { PRE_GAME, PRE_ROUND, IN_ROUND, POST_ROUND, POST_GAME } from "./GameState";
  2. import { createStore } from "../store";
  3. import { joinGame, sendGuess } from "./apiMethods";
  4. export const [
  5. {
  6. useGameId,
  7. usePlayerName,
  8. useLastRound,
  9. useGameJoined,
  10. usePlayerId,
  11. useGameState,
  12. },
  13. dispatch,
  14. ] = createStore({
  15. gameId: null,
  16. playerName: null,
  17. lastRound: {
  18. roundNum: -1,
  19. targetPoint: {
  20. lat: 0,
  21. lng: 0,
  22. },
  23. score: -1,
  24. totalScore: -1,
  25. },
  26. gameJoined: false,
  27. playerId: null,
  28. gameState: PRE_GAME,
  29. }, {
  30. setPlayerName: ([set], playerName) => set({ playerName }),
  31. goToLobby: ([set], gameId) => set({
  32. gameId,
  33. gameJoined: false,
  34. playerId: null,
  35. gameState: PRE_ROUND,
  36. }),
  37. joinGame: async ([set, get]) => {
  38. const gameId = get.gameId();
  39. const name = get.playerName();
  40. const { playerId } = await joinGame(gameId, name);
  41. set({ gameJoined: true, playerId });
  42. },
  43. startRound: ([set]) => set({ gameState: IN_ROUND }),
  44. submitGuess: async ([set, get], selectedPoint, roundNum, targetPoint) => {
  45. const { score, totalScore } = await sendGuess(
  46. get.gameId(),
  47. get.playerId(),
  48. roundNum,
  49. selectedPoint || { timeout: true }
  50. );
  51. set({
  52. lastRound: {
  53. roundNum,
  54. targetPoint,
  55. score,
  56. totalScore,
  57. },
  58. gameState: POST_ROUND,
  59. });
  60. },
  61. goToSummary: ([set, get], gameId) => set({
  62. gameId: gameId || get.gameId(),
  63. gameState: POST_GAME,
  64. }),
  65. resetGame: ([set]) => set({
  66. gameJoined: false,
  67. playerId: null,
  68. gameState: PRE_GAME,
  69. }),
  70. });