useGame.jsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import React, { useContext } from "react";
  2. import { updateGame } from "../utils/api";
  3. import { useBoardConfig, useItemActions } from "react-sync-board";
  4. export const GameContext = React.createContext({});
  5. export const GameProvider = ({ gameId, game, children }) => {
  6. const { setItemList, getItemList } = useItemActions();
  7. const [availableItems, setAvailableItems] = React.useState([]);
  8. const [boardConfig, setBoardConfig] = useBoardConfig();
  9. const [gameLoaded, setGameLoaded] = React.useState(false);
  10. const setGame = React.useCallback(
  11. async (newGame) => {
  12. const { availableItems, items, board } = newGame;
  13. setAvailableItems(availableItems);
  14. // The filter prevent the empty item bug on reload
  15. setItemList(items.filter((item) => item));
  16. setBoardConfig(board, false);
  17. setGameLoaded(true);
  18. },
  19. [setBoardConfig, setItemList]
  20. );
  21. const getCurrentGame = React.useCallback(async () => {
  22. const currentGame = {
  23. items: await getItemList(),
  24. board: boardConfig,
  25. availableItems,
  26. };
  27. return currentGame;
  28. }, [availableItems, boardConfig, getItemList]);
  29. const saveGame = React.useCallback(async () => {
  30. const currentGame = await getCurrentGame();
  31. return updateGame(gameId, currentGame);
  32. }, [gameId, getCurrentGame]);
  33. React.useEffect(() => {
  34. if (game) {
  35. setGame(game);
  36. }
  37. }, [game, setGame]);
  38. return (
  39. <GameContext.Provider
  40. value={{
  41. setGame,
  42. getGame: getCurrentGame,
  43. saveGame,
  44. gameLoaded,
  45. gameId,
  46. availableItems,
  47. }}
  48. >
  49. {children}
  50. </GameContext.Provider>
  51. );
  52. };
  53. export const useGame = () => {
  54. return useContext(GameContext);
  55. };
  56. export default useGame;