mui-nav-menu
Version:
Navigation menu component based on material ui
35 lines (34 loc) • 1.99 kB
JavaScript
import { jsx as _jsx } from "react/jsx-runtime";
import { useEventCallback } from "@mui/material";
import classNames from "classnames";
import { forwardRef, memo, useMemo } from "react";
import ListMenuItem from "./ListMenuItem";
import { useMenuContext } from "./contexts/MenuContext";
import { useConnectedPath } from "./contexts/PathContext";
const MenuItem = forwardRef((props, ref) => {
const { id, children, type = "item", onClick, className: classNameProp, ...rest } = props;
const { openIds = [], selectedIds, checkSelectedFn, mode, collapsed, inlineIndent, onSelectedChange, onItemClick, focusedNodeId, defaultCollapseIcon, defaultExpandIcon, defaultPopupRootIcon, defaultPopupSubIcon, prefixCls, } = useMenuContext();
const connectedIdPath = useConnectedPath(id);
const subIsOpen = useMemo(() => {
return openIds.includes(id);
}, [openIds]);
const isSelected = useMemo(() => {
if (checkSelectedFn) {
return checkSelectedFn(props);
}
return selectedIds ? selectedIds.includes(id) : false;
}, [selectedIds, checkSelectedFn]);
const handleItemClick = useEventCallback((event) => {
if (event.type !== "click") {
return;
}
if (typeof rest.link == "object" && rest.link.url) {
return;
}
onSelectedChange(connectedIdPath, true);
onClick && onClick(event);
onItemClick && onItemClick(id, connectedIdPath, event);
});
return (_jsx(ListMenuItem, { id: id, mode: mode, isFocused: focusedNodeId == id, hasChildren: false, inlineIndent: inlineIndent, collapsed: collapsed, subIsOpen: subIsOpen, onClick: handleItemClick, isSelected: isSelected, className: classNames(prefixCls + "ListItem-root", classNameProp), connectedIdPath: connectedIdPath, expandIcon: defaultExpandIcon, collapseIcon: defaultCollapseIcon, popupRootIcon: defaultPopupRootIcon, popupSubIcon: defaultPopupSubIcon, ...rest }));
});
export default memo(MenuItem);