import "./sidebar-nav-item.scss"; import React from "react"; import { computed, observable, reaction } from "mobx"; import { observer } from "mobx-react"; import { NavLink } from "react-router-dom"; import { createStorage, cssNames } from "../../utils"; import { Icon } from "../icon"; import { SidebarContext } from "./sidebar-context"; import type { TabLayoutRoute } from "./tab-layout"; import type { SidebarContextValue } from "./sidebar-context"; interface SidebarNavItemProps { id: string; // Used to save nav item collapse/expand state in local storage url: string; text: React.ReactNode | string; className?: string; icon?: React.ReactNode; isHidden?: boolean; isActive?: boolean; subMenus?: TabLayoutRoute[]; } const navItemStorage = createStorage<[string, boolean][]>("sidebar_menu_item", []); const navItemState = observable.map(navItemStorage.get()); reaction(() => [...navItemState], (value) => navItemStorage.set(value)); @observer export class SidebarNavItem extends React.Component { static contextType = SidebarContext; public context: SidebarContextValue; @computed get isExpanded() { return navItemState.get(this.props.id); } toggleSubMenu = () => { navItemState.set(this.props.id, !this.isExpanded); }; render() { const { isHidden, isActive, subMenus = [], icon, text, url, children, className, id } = this.props; if (isHidden) { return null; } const extendedView = (subMenus.length > 0 || children) && this.context.pinned; if (extendedView) { return (
{icon} {text}
    {subMenus.map(({ title, url }) => ( {title} ))} {React.Children.toArray(children).map((child: React.ReactElement) => { return React.cloneElement(child, { className: cssNames(child.props.className, { visible: this.isExpanded }), }); })}
); } return ( isActive}> {icon} {text} ); } }