ActionBar.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import React from "react";
  2. import MessageButton from "../../messages/MessageButton";
  3. import EditInfoButton from "./EditInfoButton";
  4. import AddItemButton from "./AddItemButton";
  5. import styled from "styled-components";
  6. import { useTranslation } from "react-i18next";
  7. import Touch from "../../ui/Touch";
  8. import target from "../../media/images/target.svg";
  9. const StyledActionBar = styled.div`
  10. position: absolute;
  11. bottom: 1em;
  12. right: 0em;
  13. display: flex;
  14. width: 100%;
  15. text-shadow: 1px 1px 2px #222;
  16. font-size: 0.8em;
  17. pointer-events: none;
  18. & > *:not(.spacer) {
  19. padding: 0 1.5em;
  20. pointer-events: all;
  21. }
  22. & .spacer {
  23. flex: 1;
  24. }
  25. @media screen and (max-width: 640px) {
  26. & > *:not(.spacer) {
  27. padding: 0 0.5em;
  28. }
  29. & .spacer {
  30. padding: 0;
  31. }
  32. }
  33. @media screen and (max-width: 420px) {
  34. & > *:not(.spacer) {
  35. padding: 0 0.2em;
  36. }
  37. }
  38. `;
  39. const ActionBar = ({
  40. editMode,
  41. BoardFormComponent,
  42. itemLibraries,
  43. moveFirst,
  44. setMoveFirst,
  45. hideMenu,
  46. setHideMenu,
  47. }) => {
  48. const { t } = useTranslation();
  49. const [showAddPanel, setShowAddPanel] = React.useState(false);
  50. React.useEffect(() => {
  51. const onKeyUp = (e) => {
  52. // Block shortcut if we are typing in a textarea or input
  53. if (["INPUT", "TEXTAREA"].includes(e.target.tagName)) return;
  54. if (e.key === "m") {
  55. setHideMenu((prev) => !prev);
  56. return;
  57. }
  58. };
  59. document.addEventListener("keyup", onKeyUp);
  60. return () => {
  61. document.removeEventListener("keyup", onKeyUp);
  62. };
  63. }, [setHideMenu]);
  64. return (
  65. <>
  66. <StyledActionBar>
  67. {!editMode && <MessageButton />}
  68. {editMode && <EditInfoButton BoardFormComponent={BoardFormComponent} />}
  69. <div className="spacer" />
  70. <Touch
  71. onClick={() => setMoveFirst(false)}
  72. alt={t("Select mode")}
  73. label={t("Select")}
  74. title={t("Switch to select mode")}
  75. icon={"mouse-pointer"}
  76. active={!moveFirst}
  77. />
  78. <Touch
  79. onClick={() => setMoveFirst(true)}
  80. alt={t("Move mode")}
  81. label={t("Move")}
  82. title={t("Switch to move mode")}
  83. icon={"hand"}
  84. active={moveFirst}
  85. />
  86. <Touch
  87. onClick={() => setHideMenu((prev) => !prev)}
  88. alt={hideMenu ? t("Show menu") : t("Hide menu")}
  89. label={hideMenu ? t("Show menu") : t("Hide menu")}
  90. title={hideMenu ? t("Show action menu") : t("Hide action menu")}
  91. icon={hideMenu ? "eye-with-line" : "eye"}
  92. />
  93. <div className="spacer" />
  94. <AddItemButton
  95. itemLibraries={itemLibraries}
  96. setShowAddPanel={setShowAddPanel}
  97. showAddPanel={showAddPanel}
  98. />
  99. </StyledActionBar>
  100. {showAddPanel && (
  101. <img
  102. style={{
  103. position: "absolute",
  104. width: "60px",
  105. height: "60px",
  106. left: "calc(50% - 30px)",
  107. top: "calc(50% - 30px)",
  108. pointerEvents: "none",
  109. opacity: 0.3,
  110. }}
  111. src={target}
  112. />
  113. )}
  114. </>
  115. );
  116. };
  117. export default ActionBar;