UNPKG

@atlaskit/editor-plugin-copy-button

Version:

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

109 lines (106 loc) 5.41 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 commonMessages from '@atlaskit/editor-common/messages'; import CopyIcon from '@atlaskit/icon/core/copy'; import { createToolbarCopyCommandForMark, createToolbarCopyCommandForNode, getProvideMarkVisualFeedbackForCopyButtonCommand, removeMarkVisualFeedbackForCopyButtonCommand, resetCopiedState } from '../pm-plugins/commands'; import { copyButtonPluginKey } from '../pm-plugins/plugin-key'; // eslint-disable-next-line @typescript-eslint/no-explicit-any function isSeparator(item) { return (item === null || item === void 0 ? void 0 : item.type) === 'separator'; } function isNodeOptions(options) { return 'nodeType' in options && options.nodeType !== undefined; } /** * Performs the actions after a copy operation. * - Sets the copied state in the editor state * - Announces the copied message to the user */ export var afterCopy = function afterCopy(api) { return function (message) { var _api$accessibilityUti; api === null || api === void 0 || api.core.actions.execute(function (_ref) { var tr = _ref.tr; return tr.setMeta(copyButtonPluginKey, { copied: true }).setMeta('scrollIntoView', false); }); api === null || api === void 0 || (_api$accessibilityUti = api.accessibilityUtils) === null || _api$accessibilityUti === void 0 || _api$accessibilityUti.actions.ariaNotify(message, { priority: 'important' }); }; }; export function getCopyButtonConfig(options, hoverDecoration, editorAnalyticsApi, api) { var state = options.state, formatMessage = options.formatMessage, onMouseEnter = options.onMouseEnter, onMouseLeave = options.onMouseLeave, onFocus = options.onFocus, onBlur = options.onBlur; var copyButtonState = copyButtonPluginKey.getState(state); var buttonActionHandlers; if (isNodeOptions(options)) { var onClick = options.onClick; buttonActionHandlers = { onClick: createToolbarCopyCommandForNode(options.nodeType, editorAnalyticsApi, api, formatMessage(commonMessages.copiedToClipboard)), // Note for future changes: these two handlers should perform // the same action. onMouseEnter: onMouseEnter || (hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(options.nodeType, true, 'ak-editor-selected-node')), onFocus: onFocus || (hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(options.nodeType, true, 'ak-editor-selected-node')), // Note for future changes: these two handlers should perform // the same action. onMouseLeave: resetCopiedState(options.nodeType, hoverDecoration, onMouseLeave), onBlur: resetCopiedState(options.nodeType, hoverDecoration, onBlur) }; if (onClick) { buttonActionHandlers.onClick = function (editorState, dispatch, editorView) { if (onClick(editorState, dispatch, editorView)) { afterCopy(api)(formatMessage(commonMessages.copiedToClipboard)); return true; } return false; }; } } else { buttonActionHandlers = { onClick: createToolbarCopyCommandForMark(options.markType, editorAnalyticsApi), onMouseEnter: getProvideMarkVisualFeedbackForCopyButtonCommand(options.markType), onFocus: getProvideMarkVisualFeedbackForCopyButtonCommand(options.markType), onMouseLeave: removeMarkVisualFeedbackForCopyButtonCommand, onBlur: removeMarkVisualFeedbackForCopyButtonCommand }; } return _objectSpread(_objectSpread({ id: 'editor.floatingToolbar.copy', type: 'button', appearance: 'subtle', icon: CopyIcon, title: formatMessage(copyButtonState !== null && copyButtonState !== void 0 && copyButtonState.copied ? commonMessages.copiedToClipboard : commonMessages.copyToClipboard) }, buttonActionHandlers), {}, { hideTooltipOnClick: false, tabIndex: null }); } /** * Process floatingToolbar items for copyButton */ export var processCopyButtonItems = function processCopyButtonItems(editorAnalyticsApi, api) { return function (_state) { return function (items, hoverDecoration) { return items.flatMap(function (item) { switch (item.type) { case 'copy-button': if (item !== null && item !== void 0 && item.hidden) { return []; } return item === null || item === void 0 ? void 0 : item.items.map(function (copyButtonItem) { return isSeparator(copyButtonItem) ? copyButtonItem : getCopyButtonConfig(copyButtonItem, hoverDecoration, editorAnalyticsApi, api); }); default: return [item]; } }); }; }; };