@atlaskit/editor-plugin-insert-block
Version:
Insert block plugin for @atlaskit/editor-core
191 lines (190 loc) • 7.42 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getToolbarActionExperiencesPlugin = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _bindEventListener = require("bind-event-listener");
var _browserApis = require("@atlaskit/browser-apis");
var _experiences = require("@atlaskit/editor-common/experiences");
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
var _toolbar = require("@atlaskit/editor-common/toolbar");
var _state = require("@atlaskit/editor-prosemirror/state");
var _toolbarExperienceUtils = require("./toolbar-experience-utils");
var pluginKey = new _state.PluginKey('toolbarActionExperiences');
var TIMEOUT_DURATION = 1000;
var PRIMARY_TOOLBAR = 'primaryToolbar';
var ABORT_REASON = {
USER_CANCELED: 'userCanceled',
EDITOR_DESTROYED: 'editorDestroyed'
};
var getToolbarActionExperiencesPlugin = exports.getToolbarActionExperiencesPlugin = function getToolbarActionExperiencesPlugin(_ref) {
var dispatchAnalyticsEvent = _ref.dispatchAnalyticsEvent;
var editorView;
var lastClickedToolbarButton;
var getEditorDom = function getEditorDom() {
var _editorView;
if (((_editorView = editorView) === null || _editorView === void 0 ? void 0 : _editorView.dom) instanceof HTMLElement) {
return editorView.dom;
}
return null;
};
var getInlinePopupTarget = function getInlinePopupTarget() {
var _lastClickedToolbarBu;
if (!lastClickedToolbarButton) {
return undefined;
}
return (_lastClickedToolbarBu = lastClickedToolbarButton.closest('[data-toolbar-component="button-group"]')) !== null && _lastClickedToolbarBu !== void 0 ? _lastClickedToolbarBu : lastClickedToolbarButton;
};
var observeConfigs = function observeConfigs() {
var narrowTarget = (0, _experiences.getSelectionAncestorDOM)(editorView);
var editorDom = getEditorDom();
return [].concat((0, _toConsumableArray2.default)(narrowTarget ? [{
target: narrowTarget,
options: {
childList: true,
subtree: true
}
}] : []), (0, _toConsumableArray2.default)(editorDom ? [{
target: editorDom,
options: {
childList: true
}
}] : []));
};
var createNodeInsertExperience = function createNodeInsertExperience(action) {
return new _experiences.Experience(_experiences.EXPERIENCE_ID.TOOLBAR_ACTION, {
action: action,
actionSubjectId: PRIMARY_TOOLBAR,
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
checks: [new _experiences.ExperienceCheckTimeout({
durationMs: TIMEOUT_DURATION
}), new _experiences.ExperienceCheckDomMutation({
onDomMutation: _toolbarExperienceUtils.handleEditorNodeInsertDomMutation,
observeConfig: observeConfigs
})]
});
};
var buildPopupMutationConfig = function buildPopupMutationConfig(popupSelector, type) {
switch (type) {
case 'inline':
return {
type: type,
nestedElementQuery: popupSelector,
getTarget: getInlinePopupTarget,
subtree: true
};
case 'editorRoot':
return {
type: type,
nestedElementQuery: popupSelector,
getEditorDom: getEditorDom
};
}
};
var createPopupExperience = function createPopupExperience(action, popupSelector, type) {
return new _experiences.Experience(_experiences.EXPERIENCE_ID.TOOLBAR_ACTION, {
action: action,
actionSubjectId: PRIMARY_TOOLBAR,
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
checks: [new _experiences.ExperienceCheckTimeout({
durationMs: TIMEOUT_DURATION
}), new _experiences.ExperienceCheckPopupMutation(buildPopupMutationConfig(popupSelector, type))]
});
};
var experienceButtonMappings = [{
experience: createPopupExperience('insert', '[data-testid="popup-wrapper"]', 'inline'),
buttonTestId: _toolbar.TOOLBAR_BUTTON_TEST_ID.INSERT
}, {
experience: createPopupExperience('emoji', '[data-emoji-picker-container], [data-emoji-picker-container="true"], [data-testid="popup-wrapper"]', 'inline'),
buttonTestId: _toolbar.TOOLBAR_BUTTON_TEST_ID.EMOJI
}, {
experience: createPopupExperience('media', '[data-testid="popup-wrapper"]', 'inline'),
buttonTestId: _toolbar.TOOLBAR_BUTTON_TEST_ID.MEDIA
}, {
experience: createPopupExperience('mention', '[data-testid="popup-wrapper"], [data-type-ahead="typeaheadDecoration"]', 'editorRoot'),
buttonTestId: _toolbar.TOOLBAR_BUTTON_TEST_ID.MENTION
}, {
experience: createNodeInsertExperience('table'),
buttonTestId: _toolbar.TOOLBAR_BUTTON_TEST_ID.TABLE
}, {
experience: createPopupExperience('tableSelector', '[data-testid="popup-wrapper"]', 'inline'),
buttonTestId: _toolbar.TOOLBAR_BUTTON_TEST_ID.TABLE_SELECTOR
}, {
experience: createNodeInsertExperience('layout'),
buttonTestId: _toolbar.TOOLBAR_BUTTON_TEST_ID.LAYOUT
}, {
experience: createPopupExperience('image', '[data-testid="popup-wrapper"]', 'inline'),
buttonTestId: _toolbar.TOOLBAR_BUTTON_TEST_ID.IMAGE
}, {
experience: createNodeInsertExperience('action'),
buttonTestId: _toolbar.TOOLBAR_BUTTON_TEST_ID.TASK_LIST
}];
var handleToolbarButtonClick = function handleToolbarButtonClick(target) {
for (var _i = 0, _experienceButtonMapp = experienceButtonMappings; _i < _experienceButtonMapp.length; _i++) {
var _experienceButtonMapp2 = _experienceButtonMapp[_i],
experience = _experienceButtonMapp2.experience,
buttonTestId = _experienceButtonMapp2.buttonTestId;
if ((0, _toolbarExperienceUtils.isToolbarButtonClick)(target, buttonTestId)) {
// Store the clicked button so inline popup checks can find its button-group
lastClickedToolbarButton = target;
experience.start({
forceRestart: true
});
return;
}
}
};
var abortAllExperiences = function abortAllExperiences(reason) {
for (var _i2 = 0, _experienceButtonMapp3 = experienceButtonMappings; _i2 < _experienceButtonMapp3.length; _i2++) {
var experience = _experienceButtonMapp3[_i2].experience;
experience.abort({
reason: reason
});
}
};
var doc = (0, _browserApis.getDocument)();
if (!doc) {
return new _safePlugin.SafePlugin({
key: pluginKey
});
}
var unbindClickListener = (0, _bindEventListener.bind)(doc, {
type: 'click',
listener: function listener(event) {
var target = event.target;
if (target instanceof HTMLElement) {
handleToolbarButtonClick(target);
}
},
options: {
capture: true
}
});
var unbindKeydownListener = (0, _bindEventListener.bind)(doc, {
type: 'keydown',
listener: function listener(event) {
if (event.key === 'Escape') {
abortAllExperiences(ABORT_REASON.USER_CANCELED);
}
},
options: {
capture: true
}
});
return new _safePlugin.SafePlugin({
key: pluginKey,
view: function view(_view) {
editorView = _view;
return {
destroy: function destroy() {
abortAllExperiences(ABORT_REASON.EDITOR_DESTROYED);
editorView = undefined;
unbindClickListener();
unbindKeydownListener();
}
};
}
});
};