mui-nav-menu
Version:
Navigation menu component based on material ui
60 lines (59 loc) • 2.29 kB
JavaScript
;
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;