@atlaskit/editor-plugin-quick-insert
Version:
Quick insert plugin for @atlaskit/editor-core
225 lines (224 loc) • 11.9 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
var _react = _interopRequireWildcard(require("react"));
var _reactIntl = require("react-intl");
var _enums = require("@atlaskit/editor-common/analytics/types/enums");
var _insertBlock = require("@atlaskit/editor-common/messages/insert-block");
var _provider = require("@atlaskit/editor-common/quick-insert/provider");
var _context = require("@atlaskit/editor-common/registered-menu/context");
var _surfaceContext = require("@atlaskit/editor-common/registered-menu/surface-context");
var _useRegisteredMenu2 = require("@atlaskit/editor-common/registered-menu/use-registered-menu");
var _typeAheadIsSectionOverflowItemKey = require("@atlaskit/editor-common/type-ahead-is-section-overflow-item-key");
var _messages = require("@atlaskit/editor-common/type-ahead/messages");
var _menuGroup = _interopRequireDefault(require("@atlaskit/menu/menu-group"));
var _getQuickInsertMenuModel = require("./get-quick-insert-menu-model");
var _getQuickInsertMenuItemId = require("./getQuickInsertMenuItemId");
var _RegisteredQuickInsertMenuItem = require("./RegisteredQuickInsertMenuItem");
var _selectQuickInsertCategoryItems = require("./selectQuickInsertCategoryItems");
var _ToolbarQuickInsertMenu = require("./ToolbarQuickInsertMenu");
var _TypeAheadQuickInsertMenu = require("./TypeAheadQuickInsertMenu");
var _useQuickInsertSearchAnalytics = require("./useQuickInsertSearchAnalytics");
var _excluded = ["rows", "selectableItems", "selectedItemIndex", "activeItemKey", "selectionSource"];
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
var DEFAULT_MENU_MAX_HEIGHT = 480;
var isImeEnter = function isImeEnter(event) {
return event.isComposing || event.keyCode === 229;
};
var QuickInsertMenuRoot = function QuickInsertMenuRoot(_ref) {
var _surfaceContext$get, _registeredMenu$maxHe;
var emptyStateHandler = _ref.emptyStateHandler,
fireAnalyticsEvent = _ref.fireAnalyticsEvent,
getItemRank = _ref.getItemRank,
getRecommendedItems = _ref.getRecommendedItems;
var registeredMenu = (0, _context.useRegisteredMenuContext)();
var _registeredMenu$query = registeredMenu.query,
query = _registeredMenu$query === void 0 ? '' : _registeredMenu$query,
selectFromHost = registeredMenu.select,
surfaceContext = registeredMenu.surfaceContext;
var surface = (_surfaceContext$get = surfaceContext.get(_surfaceContext.REGISTERED_MENU_SURFACE_CONTEXT)) === null || _surfaceContext$get === void 0 ? void 0 : _surfaceContext$get.surface;
if (!selectFromHost || !surface || surface === 'element-browser') {
throw new Error('QuickInsertMenuRoot requires a selection action and registered menu surface');
}
var _useIntl = (0, _reactIntl.useIntl)(),
formatMessage = _useIntl.formatMessage;
var components = registeredMenu.components,
runtimeItemRank = registeredMenu.getItemRank,
rootComponent = registeredMenu.rootComponent;
var model = (0, _react.useMemo)(function () {
return (0, _getQuickInsertMenuModel.getQuickInsertMenuModel)({
components: components,
formatMessage: formatMessage,
getItemRank: runtimeItemRank !== null && runtimeItemRank !== void 0 ? runtimeItemRank : getItemRank,
getRecommendedItems: getRecommendedItems,
query: query,
rootComponent: rootComponent,
selectCategoryItems: components.some(function (_ref2) {
var key = _ref2.key;
return (0, _typeAheadIsSectionOverflowItemKey.isSectionOverflowItemKey)(key);
}) ? _selectQuickInsertCategoryItems.selectQuickInsertCategoryItems : undefined,
surfaceContext: surfaceContext
});
}, [components, formatMessage, getItemRank, getRecommendedItems, query, rootComponent, runtimeItemRank, surfaceContext]);
var resultCount = (0, _react.useMemo)(function () {
return model.sections.reduce(function (count, _ref3) {
var _ref4 = (0, _toArray2.default)(_ref3),
items = _arrayLikeToArray(_ref4).slice(1);
return count + items.filter(function (_ref5) {
var key = _ref5.key;
return !(0, _typeAheadIsSectionOverflowItemKey.isSectionOverflowItemKey)(key);
}).length;
}, 0);
}, [model.sections]);
var flushSearchAnalytics = (0, _useQuickInsertSearchAnalytics.useQuickInsertSearchAnalytics)({
surface: surface,
fireAnalyticsEvent: fireAnalyticsEvent,
query: query,
resultCount: resultCount
});
var selectItem = (0, _react.useCallback)(function (selection) {
flushSearchAnalytics();
selectFromHost(function (insert) {
return selection({
insert: insert,
source: surface === 'toolbar' ? _enums.INPUT_METHOD.INSERT_MENU : _enums.INPUT_METHOD.QUICK_INSERT
});
});
}, [flushSearchAnalytics, selectFromHost, surface]);
var menuContextValue = (0, _react.useMemo)(function () {
return {
editorView: registeredMenu.editorView,
isOffline: registeredMenu.isOffline,
popupsMountPoint: registeredMenu.portalMountPoint,
select: selectItem,
surfaceContext: registeredMenu.surfaceContext
};
}, [registeredMenu.editorView, registeredMenu.isOffline, registeredMenu.portalMountPoint, registeredMenu.surfaceContext, selectItem]);
var listLabel = formatMessage(surface === 'typeahead' ? _messages.typeAheadListMessages.quickInsertInputLabel : _insertBlock.toolbarInsertBlockMessages.insertMenu);
var _useRegisteredMenu = (0, _useRegisteredMenu2.useRegisteredMenu)({
model: model,
resetKey: query
}),
rows = _useRegisteredMenu.rows,
selectableItems = _useRegisteredMenu.selectableItems,
selectedItemIndex = _useRegisteredMenu.selectedItemIndex,
activeItemKey = _useRegisteredMenu.activeItemKey,
selectionSource = _useRegisteredMenu.selectionSource,
listEvents = (0, _objectWithoutProperties2.default)(_useRegisteredMenu, _excluded);
var listId = (0, _react.useId)();
var _useState = (0, _react.useState)({
startIndex: -1,
stopIndex: -1
}),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
renderedItems = _useState2[0],
setRenderedItems = _useState2[1];
var menuRef = (0, _react.useRef)(null);
var maxHeight = (_registeredMenu$maxHe = registeredMenu.maxHeight) !== null && _registeredMenu$maxHe !== void 0 ? _registeredMenu$maxHe : DEFAULT_MENU_MAX_HEIGHT;
var itemCount = selectableItems.length + (model.footer ? 1 : 0);
var activeItemId = selectedItemIndex >= 0 && selectedItemIndex < itemCount ? (0, _getQuickInsertMenuItemId.getQuickInsertMenuItemId)(listId, selectedItemIndex) : undefined;
var isActiveItemMounted = selectedItemIndex >= 0 && selectedItemIndex < itemCount && (selectedItemIndex >= renderedItems.startIndex && selectedItemIndex <= renderedItems.stopIndex || Boolean(model.footer) && selectedItemIndex === itemCount - 1);
var selectActiveItem = (0, _react.useCallback)(function () {
if (isActiveItemMounted && activeItemId) {
var _menuRef$current;
(_menuRef$current = menuRef.current) === null || _menuRef$current === void 0 || (_menuRef$current = _menuRef$current.ownerDocument.getElementById(activeItemId)) === null || _menuRef$current === void 0 || _menuRef$current.click();
}
}, [activeItemId, isActiveItemMounted]);
var onMenuKeyDown = (0, _react.useCallback)(function (event) {
if (event.key === 'ArrowDown') {
listEvents.selectNext();
return true;
}
if (event.key === 'ArrowUp') {
listEvents.selectPrevious();
return true;
}
if (event.key === 'Enter') {
if (isImeEnter(event)) {
return false;
}
selectActiveItem();
return true;
}
return false;
}, [listEvents.selectNext, listEvents.selectPrevious, selectActiveItem]);
var containsTarget = (0, _react.useCallback)(function (target) {
var _menuRef$current2;
return Boolean((_menuRef$current2 = menuRef.current) === null || _menuRef$current2 === void 0 ? void 0 : _menuRef$current2.contains(target));
}, []);
var interaction = (0, _react.useMemo)(function () {
return {
activeDescendantId: isActiveItemMounted ? activeItemId : undefined,
containsTarget: containsTarget,
expanded: itemCount > 0,
label: listLabel,
listId: listId,
onKeyDown: onMenuKeyDown,
onClose: flushSearchAnalytics,
optionCount: itemCount,
selectNext: listEvents.selectNext,
selectPrevious: listEvents.selectPrevious
};
}, [activeItemId, containsTarget, flushSearchAnalytics, isActiveItemMounted, itemCount, listId, listLabel, listEvents.selectNext, listEvents.selectPrevious, onMenuKeyDown]);
(0, _react.useLayoutEffect)(function () {
if (!model.root) {
return;
}
return registeredMenu.registerInteraction(interaction);
}, [model.root, interaction, registeredMenu.registerInteraction]);
if (!model.root) {
return null;
}
return /*#__PURE__*/_react.default.createElement(_provider.QuickInsertProvider, {
value: menuContextValue
}, /*#__PURE__*/_react.default.createElement("div", {
ref: menuRef
}, /*#__PURE__*/_react.default.createElement(_menuGroup.default, null, surface === 'typeahead' ? /*#__PURE__*/_react.default.createElement(_TypeAheadQuickInsertMenu.TypeAheadQuickInsertMenu, {
Item: _RegisteredQuickInsertMenuItem.RegisteredQuickInsertMenuItem,
activeItemKey: activeItemKey,
hasScrollPadding: true,
itemCount: itemCount,
listId: listId,
listLabel: listLabel,
maxHeight: maxHeight,
model: model,
onItemBlur: listEvents.onItemBlur,
onItemFocus: listEvents.onItemFocus,
onItemHover: listEvents.onItemHover,
onItemLeave: listEvents.onItemLeave,
onItemVisibilityChange: listEvents.onItemVisibilityChange,
onRenderedItemsChange: setRenderedItems,
query: query,
rows: rows,
selectedItemIndex: selectedItemIndex,
selectionSource: selectionSource
}) : /*#__PURE__*/_react.default.createElement(_ToolbarQuickInsertMenu.ToolbarQuickInsertMenu, {
Item: _RegisteredQuickInsertMenuItem.RegisteredQuickInsertMenuItem,
activePreviewItemKey: activeItemKey,
emptyStateHandler: emptyStateHandler,
itemCount: itemCount,
listId: listId,
listLabel: listLabel,
maxHeight: maxHeight,
model: model,
onItemBlur: listEvents.onItemBlur,
onItemFocus: listEvents.onItemFocus,
onItemHover: listEvents.onItemHover,
onItemLeave: listEvents.onItemLeave,
onItemVisibilityChange: listEvents.onItemVisibilityChange,
onRenderedItemsChange: setRenderedItems,
query: query,
rows: rows,
selectedItemIndex: selectedItemIndex,
selectionSource: selectionSource
}))));
};
var _default = exports.default = QuickInsertMenuRoot;