UNPKG

@atlaskit/editor-plugin-selection-extension

Version:

editor-plugin-selection-extension plugin for @atlaskit/editor-core

168 lines (160 loc) 6.32 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.selectionExtensionPlugin = void 0; var _react = _interopRequireDefault(require("react")); var _main = require("./pm-plugins/main"); var _SelectionExtensionComponentWrapper = require("./ui/extension/SelectionExtensionComponentWrapper"); var _getBoundingBoxFromSelection = require("./ui/getBoundingBoxFromSelection"); var _SelectionExtensionItems = require("./ui/toolbar/SelectionExtensionItems"); var selectionExtensionPlugin = exports.selectionExtensionPlugin = function selectionExtensionPlugin(_ref) { var api = _ref.api, config = _ref.config; return { name: 'selectionExtension', getSharedState: function getSharedState(editorState) { if (!editorState) { return null; } return _main.selectionExtensionPluginKey.getState(editorState) || null; }, commands: { setActiveExtension: function setActiveExtension(extension) { return function (_ref2) { var tr = _ref2.tr; return tr.setMeta(_main.selectionExtensionPluginKey, { type: 'set-active-extension', extension: extension }); }; }, clearActiveExtension: function clearActiveExtension() { return function (_ref3) { var tr = _ref3.tr; return tr.setMeta(_main.selectionExtensionPluginKey, { type: 'clear-active-extension' }); }; } }, contentComponent: function contentComponent(_ref4) { var _api$analytics; var editorView = _ref4.editorView; return /*#__PURE__*/_react.default.createElement(_SelectionExtensionComponentWrapper.SelectionExtensionComponentWrapper, { editorView: editorView, api: api, editorAnalyticsAPI: api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions }); }, pluginsOptions: { selectionToolbar: function selectionToolbar(state) { var _api$editorViewMode; if (!config) { return; } var pageModes = config.pageModes, extensions = config.extensions; /** * Extensions Config Validation * * Check whether plugin contains any selection extensions */ if (!extensions || extensions.length === 0) { return; } /** * Content Mode Validation * * Check if pageModes is provided and matches against current content mode * * TODO: This will eventially transition from mode to contentMode */ var editorContentMode = api === null || api === void 0 || (_api$editorViewMode = api.editorViewMode) === null || _api$editorViewMode === void 0 || (_api$editorViewMode = _api$editorViewMode.sharedState.currentState()) === null || _api$editorViewMode === void 0 ? void 0 : _api$editorViewMode.mode; if (pageModes) { // Early Exit: consumer has set pageModes but editorContentMode is undefined if (!editorContentMode) { return; } // Simplify traversion of pageModes which can be string or array of strings var showOnModesCollection = Array.isArray(pageModes) ? pageModes : [pageModes]; // Early Exit: consumer has set pageModes but current editorContentMode is not in the collection if (!showOnModesCollection.includes(editorContentMode)) { return; } } /** * Active Extension * * Check if there is an active extension and hide the selection extension dropdown */ var selectionExtensionState = _main.selectionExtensionPluginKey.getState(state); if (selectionExtensionState !== null && selectionExtensionState !== void 0 && selectionExtensionState.activeExtension) { return; } var handleOnExtensionClick = function handleOnExtensionClick(view) { return function (extension) { var currentSelection = state.selection; var from = currentSelection.from, to = currentSelection.to; var text = state.doc.textBetween(from, to, '\n'); var coords = (0, _getBoundingBoxFromSelection.getBoundingBoxFromSelection)(view, from, to); var selection = { text: text, selection: { from: from, to: to }, coords: coords }; // Render component here if (extension.component) { api === null || api === void 0 || api.core.actions.execute(api === null || api === void 0 ? void 0 : api.selectionExtension.commands.setActiveExtension({ extension: extension, selection: selection })); } if (extension.onClick) { extension.onClick(selection); } }; }; /** * Renders custom dropdown menu with active selection extensions */ var selectionExtensionDropdown = { type: 'custom', supportsViewMode: true, render: function render(view) { var _api$analytics2; if (!view) { return; } return /*#__PURE__*/_react.default.createElement(_SelectionExtensionItems.SelectionExtensionItems, { api: api, editorView: view, editorAnalyticsAPI: api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 ? void 0 : _api$analytics2.actions, extensions: extensions, onExtensionClick: handleOnExtensionClick(view) }); }, fallback: [] }; return { isToolbarAbove: true, items: [selectionExtensionDropdown], rank: -6 }; } }, pmPlugins: function pmPlugins() { return [{ name: 'selectionExtension', plugin: function plugin() { return (0, _main.createPlugin)(); } }]; } }; };