UNPKG

@atlaskit/editor-plugin-quick-insert

Version:

Quick insert plugin for @atlaskit/editor-core

158 lines (157 loc) 5.81 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getQuickInsertOpenExperiencePlugin = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _analytics = require("@atlaskit/editor-common/analytics"); var _experiences = require("@atlaskit/editor-common/experiences"); var _safePlugin = require("@atlaskit/editor-common/safe-plugin"); var _state = require("@atlaskit/editor-prosemirror/state"); var pluginKey = new _state.PluginKey('quickInsertOpenExperience'); var TIMEOUT_DURATION = 1000; var START_METHOD = { QUICK_INSERT_BUTTON: 'quickInsertButton', TYPEAHEAD: 'typeahead' }; var ABORT_REASON = { USER_CANCELED: 'userCanceled', EDITOR_DESTROYED: 'editorDestroyed' }; /** * This experience tracks when the quick insert is opened. * * Start: When user types `/` to open quick insert or clicks the quick insert button * Success: When the quick insert menu is added to the DOM within 500ms of start * Failure: When 500ms passes without the quick insert menu being added to the DOM * Abort: When user presses escape or backspace */ var getQuickInsertOpenExperiencePlugin = exports.getQuickInsertOpenExperiencePlugin = function getQuickInsertOpenExperiencePlugin(_ref) { var refs = _ref.refs, dispatchAnalyticsEvent = _ref.dispatchAnalyticsEvent; var targetEl; var editorViewEl; var mouseDownPos; var getTarget = function getTarget() { if (!targetEl) { targetEl = refs.popupsMountPoint || refs.wrapperElement || (0, _experiences.getPopupContainerFromEditorView)(editorViewEl); } return targetEl; }; var experience = new _experiences.Experience(_experiences.EXPERIENCE_ID.MENU_OPEN, { actionSubjectId: _analytics.ACTION_SUBJECT_ID.QUICK_INSERT, dispatchAnalyticsEvent: dispatchAnalyticsEvent, checks: [new _experiences.ExperienceCheckTimeout({ durationMs: TIMEOUT_DURATION }), new _experiences.ExperienceCheckDomMutation({ onDomMutation: function onDomMutation(_ref2) { var mutations = _ref2.mutations; if (mutations.some(isQuickInsertMenuAddedInMutation)) { return { status: 'success' }; } }, observeConfig: function observeConfig() { return { target: getTarget(), options: { childList: true } }; } })] }); return new _safePlugin.SafePlugin({ key: pluginKey, props: { handleDOMEvents: { mousedown: function mousedown(_view, event) { if (isTargetQuickInsertButton(event.target)) { mouseDownPos = { x: event.clientX, y: event.clientY }; } }, mouseup: function mouseup(_view, event) { if (mouseDownPos && isTargetQuickInsertButton(event.target) && event.clientX === mouseDownPos.x && event.clientY === mouseDownPos.y) { experience.start({ method: START_METHOD.QUICK_INSERT_BUTTON }); } mouseDownPos = undefined; }, beforeinput: function beforeinput(view, event) { if (isQuickInsertTrigger(event) && isSelectionWhichSupportsTypeahead(view) && !isQuickInsertMenuWithinNode(getTarget())) { experience.start({ method: START_METHOD.TYPEAHEAD, forceRestart: true }); } }, keydown: function keydown(_view, event) { if (isCancelKey(event.key) && !isQuickInsertMenuWithinNode(getTarget())) { experience.abort({ reason: ABORT_REASON.USER_CANCELED }); } } } }, view: function view(editorView) { editorViewEl = editorView.dom; return { destroy: function destroy() { experience.abort({ reason: ABORT_REASON.EDITOR_DESTROYED }); } }; } }); }; var isQuickInsertTrigger = function isQuickInsertTrigger(_ref3) { var inputType = _ref3.inputType, data = _ref3.data; return inputType === 'insertText' && data === '/'; }; var isSelectionWhichSupportsTypeahead = function isSelectionWhichSupportsTypeahead(_ref4) { var _nodeBefore$textConte; var state = _ref4.state; var _state$selection = state.selection, from = _state$selection.from, $from = _state$selection.$from; if ($from.parent.type.name === 'codeBlock') { return false; } if ($from.marks().some(function (mark) { return mark.type.name === 'code'; })) { return false; } if (from === 0) { return true; } var nodeBefore = state.doc.resolve(from).nodeBefore; if (!nodeBefore) { return true; } var charBefore = ((_nodeBefore$textConte = nodeBefore.textContent) === null || _nodeBefore$textConte === void 0 ? void 0 : _nodeBefore$textConte.slice(-1)) || ''; return charBefore.trim().length === 0; }; var isCancelKey = function isCancelKey(key) { return key === 'Escape' || key === 'Backspace'; }; var isTargetQuickInsertButton = function isTargetQuickInsertButton(target) { return target instanceof HTMLElement && (target.dataset.testid === 'editor-quick-insert-button' || !!target.closest('[data-testid="editor-quick-insert-button"]')); }; var isQuickInsertMenuAddedInMutation = function isQuickInsertMenuAddedInMutation(_ref5) { var type = _ref5.type, addedNodes = _ref5.addedNodes; return type === 'childList' && (0, _toConsumableArray2.default)(addedNodes).some(isQuickInsertMenuWithinNode); }; var isQuickInsertMenuWithinNode = function isQuickInsertMenuWithinNode(node) { return (0, _experiences.containsPopupWithNestedElement)(node, '.fabric-editor-typeahead'); };