import { ADVANCED_MENU_LAYOUT, CONSUMER_MENU_LAYOUT } from './framework-menu-layout-data'; import type { MenuLayoutGroup, MenuLayoutItem, MenuLayoutResolvedGroup } from './framework-menu-layout-types'; const resolveLayout = ( layout: ReadonlyArray, actions: ReadonlyArray ): ReadonlyArray> => { const byId = new Map(actions.map((action) => [action.id, action] as const)); return layout.map((group) => ({ key: group.key, title: group.title, items: group.itemIds .map((id) => { const action = byId.get(id); if (!action) { return null; } return { id, action }; }) .filter((entry): entry is MenuLayoutItem => entry !== null), })); }; export const resolveConsumerMenuLayout = ( actions: ReadonlyArray ): ReadonlyArray> => resolveLayout(CONSUMER_MENU_LAYOUT, actions); export const resolveAdvancedMenuLayout = ( actions: ReadonlyArray ): ReadonlyArray> => resolveLayout(ADVANCED_MENU_LAYOUT, actions); export const flattenMenuLayoutIds = ( layout: ReadonlyArray ): ReadonlyArray => layout.flatMap((group) => group.itemIds); export const hasFullLayoutCoverage = ( layout: ReadonlyArray, actionIds: ReadonlyArray ): boolean => { const layoutSet = new Set(flattenMenuLayoutIds(layout)); const actionsSet = new Set(actionIds); if (layoutSet.size !== actionsSet.size) { return false; } for (const id of actionsSet) { if (!layoutSet.has(id)) { return false; } } return true; };