useBoardConfig.jsx 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import React from "react";
  2. import { useC2C } from "../hooks/useC2C";
  3. import { useRecoilState } from "recoil";
  4. import debounce from "lodash.debounce";
  5. import { BoardConfigAtom } from "./Board/game/atoms";
  6. export const useBoardConfig = () => {
  7. const [c2c] = useC2C();
  8. const [boardConfig, setBoardConfig] = useRecoilState(BoardConfigAtom);
  9. // eslint-disable-next-line react-hooks/exhaustive-deps
  10. const debouncedPublishUpdate = React.useCallback(
  11. debounce((newConfig) => {
  12. c2c.publish("updateBoardConfig", newConfig);
  13. }, 1000),
  14. [c2c]
  15. );
  16. const setSyncBoardConfig = React.useCallback(
  17. (callbackOrConfig, sync = true) => {
  18. let callback = callbackOrConfig;
  19. if (typeof callbackOrConfig === "object") {
  20. callback = () => callbackOrConfig;
  21. }
  22. setBoardConfig((prev) => {
  23. const newConfig = callback(prev);
  24. if (sync) {
  25. debouncedPublishUpdate(newConfig);
  26. }
  27. return newConfig;
  28. });
  29. },
  30. [setBoardConfig, debouncedPublishUpdate]
  31. );
  32. return [boardConfig, setSyncBoardConfig];
  33. };
  34. export default useBoardConfig;