Skip to content
Snippets Groups Projects
ToolGroupComponent.js 1.05 KiB
Newer Older
chris's avatar
chris committed
/* eslint react/prop-types: 0 */
chris's avatar
chris committed
import React, { useMemo } from 'react';
Yannis Barlas's avatar
Yannis Barlas committed
import styled from 'styled-components';
chris's avatar
chris committed
import Dropdown from './ui/Dropdown';
Yannis Barlas's avatar
Yannis Barlas committed

const Wrapper = styled.div`
  align-items: center;
chris's avatar
chris committed
  display: inline-flex;
Yannis Barlas's avatar
Yannis Barlas committed
  padding: 0 4px;
Yannis Barlas's avatar
Yannis Barlas committed
  > button,
  > div {
chris's avatar
chris committed
    margin: 0 5px;
chris's avatar
chris committed
  }
chris's avatar
chris committed

Yannis Barlas's avatar
Yannis Barlas committed
const DropWrapper = styled(Wrapper)`
  border: 1px solid gray;
  padding: 4px;
chris's avatar
chris committed
`;

const ToolGroupComponent = ({ view, tools, name }) => {
Yannis Barlas's avatar
Yannis Barlas committed
  const toolsShown = [];
  const rest = [];
chris's avatar
chris committed

  tools.forEach(tool => {
chris's avatar
chris committed
    tool.isIntoMoreSection() && tool.isDisplayed()
chris's avatar
chris committed
      ? rest.push(tool.renderTool(view))
      : toolsShown.push(tool.renderTool(view));
  });

chris's avatar
chris committed
  const MemorizedToolGroupComponent = useMemo(
    () => (
      <Wrapper data-name={name}>
        {toolsShown}
        {rest.length > 0 && (
          <Dropdown
            dropComponent={<DropWrapper>{rest}</DropWrapper>}
chris's avatar
chris committed
            iconName="more"
chris's avatar
chris committed
            title="Show more tools"
          />
        )}
      </Wrapper>
    ),
    [],
chris's avatar
chris committed
  );
chris's avatar
chris committed
  return MemorizedToolGroupComponent;
chris's avatar
chris committed
};

export default ToolGroupComponent;