@atlaskit/editor-plugin-quick-insert
Version:
Quick insert plugin for @atlaskit/editor-core
81 lines (79 loc) • 3.67 kB
JavaScript
import { logException } from '@atlaskit/editor-common/monitoring/error';
import { quickInsertProviderMenuItemKey } from '@atlaskit/editor-common/quick-insert/get-provider-menu-item-key';
import { defaultIsRecommendedItem } from '@atlaskit/editor-common/quick-insert/is-recommended-item';
import { isMenuFooterSectionKey } from '@atlaskit/editor-common/type-ahead-is-menu-footer-section-key';
import { isSectionOverflowItemKey } from '@atlaskit/editor-common/type-ahead-is-section-overflow-item-key';
export var MAX_RECOMMENDED_ITEMS = 5;
var isRecommendationCandidate = function isRecommendationCandidate(component) {
return component.type === 'menu-item' && !isSectionOverflowItemKey(component.key) && !component.parents.some(function (parent) {
return isMenuFooterSectionKey(parent.key);
});
};
/** Normalises a consumer-supplied limit to the supported number of recommended items. */
export var resolveMaxRecommendedItems = function resolveMaxRecommendedItems(maxRecommendedItems) {
if (maxRecommendedItems === undefined || !Number.isFinite(maxRecommendedItems)) {
return MAX_RECOMMENDED_ITEMS;
}
if (maxRecommendedItems > MAX_RECOMMENDED_ITEMS) {
void 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);
};
export var getRecommendedComponents = function getRecommendedComponents(_ref) {
var components = _ref.components,
context = _ref.context,
_ref$isRecommendedIte = _ref.isRecommendedItem,
isRecommendedItem = _ref$isRecommendedIte === void 0 ? 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: quickInsertProviderMenuItemKey.getSourceKey(component.key)
});
if (result === null) {
return [];
}
if (Number.isNaN(result.rank)) {
void 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.
*/
export var 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
}) : [];
};
};