UNPKG

@atlaskit/editor-plugin-copy-button

Version:

editor-plugin-copy-button for @atlaskit/editor-core

145 lines (141 loc) 5.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.copyButtonPlugin = copyButtonPlugin; exports.default = void 0; exports.getMarkSelectionHelper = getMarkSelectionHelper; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _safePlugin = require("@atlaskit/editor-common/safe-plugin"); var _view = require("@atlaskit/editor-prosemirror/view"); var _pluginKey = require("./plugin-key"); 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; } function getMarkSelectionHelper(_ref) { var $pos = _ref.$pos, markType = _ref.markType; var hasMark = $pos.doc.rangeHasMark($pos.pos, Math.min($pos.pos + 1, $pos.doc.nodeSize), markType); if (!hasMark) { return false; } if ($pos.parent.childCount === 1) { var nodePosition = $pos.pos; var maybeNode = $pos.doc.nodeAt(nodePosition); if (!maybeNode || !maybeNode.isText) { return false; } var start = $pos.pos - $pos.parentOffset; var end = start + maybeNode.nodeSize; return { start: start, end: end }; } if ($pos.parent.childCount > 1) { var _start = $pos.pos - $pos.textOffset; var maybeTextNode = $pos.doc.nodeAt(_start); if (!maybeTextNode || !maybeTextNode.isText) { return false; } var _end = _start + maybeTextNode.nodeSize; return { start: _start, end: _end }; } return false; } function getMarkSelectionDecorationStartAndEnd(_ref2) { var markType = _ref2.markType, transaction = _ref2.transaction; var anchorPositions = getMarkSelectionHelper({ $pos: transaction.selection.$anchor, markType: markType }); if (anchorPositions) { return _objectSpread(_objectSpread({}, anchorPositions), {}, { markType: markType }); } var headPositions = getMarkSelectionHelper({ $pos: transaction.selection.$head, markType: markType }); if (headPositions) { return _objectSpread(_objectSpread({}, headPositions), {}, { markType: markType }); } return undefined; } function copyButtonPlugin() { return new _safePlugin.SafePlugin({ key: _pluginKey.copyButtonPluginKey, state: { init: function init() { return { copied: false, markSelection: undefined }; }, apply: function apply(tr, currentPluginState) { var meta = tr.getMeta(_pluginKey.copyButtonPluginKey); if ((meta === null || meta === void 0 ? void 0 : meta.copied) !== undefined) { return { copied: meta.copied, markSelection: undefined }; } if (meta !== null && meta !== void 0 && meta.showSelection) { return { copied: currentPluginState.copied, markSelection: getMarkSelectionDecorationStartAndEnd({ markType: meta.markType, transaction: tr }) }; } if (meta !== null && meta !== void 0 && meta.removeSelection) { return { copied: currentPluginState.copied, markSelection: undefined }; } if (currentPluginState.markSelection) { return { copied: currentPluginState.copied, markSelection: getMarkSelectionDecorationStartAndEnd({ markType: currentPluginState.markSelection.markType, transaction: tr }) }; } return currentPluginState; } }, props: { decorations: function decorations(_state) { // Showing visual hints for the hyperlink copy button has been disabled // due to an issue where invalid hyperlink marks cause the floating toolbar // to jump around when the copy button is hovered. // See the following bug for details -- once that is resolved -- the visual // hints can be re enabled. // https://product-fabric.atlassian.net/browse/DTR-722 // const copyButtonPluginState = copyButtonPluginKey.getState( // state, // ) as CopyButtonPluginState; // if (copyButtonPluginState.markSelection) { // const { start, end } = copyButtonPluginState.markSelection; // return DecorationSet.create(state.doc, [ // Decoration.inline(start, end, { // class: 'ProseMirror-fake-text-selection', // }), // ]); // } return _view.DecorationSet.empty; } } }); } var _default = exports.default = copyButtonPlugin;