Home Reference Source

src/plugins/SideBar/SidebarItemContainer.js

import React from 'react';
import PropTypes from 'prop-types';
import cn from 'classnames';
import { map } from 'lodash';
import SidebarDropdown from './SidebarDropdown';
import { NavLink } from 'react-router-dom';

const ItemType = {
  DROPDOWN: 'dropdown',
  LINK: 'link',
};

const OUTER_LINK_TYPE = 'outer';

/**
 * Рендер иконки
 * @param icon - иконка
 * @param label - текст итема
 * @param type - тип итема
 * @param sidebarOpen - флаг сжатия сайдбара
 * @param subItems
 * @returns {*}
 */
export const renderIcon = (icon, label, type, sidebarOpen, subItems) => {
  let component = <i className={cn(icon)} />;
  if (!sidebarOpen && type === ItemType.DROPDOWN && !subItems) {
    return label;
  } else if (!sidebarOpen && !icon) {
    component = label.substring(0, 1);
  }
  return <span className="n2o-sidebar__item-content-icon">{component}</span>;
};

/**
 * Sidebar Item
 * @param item - объект итема
 * @param activeId - активный элемент
 * @param sidebarOpen - флаг сжатия сайдбара
 * @returns {*}
 * @constructor
 */
function SidebarItemContainer({ item, activeId, sidebarOpen }) {
  const { type, linkType, subItems } = item;

  const renderItem = type => (
    <React.Fragment>
      {type === ItemType.LINK && renderLink(item)}
      {type === ItemType.DROPDOWN && renderDropdown()}
    </React.Fragment>
  );
  const renderLink = item =>
    linkType === OUTER_LINK_TYPE
      ? renderOuterLink(item)
      : renderInnerLink(item);
  const renderOuterLink = ({ href, label, iconClass }) => (
    <a className="n2o-sidebar__item" href={href}>
      {renderIcon(iconClass, label, type, sidebarOpen)}
      {label}
    </a>
  );
  const renderInnerLink = ({ href, label, iconClass }) => (
    <NavLink
      exact
      to={href}
      className="n2o-sidebar__item"
      activeClassName="active"
    >
      {renderIcon(iconClass, label, type, sidebarOpen)}
      {sidebarOpen && <span>{label}</span>}
    </NavLink>
  );

  const renderDropdown = () => (
    <SidebarDropdown {...item} sidebarOpen={sidebarOpen}>
      {map(subItems, subItem => (
        <div className="n2o-sidebar__sub-item">{renderLink(subItem)}</div>
      ))}
    </SidebarDropdown>
  );

  return (
    <div
      className={cn({
        'n2o-sidebar__item--dropdown': type === ItemType.DROPDOWN,
      })}
    >
      {renderItem(type)}
    </div>
  );
}
SidebarItemContainer.propTypes = {
  item: PropTypes.object,
  activeId: PropTypes.string,
  sidebarOpen: PropTypes.bool,
};

export default SidebarItemContainer;