UNPKG

mui-nav-menu

Version:

Navigation menu component based on material ui

60 lines (59 loc) 2.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useMenuNodes = void 0; const tslib_1 = require("tslib"); const react_1 = tslib_1.__importStar(require("react")); const MenuItemGroup_1 = tslib_1.__importDefault(require("../MenuItemGroup")); const useMenuNodes = () => { const nodeMapRef = (0, react_1.useRef)({}); const clearNodes = (0, react_1.useCallback)(() => { nodeMapRef.current = {}; }, []); const registerNode = (0, react_1.useCallback)((nodeData) => { nodeMapRef.current[nodeData.id] = nodeData; }, []); const getNode = (0, react_1.useCallback)((menuId) => { return nodeMapRef.current[menuId]; }, []); const getChildrenIds = (0, react_1.useCallback)((parentId, excludeDisabled) => { return Object.values(nodeMapRef.current) .filter((node) => node.parentId === parentId) .filter((node) => (excludeDisabled ? !node.disabled : true)) .sort((a, b) => a.index - b.index) .map((child) => child.id); }, []); const getDescendantIds = (0, react_1.useCallback)((parentId) => { return getChildrenIds(parentId).reduce((acc, id) => { return [...acc, id, getDescendantIds(id)].flat(); }, []); }, []); const processItem = (0, react_1.useCallback)((item, parentId, index) => { const { id, label, disabled, children, link, type } = item.props; const isGroup = item.type == MenuItemGroup_1.default; const childrens = react_1.default.Children.toArray(children); if (!isGroup && id && label) { //exclude group node registerNode({ id, parentId, label: label, disabled: disabled, link, hasChildren: !!(childrens && childrens.length), }); } if (childrens && childrens.length) { react_1.default.Children.forEach(childrens, (child, index) => { processItem(child, isGroup ? parentId : id, index); }); } }, []); return { processItem, getChildrenIds, getNode, clearNodes, getDescendantIds, }; }; exports.useMenuNodes = useMenuNodes;