import React, { Component, PropTypes } from 'react'; import classnames from 'classnames'; import userInterface from 'interfaces/user'; import Icon from 'components/icons/Icon'; import navItems from './navItems'; class SiteNavSidePanel extends Component { static propTypes = { onNavItemClick: PropTypes.func, pathname: PropTypes.string, user: userInterface, }; constructor (props) { super(props); const { user: { admin } } = this.props; this.userNavItems = navItems(admin); this.state = { showSubItems: false, userMenuOpened: false, }; } setSubNavClass = (showSubItems) => { return showSubItems ? 'sub-nav sub-nav--expanded' : 'sub-nav'; } toggleShowSubItems = (showSubItems) => { return (evt) => { evt.preventDefault(); this.setState({ showSubItems }); return false; }; } toggleUserMenu = () => { const { userMenuOpened } = this.state; this.setState({ userMenuOpened: !userMenuOpened }); } renderNavItem = (navItem) => { const { icon, name, subItems } = navItem; const { onNavItemClick, pathname } = this.props; const { renderSubItems } = this; const active = navItem.location.regex.test(pathname); const navItemBaseClass = 'site-nav-item'; const navItemClasses = classnames( `${navItemBaseClass}`, { [`${navItemBaseClass}--active`]: active } ); return (
  • {active && renderSubItems(subItems)}
  • ); } renderNavItems = () => { const { renderNavItem, userNavItems } = this; return ( ); } renderSubItem = (subItem) => { const { icon, name } = subItem; const { onNavItemClick, pathname } = this.props; const active = subItem.location.regex.test(pathname); const baseSubItemClass = 'site-sub-item'; const baseSubItemItemClass = classnames( `${baseSubItemClass}`, { [`${baseSubItemClass}--active`]: active } ); return (
  • ); } renderSubItems = (subItems) => { const { renderSubItem, setSubNavClass } = this; const { showSubItems } = this.state; const baseSubItemsClass = 'site-sub-items'; const subItemListClasses = classnames( `${baseSubItemsClass}__list`, { [`${baseSubItemsClass}__list--expanded`]: showSubItems } ); if (!subItems.length) return false; return (
    ); } render () { const { renderNavItems } = this; return ( renderNavItems() ); } } export default SiteNavSidePanel;