@trellixio/roaster-coffee
Version:
Beans' product component library
145 lines (139 loc) • 6.48 kB
JavaScript
'use strict';
var React = require('react');
var Section = require('./components/Section.js');
var index = require('../../utils/classNames/index.js');
require('@floating-ui/react');
var Button = require('../Button/Button.js');
var Menu = require('./components/Menu.js');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
for (var k in e) {
n[k] = e[k];
}
}
n.default = e;
return Object.freeze(n);
}
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
const Sidebar = React__namespace.forwardRef((props, ref) => {
const [visible, setVisible] = React__namespace.useState(false);
const { mobileHeader, header, footer, activePath, onMenuItemClick, items, className } = props;
const [activeSubMenu, setActiveSubMenu] = React__namespace.useState({
expanded: true,
pathname: activePath
});
React__namespace.useEffect(() => {
setActiveSubMenu((currentSubMenu) => ({
expanded: currentSubMenu.expanded,
pathname: activePath
}));
}, [activePath]);
function handleClick(itemId) {
onMenuItemClick?.({ itemId });
}
function handleSubMenuExpand(item) {
if (activeSubMenu.expanded) {
const currentItemOrSubMenuItemIsOpen = (
// either the parent item is expanded already
item.pathname === activeSubMenu.pathname || // or one of its expandable children is selected
item.subMenu && item.subMenu.some((subMenuItem) => subMenuItem.pathname === activeSubMenu.pathname) || false
);
setActiveSubMenu({
expanded: item.subMenu && item.subMenu.length > 0 ? !currentItemOrSubMenuItemIsOpen : false,
pathname: item.pathname
});
} else {
setActiveSubMenu({
expanded: !!(item.subMenu && item.subMenu.length > 0),
pathname: item.pathname
});
}
}
function getMenuItemsProps(item) {
const { pathname, subMenu, icon, label, ...rest } = item;
const isItemSelected = pathname === activeSubMenu.pathname;
const isExpanded = (
// item is expanded and
activeSubMenu.expanded && // either the current expandable section is selected
(isItemSelected || // or some item in the expandable section of the current item is selected or active
subMenu && subMenu.some((subMenuItem) => subMenuItem.pathname === activeSubMenu.pathname) || false)
);
return { isExpanded, pathname, subMenu, icon, label, otherProps: rest };
}
return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement("section", { className: "appnav-opener-mobile" }, /* @__PURE__ */ React__namespace.createElement(Button.Button, { variant: "", isIconButton: true, onClick: () => setVisible(!visible) }, /* @__PURE__ */ React__namespace.createElement("i", { className: "fa-regular fa-bars" })), mobileHeader), /* @__PURE__ */ React__namespace.createElement("aside", { className: index.classNames("appnav-container", className, { visible }), ref }, /* @__PURE__ */ React__namespace.createElement("div", { className: "background-overlay", onClick: () => setVisible(!visible) }), /* @__PURE__ */ React__namespace.createElement("nav", { className: "appnav" }, /* @__PURE__ */ React__namespace.createElement(Section.Section, { className: "header" }, header), /* @__PURE__ */ React__namespace.createElement(Section.Section, null, items.map((item) => {
if (Array.isArray(item)) {
return /* @__PURE__ */ React__namespace.createElement(Menu.Menu, null, item.map((menuItem) => {
const { isExpanded: isExpanded2, pathname: pathname2, subMenu: subMenu2, icon: icon2, label: label2, otherProps: otherProps2 } = getMenuItemsProps(menuItem);
return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(
Menu.Menu.Item,
{
key: label2,
icon: icon2,
active: isExpanded2,
onClick: () => {
handleClick(pathname2);
handleSubMenuExpand(menuItem);
},
...otherProps2
},
label2
), subMenu2 && subMenu2.length > 0 && isExpanded2 && /* @__PURE__ */ React__namespace.createElement(Menu.Menu.Item, { component: React__namespace.Fragment }, /* @__PURE__ */ React__namespace.createElement(Menu.Menu.SubMenu, { expanded: isExpanded2 }, subMenu2.map((subMenuItem) => {
const {
icon: subMenuIcon,
pathname: subMenuItemPathname,
label: subMenuItemLabel,
...subMenuItemRest
} = subMenuItem;
return /* @__PURE__ */ React__namespace.createElement(
Menu.Menu.Item,
{
icon: subMenuIcon,
key: subMenuItemPathname,
onClick: () => handleClick(subMenuItemPathname),
...subMenuItemRest
},
subMenuItemLabel
);
}))));
}));
}
const { isExpanded, pathname, subMenu, icon, label, otherProps } = getMenuItemsProps(item);
return /* @__PURE__ */ React__namespace.createElement(Menu.Menu, null, /* @__PURE__ */ React__namespace.createElement(
Menu.Menu.Item,
{
key: label,
icon,
active: isExpanded,
onClick: () => {
handleClick(pathname);
handleSubMenuExpand(item);
},
...otherProps
},
label
), subMenu && subMenu.length > 0 && isExpanded && /* @__PURE__ */ React__namespace.createElement(Menu.Menu.Item, { component: React__namespace.Fragment }, /* @__PURE__ */ React__namespace.createElement(Menu.Menu.SubMenu, { expanded: isExpanded }, subMenu.map((subMenuItem) => {
const {
icon: subMenuIcon,
pathname: subMenuItemPathname,
label: subMenuItemLabel,
...subMenuItemRest
} = subMenuItem;
return /* @__PURE__ */ React__namespace.createElement(
Menu.Menu.Item,
{
icon: subMenuIcon,
key: subMenuItemPathname,
onClick: () => handleClick(subMenuItemPathname),
...subMenuItemRest
},
subMenuItemLabel
);
}))));
})), /* @__PURE__ */ React__namespace.createElement(Section.Section, { className: "footer" }, footer))));
});
Sidebar.Section = Section.Section;
Sidebar.Menu = Menu.Menu;
Sidebar.displayName = "Sidebar";
exports.Sidebar = Sidebar;
//# sourceMappingURL=Sidebar.js.map