@atlaskit/editor-plugin-copy-button
Version:
editor-plugin-copy-button for @atlaskit/editor-core
136 lines (133 loc) • 4.94 kB
JavaScript
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;