Tools.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import React from "react";
  2. import {
  3. AiOutlineFullscreen,
  4. AiOutlineMinus,
  5. AiOutlinePlus,
  6. } from "react-icons/ai";
  7. import { FiDownload } from "react-icons/fi";
  8. import { HiOutlineSun, HiOutlineMoon } from "react-icons/hi";
  9. import { MdCenterFocusWeak } from "react-icons/md";
  10. import { SearchInput } from "src/components/SearchInput";
  11. import styled from "styled-components";
  12. import useConfig from "src/hooks/store/useConfig";
  13. import shallow from "zustand/shallow";
  14. import { DownloadModal } from "../Modals/DownloadModal";
  15. import useStored from "src/hooks/store/useStored";
  16. import { TbSettings } from "react-icons/tb";
  17. import { Settings } from "./Settings";
  18. export const StyledTools = styled.div`
  19. display: flex;
  20. align-items: center;
  21. gap: 4px;
  22. flex-direction: row-reverse;
  23. height: 28px;
  24. padding: 4px 16px;
  25. background: ${({ theme }) => theme.BACKGROUND_PRIMARY};
  26. color: ${({ theme }) => theme.SILVER};
  27. box-shadow: 0 1px 0px ${({ theme }) => theme.BACKGROUND_TERTIARY};
  28. @media only screen and (max-width: 568px) {
  29. display: none;
  30. }
  31. `;
  32. const StyledToolElement = styled.button`
  33. display: grid;
  34. place-content: center;
  35. font-size: 20px;
  36. background: none;
  37. color: ${({ theme }) => theme.INTERACTIVE_NORMAL};
  38. &:hover {
  39. color: ${({ theme }) => theme.INTERACTIVE_HOVER};
  40. opacity: 1;
  41. box-shadow: none;
  42. }
  43. `;
  44. export const Tools: React.FC = () => {
  45. const [settingsVisible, setSettingsVisible] = React.useState(false);
  46. const [isDownloadVisible, setDownloadVisible] = React.useState(false);
  47. const lightmode = useStored((state) => state.lightmode);
  48. const setLightTheme = useStored((state) => state.setLightTheme);
  49. const [performanceMode, hideEditor] = useConfig(
  50. (state) => [state.performanceMode, state.hideEditor],
  51. shallow
  52. );
  53. const setConfig = useConfig((state) => state.setConfig);
  54. const zoomIn = useConfig((state) => state.zoomIn);
  55. const zoomOut = useConfig((state) => state.zoomOut);
  56. const centerView = useConfig((state) => state.centerView);
  57. const toggleEditor = () => setConfig("hideEditor", !hideEditor);
  58. const toggleTheme = () => setLightTheme(!lightmode);
  59. return (
  60. <StyledTools>
  61. <StyledToolElement aria-label="fullscreen" onClick={toggleEditor}>
  62. <AiOutlineFullscreen />
  63. </StyledToolElement>
  64. <StyledToolElement
  65. aria-label="settings"
  66. onClick={() => setSettingsVisible(true)}
  67. >
  68. <TbSettings />
  69. </StyledToolElement>
  70. <StyledToolElement aria-label="switch theme" onClick={toggleTheme}>
  71. {lightmode ? <HiOutlineMoon /> : <HiOutlineSun />}
  72. </StyledToolElement>
  73. {!performanceMode && <SearchInput />}
  74. {!performanceMode && (
  75. <StyledToolElement
  76. aria-label="save"
  77. onClick={() => setDownloadVisible(true)}
  78. >
  79. <FiDownload />
  80. </StyledToolElement>
  81. )}
  82. <StyledToolElement aria-label="center canvas" onClick={centerView}>
  83. <MdCenterFocusWeak />
  84. </StyledToolElement>
  85. <StyledToolElement aria-label="zoom out" onClick={zoomOut}>
  86. <AiOutlineMinus />
  87. </StyledToolElement>
  88. <StyledToolElement aria-label="zoom in" onClick={zoomIn}>
  89. <AiOutlinePlus />
  90. </StyledToolElement>
  91. <DownloadModal
  92. visible={isDownloadVisible}
  93. setVisible={setDownloadVisible}
  94. />
  95. <Settings visible={settingsVisible} setVisible={setSettingsVisible} />
  96. </StyledTools>
  97. );
  98. };