UNPKG

mui-nav-menu

Version:

Navigation menu component based on material ui

35 lines (34 loc) 1.99 kB
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);