@launchmenu/core
Version:
An environment for visual keyboard controlled applets
96 lines • 7.79 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.MenuItemCategorizer = void 0;
const model_react_1 = require("model-react");
/**
* A class that can be used to categorize a list of menu items
*/
class MenuItemCategorizer {
/**
* Creates a new categorizer
* @param items The items getter
* @param config The config to customize the categories
*/
constructor(items, config) {
// The transformers to translate the input items list into a categorized list
/**
* The items together with a function to retrieve their category, caching the category for future use
*/
this.itemsWithCategories = new model_react_1.DataCacher((hook, prev) => {
const items = this.itemsGetter(hook);
const prevCategories = prev === null || prev === void 0 ? void 0 : prev.categories;
const categories = new Map();
const itemsWithCategories = items.map(item => {
var _a;
const categoryGetter = (_a = prevCategories === null || prevCategories === void 0 ? void 0 : prevCategories.get(item)) !== null && _a !== void 0 ? _a : new model_react_1.DataCacher(h => this.config.getCategory(item, h));
categories.set(item, categoryGetter);
return { item, categoryGetter };
});
return { items: itemsWithCategories, categories };
});
/**
* The categories data
*/
this.categories = new model_react_1.DataCacher(hook => {
const { items } = this.itemsWithCategories.get(hook);
// Collect all categories with their items
const categoriesMap = new Map();
items.forEach(({ item, categoryGetter }, index) => {
const category = categoryGetter.get(hook);
let categoryItems = categoriesMap.get(category);
if (!categoryItems) {
categoryItems = [];
categoriesMap.set(category, categoryItems);
}
categoryItems.push({ item, index });
});
// Sort the categories
const categoriesList = [];
for (let [category, items] of categoriesMap)
categoriesList.push({ category, items });
const order = this.config.sortCategories(categoriesList, hook);
// Extract the simplified category data
const categories = order.map(category => {
var _a;
const items = (_a = categoriesMap.get(category)) !== null && _a !== void 0 ? _a : [];
const normalizedItems = items.map(({ item }) => this.config.getItem(item, hook));
return { category, items: normalizedItems };
});
return categories;
});
/**
* The menu items
*/
this.items = new model_react_1.DataCacher(hook => {
const categories = this.categories.get(hook);
const allItems = [];
categories.forEach(({ category, items }) => {
if (category)
allItems.push(category.item);
allItems.push(...items);
});
return allItems;
});
this.itemsGetter = items;
this.config = config;
}
// All the getters
/**
* Retrieves the item categories of the menu
* @param hook The hook to subscribe to changes
* @returns The categories and their items
*/
getCategories(hook) {
return this.categories.get(hook);
}
/**
* Retrieves the items including categories
* @param hook The hook to subscribe to changes
* @returns The menu items
*/
getItems(hook) {
return this.items.get(hook);
}
}
exports.MenuItemCategorizer = MenuItemCategorizer;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVudUl0ZW1DYXRlZ29yaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW51cy9tZW51L01lbnVJdGVtQ2F0ZWdvcml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQWtFO0FBTWxFOztHQUVHO0FBQ0gsTUFBYSxtQkFBbUI7SUFJNUI7Ozs7T0FJRztJQUNILFlBQW1CLEtBQTBCLEVBQUUsTUFBNkI7UUFLNUUsNkVBQTZFO1FBQzdFOztXQUVHO1FBQ08sd0JBQW1CLEdBQUcsSUFBSSx3QkFBVSxDQUczQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNkLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsTUFBTSxjQUFjLEdBQUcsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFVBQVUsQ0FBQztZQUV4QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBd0MsQ0FBQztZQUNuRSxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7O2dCQUN6QyxNQUFNLGNBQWMsU0FDaEIsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLEdBQUcsQ0FBQyxJQUFJLG9DQUN4QixJQUFJLHdCQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLEVBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FB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
;