@atlaskit/editor-plugin-panel
Version:
Panel plugin for @atlaskit/editor-core.
92 lines (91 loc) • 3.27 kB
JavaScript
import { ACTION, ACTION_SUBJECT, EVENT_TYPE, INPUT_METHOD } from '@atlaskit/editor-common/analytics';
import { getPanelTypeBackgroundNoTokens } from '@atlaskit/editor-common/panel';
import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
import { findParentNodeOfType, findSelectedNodeOfType, removeParentNodeOfType, removeSelectedNode } from '@atlaskit/editor-prosemirror/utils';
import { findPanel } from '../pm-plugins/utils/utils';
export const removePanel = editorAnalyticsAPI => (state, dispatch) => {
const {
schema: {
nodes
},
tr
} = state;
const payload = {
action: ACTION.DELETED,
actionSubject: ACTION_SUBJECT.PANEL,
attributes: {
inputMethod: INPUT_METHOD.FLOATING_TB
},
eventType: EVENT_TYPE.TRACK
};
let deleteTr = tr;
if (findSelectedNodeOfType(nodes.panel)(tr.selection)) {
deleteTr = removeSelectedNode(tr);
} else if (findParentNodeOfType(nodes.panel)(tr.selection)) {
deleteTr = removeParentNodeOfType(nodes.panel)(tr);
}
if (!deleteTr) {
return false;
}
if (dispatch) {
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 ? void 0 : editorAnalyticsAPI.attachAnalyticsEvent(payload)(deleteTr);
dispatch(deleteTr);
}
return true;
};
export const changePanelType = editorAnalyticsAPI => (panelType, panelOptions = {}, allowCustomPanel = false) => (state, dispatch) => {
const {
schema: {
nodes
},
tr
} = state;
const panelNode = findPanel(state);
if (panelNode === undefined) {
return false;
}
const newType = panelType;
const previousType = panelNode.node.attrs.panelType;
let newTr;
if (allowCustomPanel) {
const previousColor = panelNode.node.attrs.panelType === 'custom' ? panelNode.node.attrs.panelColor || 'none' : getPanelTypeBackgroundNoTokens(previousType);
const previousIcon = panelNode.node.attrs.panelIcon;
const previousIconId = panelNode.node.attrs.panelIconId;
const previousIconText = panelNode.node.attrs.panelIconText;
const newPanelOptions = {
color: previousColor,
emoji: previousIcon,
emojiId: previousIconId,
emojiText: previousIconText,
...panelOptions
};
newTr = tr.setNodeMarkup(panelNode.pos, nodes.panel, {
panelIcon: newPanelOptions.emoji,
panelIconId: newPanelOptions.emojiId,
panelIconText: newPanelOptions.emojiText,
panelColor: newPanelOptions.color,
panelType
});
} else {
newTr = tr.setNodeMarkup(panelNode.pos, nodes.panel, {
panelType
});
}
const payload = {
action: ACTION.CHANGED_TYPE,
actionSubject: ACTION_SUBJECT.PANEL,
attributes: {
newType,
previousType
},
eventType: EVENT_TYPE.TRACK
};
// Select the panel if it was previously selected
const newTrWithSelection = state.selection instanceof NodeSelection && state.selection.node.type.name === 'panel' ? newTr.setSelection(new NodeSelection(tr.doc.resolve(panelNode.pos))) : newTr;
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 ? void 0 : editorAnalyticsAPI.attachAnalyticsEvent(payload)(newTrWithSelection);
newTrWithSelection.setMeta('scrollIntoView', false);
if (dispatch) {
dispatch(newTrWithSelection);
}
return true;
};