UNPKG

@atlaskit/editor-plugin-copy-button

Version:

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

136 lines (133 loc) 4.94 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; 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) { _defineProperty(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; } import { SafePlugin } from '@atlaskit/editor-common/safe-plugin'; import { DecorationSet } from '@atlaskit/editor-prosemirror/view'; import { copyButtonPluginKey } from './plugin-key'; export 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; } export function copyButtonPlugin() { return new SafePlugin({ key: copyButtonPluginKey, state: { init: function init() { return { copied: false, markSelection: undefined }; }, apply: function apply(tr, currentPluginState) { var meta = tr.getMeta(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 DecorationSet.empty; } } }); } export default copyButtonPlugin;