UNPKG

@wordpress/components

Version:
98 lines (94 loc) 2.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useCreateNavigationTree = void 0; var _element = require("@wordpress/element"); var _useNavigationTreeNodes = require("./use-navigation-tree-nodes"); /** * WordPress dependencies */ /** * Internal dependencies */ const useCreateNavigationTree = () => { const { nodes: items, getNode: getItem, addNode: addItem, removeNode: removeItem } = (0, _useNavigationTreeNodes.useNavigationTreeNodes)(); const { nodes: menus, getNode: getMenu, addNode: addMenu, removeNode: removeMenu } = (0, _useNavigationTreeNodes.useNavigationTreeNodes)(); /** * Stores direct nested menus of menus * This makes it easy to traverse menu tree * * Key is the menu prop of the menu * Value is an array of menu keys */ const [childMenu, setChildMenu] = (0, _element.useState)({}); const getChildMenu = menu => childMenu[menu] || []; const traverseMenu = (startMenu, callback) => { const visited = []; let queue = [startMenu]; let current; while (queue.length > 0) { // Type cast to string is safe because of the `length > 0` check above. current = getMenu(queue.shift()); if (!current || visited.includes(current.menu)) { continue; } visited.push(current.menu); queue = [...queue, ...getChildMenu(current.menu)]; if (callback(current) === false) { break; } } }; const isMenuEmpty = menuToCheck => { let isEmpty = true; traverseMenu(menuToCheck, current => { if (!current.isEmpty) { isEmpty = false; return false; } return undefined; }); return isEmpty; }; return { items, getItem, addItem, removeItem, menus, getMenu, addMenu: (key, value) => { setChildMenu(state => { const newState = { ...state }; if (!value.parentMenu) { return newState; } if (!newState[value.parentMenu]) { newState[value.parentMenu] = []; } newState[value.parentMenu].push(key); return newState; }); addMenu(key, value); }, removeMenu, childMenu, traverseMenu, isMenuEmpty }; }; exports.useCreateNavigationTree = useCreateNavigationTree; //# sourceMappingURL=use-create-navigation-tree.js.map