UNPKG

@atlaskit/editor-core

Version:

A package contains Atlassian editor core functionality

187 lines (185 loc) 9.92 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.combineQuickInsertProviders = combineQuickInsertProviders; exports.extensionProviderToQuickInsertProvider = extensionProviderToQuickInsertProvider; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _reactLoadable = _interopRequireDefault(require("react-loadable")); var _analytics = require("@atlaskit/editor-common/analytics"); var _extensions = require("@atlaskit/editor-common/extensions"); var _providerHelpers = require("@atlaskit/editor-common/provider-helpers"); var _analytics2 = require("@atlaskit/editor-common/utils/analytics"); var _platformFeatureFlags = require("@atlaskit/platform-feature-flags"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // Structural shape of the markdown-mode plugin's slice of the injection API. // Used to read `isMarkdownMode` without importing the `MarkdownModePlugin` // type — that would pull editor-plugin-markdown-mode into editor-core's // dependency graph and force every consuming product to rebuild. /** * Utils to send analytics event when a extension is inserted using quickInsert */ function sendExtensionQuickInsertAnalytics(item, selection, createAnalyticsEvent, source) { if (createAnalyticsEvent) { var insertLocation = (0, _analytics2.findInsertLocation)(selection); (0, _analytics.fireAnalyticsEvent)(createAnalyticsEvent)({ payload: { action: _analytics.ACTION.INSERTED, actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT, actionSubjectId: _analytics.ACTION_SUBJECT_ID.EXTENSION, attributes: _objectSpread({ extensionType: item.extensionType, extensionKey: item.extensionKey, key: item.key, // @note inputMethod defaults to QUICK_INSERT if not provided inputMethod: source || _analytics.INPUT_METHOD.QUICK_INSERT }, insertLocation ? { insertLocation: insertLocation } : {}), eventType: _analytics.EVENT_TYPE.TRACK } }); } } var showDummyAPIWarning = function showDummyAPIWarning(location) { if (process.env.NODE_ENV !== 'production') { // eslint-disable-next-line no-console console.warn("Extension plugin not attached to editor - cannot use extension API in ".concat(location)); } }; var dummyExtensionAPI = { editInContextPanel: function editInContextPanel() { return showDummyAPIWarning('editInContextPanel'); }, _editInLegacyMacroBrowser: function _editInLegacyMacroBrowser() { return showDummyAPIWarning('_editInLegacyMacroBrowser'); }, getNodeWithPosByLocalId: function getNodeWithPosByLocalId() { return { node: null, pos: null }; }, doc: { insertAfter: function insertAfter() { return showDummyAPIWarning('doc:insertAfter'); }, scrollTo: function scrollTo() { return showDummyAPIWarning('doc:scrollTo'); }, update: function update() { return showDummyAPIWarning('doc:update'); } } }; function extensionProviderToQuickInsertProvider(_x, _x2, _x3, _x4) { return _extensionProviderToQuickInsertProvider.apply(this, arguments); } function _extensionProviderToQuickInsertProvider() { _extensionProviderToQuickInsertProvider = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(extensionProvider, editorActions, apiRef, createAnalyticsEvent) { var extensions; return _regenerator.default.wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.next = 2; return extensionProvider.getExtensions(); case 2: extensions = _context.sent; return _context.abrupt("return", { getItems: function getItems() { var _apiRef$current; // `extensionProvider` is supplied independently of the preset, so // suppress its items in markdown mode where rich-only content cannot // be inserted. See `MarkdownModeReader` above for why this is read // via a structural cast rather than the typed plugin API. var isMarkdownMode = (_apiRef$current = apiRef.current) === null || _apiRef$current === void 0 || (_apiRef$current = _apiRef$current.markdownMode) === null || _apiRef$current === void 0 || (_apiRef$current = _apiRef$current.sharedState.currentState()) === null || _apiRef$current === void 0 ? void 0 : _apiRef$current.isMarkdownMode; if (isMarkdownMode) { return Promise.resolve([]); } var quickInsertItems = (0, _extensions.getQuickInsertItemsFromModule)(extensions, function (item) { var Icon = (0, _reactLoadable.default)({ loader: item.icon, loading: function loading() { return null; } }); return _objectSpread(_objectSpread(_objectSpread({ // Add module key so typeahead/quick-insert can identify items // **locale-agnostically**! nb: we _already_ send key in analytics // events, this standardises and makes our items more predictable. key: item.key, title: item.title, description: item.description, icon: function icon() { return /*#__PURE__*/_react.default.createElement(Icon, { label: "" }); }, keywords: item.keywords, featured: item.featured }, ((0, _platformFeatureFlags.fg)('cc_fd_wb_create_priority_in_slash_menu_enabled') || (0, _platformFeatureFlags.fg)('rovo_chat_enable_skills_ui_m1')) && { priority: item.priority }), {}, { categories: item.categories }, item.lozenge != null && { lozenge: item.lozenge }), {}, { isDisabledOffline: true, action: function action(insert, state, source) { if (typeof item.node === 'function') { var _apiRef$current2; var extensionAPI = apiRef === null || apiRef === void 0 || (_apiRef$current2 = apiRef.current) === null || _apiRef$current2 === void 0 || (_apiRef$current2 = _apiRef$current2.extension) === null || _apiRef$current2 === void 0 || (_apiRef$current2 = _apiRef$current2.actions) === null || _apiRef$current2 === void 0 ? void 0 : _apiRef$current2.api(); // While this should only run when the extension some setups of editor // may not have the extension API if (extensionAPI) { (0, _extensions.resolveImport)(item.node(extensionAPI)).then(function (node) { sendExtensionQuickInsertAnalytics(item, state.selection, createAnalyticsEvent, source); if (node) { editorActions.replaceSelection(node); } }); } else { // Originally it was understood we could only use this if we were using the extension plugin // However there are some edge cases where this is not true (ie. in jira) // Since making it optional now would be a breaking change - instead we can just pass a dummy // extension API to consumers that warns them of using the methods. (0, _extensions.resolveImport)(item.node(dummyExtensionAPI)).then(function (node) { sendExtensionQuickInsertAnalytics(item, state.selection, createAnalyticsEvent, source); if (node) { editorActions.replaceSelection(node); } }); } return insert(''); } else { sendExtensionQuickInsertAnalytics(item, state.selection, createAnalyticsEvent, source); return insert(item.node); } } }); }); return Promise.all(quickInsertItems); } }); case 4: case "end": return _context.stop(); } }, _callee); })); return _extensionProviderToQuickInsertProvider.apply(this, arguments); } function combineQuickInsertProviders(quickInsertProviders) { var _combineProviders = (0, _providerHelpers.combineProviders)(quickInsertProviders), invokeList = _combineProviders.invokeList; return { getItems: function getItems() { return invokeList('getItems'); } }; }