UNPKG

@atlaskit/editor-plugin-quick-insert

Version:

Quick insert plugin for @atlaskit/editor-core

87 lines (84 loc) • 4.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveMaxRecommendedItems = exports.getRecommendedComponents = exports.createRecommendedItemsResolver = exports.MAX_RECOMMENDED_ITEMS = void 0; var _error = require("@atlaskit/editor-common/monitoring/error"); var _getProviderMenuItemKey = require("@atlaskit/editor-common/quick-insert/get-provider-menu-item-key"); var _isRecommendedItem = require("@atlaskit/editor-common/quick-insert/is-recommended-item"); var _typeAheadIsMenuFooterSectionKey = require("@atlaskit/editor-common/type-ahead-is-menu-footer-section-key"); var _typeAheadIsSectionOverflowItemKey = require("@atlaskit/editor-common/type-ahead-is-section-overflow-item-key"); var MAX_RECOMMENDED_ITEMS = exports.MAX_RECOMMENDED_ITEMS = 5; var isRecommendationCandidate = function isRecommendationCandidate(component) { return component.type === 'menu-item' && !(0, _typeAheadIsSectionOverflowItemKey.isSectionOverflowItemKey)(component.key) && !component.parents.some(function (parent) { return (0, _typeAheadIsMenuFooterSectionKey.isMenuFooterSectionKey)(parent.key); }); }; /** Normalises a consumer-supplied limit to the supported number of recommended items. */ var resolveMaxRecommendedItems = exports.resolveMaxRecommendedItems = function resolveMaxRecommendedItems(maxRecommendedItems) { if (maxRecommendedItems === undefined || !Number.isFinite(maxRecommendedItems)) { return MAX_RECOMMENDED_ITEMS; } if (maxRecommendedItems > MAX_RECOMMENDED_ITEMS) { void (0, _error.logException)(new Error('Quick Insert maxRecommendedItems exceeds the supported maximum'), { location: 'editor-plugin-quick-insert/getRecommendedComponents' }); } return Math.min(Math.max(Math.floor(maxRecommendedItems), 1), MAX_RECOMMENDED_ITEMS); }; var getRecommendedComponents = exports.getRecommendedComponents = function getRecommendedComponents(_ref) { var components = _ref.components, context = _ref.context, _ref$isRecommendedIte = _ref.isRecommendedItem, isRecommendedItem = _ref$isRecommendedIte === void 0 ? _isRecommendedItem.defaultIsRecommendedItem : _ref$isRecommendedIte, maxRecommendedItems = _ref.maxRecommendedItems; return components.filter(isRecommendationCandidate).flatMap(function (component, index) { var _component$isHidden; // Provider items are namespaced in the registry; consumers rank them by their source key. var result = isRecommendedItem({ itemKey: _getProviderMenuItemKey.quickInsertProviderMenuItemKey.getSourceKey(component.key) }); if (result === null) { return []; } if (Number.isNaN(result.rank)) { void (0, _error.logException)(new Error('Invalid Quick Insert recommended item rank'), { location: 'editor-plugin-quick-insert/getRecommendedComponents' }); return []; } if ((_component$isHidden = component.isHidden) !== null && _component$isHidden !== void 0 && _component$isHidden.call(component, { surfaceContext: context })) { return []; } return [{ component: component, index: index, rank: result.rank }]; }).sort(function (first, second) { return first.rank === second.rank ? first.index - second.index : first.rank - second.rank; }).slice(0, resolveMaxRecommendedItems(maxRecommendedItems)).map(function (_ref2) { var component = _ref2.component; return component; }); }; /** * Resolves the Recommended section for a browse-mode menu. Callers memoise per components array, * so the resolver itself keeps no state. */ var createRecommendedItemsResolver = exports.createRecommendedItemsResolver = function createRecommendedItemsResolver(_ref3) { var isRecommendedItem = _ref3.isRecommendedItem, maxRecommendedItems = _ref3.maxRecommendedItems; return function (_ref4) { var components = _ref4.components, surfaceContext = _ref4.surfaceContext; return surfaceContext ? getRecommendedComponents({ components: components, context: surfaceContext, isRecommendedItem: isRecommendedItem, maxRecommendedItems: maxRecommendedItems }) : []; }; };