BoardView.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import React from "react";
  2. import styled from "styled-components";
  3. import { useTranslation } from "react-i18next";
  4. import { SHOW_WELCOME } from "../utils/settings";
  5. import { Board } from "../components/Board";
  6. import SelectedItemsPane from "../components/SelectedItemsPane";
  7. import { useUsers, SubscribeUserEvents } from "../components/users";
  8. import WelcomeModal from "./WelcomeModal";
  9. import NavBar from "./NavBar";
  10. import AutoSave from "../components/AutoSave";
  11. import ImageDropNPaste from "../components/ImageDropNPaste";
  12. import { getComponent } from "../components/boardComponents";
  13. import { useGame } from "../hooks/useGame";
  14. import AddItemButton from "../components/AddItemButton";
  15. import { insideClass } from "../utils";
  16. const StyledBoardView = styled.div`
  17. width: 100vw;
  18. height: 100vh;
  19. overflow: hidden;
  20. `;
  21. const BoardContainer = styled.div`
  22. position: relative;
  23. width: 100%;
  24. height: 100%;
  25. overflow: hidden;
  26. box-sizing: border-box;
  27. background-color: var(--bg-color);
  28. `;
  29. const FirstActionSelect = styled.button`
  30. position: fixed;
  31. bottom: 1em;
  32. left: 1em;
  33. background: none;
  34. border: 4px solid var(--color-primary);
  35. border-radius: 100%;
  36. padding: 0.5em;
  37. `;
  38. export const BoardView = ({ namespace, edit: editMode = false }) => {
  39. const { t } = useTranslation();
  40. const { currentUser, users } = useUsers();
  41. const [showWelcomeModal, setShowWelcomeModal] = React.useState(
  42. SHOW_WELCOME && !editMode
  43. );
  44. const [moveFirst, setMoveFirst] = React.useState(false);
  45. const { gameLoaded } = useGame();
  46. React.useEffect(() => {
  47. // Chrome-related issue.
  48. // Making the wheel event non-passive, which allows to use preventDefault() to prevent
  49. // the browser original zoom and therefore allowing our custom one.
  50. // More detail at https://github.com/facebook/react/issues/14856
  51. const cancelWheel = (event) => {
  52. if (!insideClass(event.target, "modal-content")) event.preventDefault();
  53. };
  54. document.body.addEventListener("wheel", cancelWheel, { passive: false });
  55. return () => {
  56. document.body.removeEventListener("wheel", cancelWheel);
  57. };
  58. }, []);
  59. return (
  60. <StyledBoardView>
  61. <NavBar editMode={editMode} />
  62. <WelcomeModal show={showWelcomeModal} setShow={setShowWelcomeModal} />
  63. <SubscribeUserEvents />
  64. <AutoSave />
  65. {gameLoaded && (
  66. <BoardContainer>
  67. <ImageDropNPaste namespace={namespace}>
  68. <Board
  69. user={currentUser}
  70. users={users}
  71. getComponent={getComponent}
  72. moveFirst={moveFirst}
  73. />
  74. </ImageDropNPaste>
  75. <SelectedItemsPane />
  76. </BoardContainer>
  77. )}
  78. <FirstActionSelect onClick={() => setMoveFirst((prev) => !prev)}>
  79. {!moveFirst && (
  80. <img
  81. src="https://icongr.am/feather/move.svg?size=24&color=db5034"
  82. alt={t("Move mode")}
  83. title={t("Switch to move mode")}
  84. />
  85. )}
  86. {moveFirst && (
  87. <img
  88. src="https://icongr.am/feather/mouse-pointer.svg?size=24&color=db5034"
  89. alt={t("Select mode")}
  90. title={t("Switch to select mode")}
  91. />
  92. )}
  93. </FirstActionSelect>
  94. <AddItemButton />
  95. </StyledBoardView>
  96. );
  97. };
  98. export default BoardView;