@atlaskit/editor-plugin-block-menu
Version:
BlockMenu plugin for @atlaskit/editor-core
54 lines • 2.71 kB
JavaScript
import { startMeasure, stopMeasure } from '@atlaskit/editor-common/performance-measures';
import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
import { isNestedNode } from '../ui/utils/isNestedNode';
import { isEmptyLine } from './is-empty-line';
import { createTransformAnalytics } from './transform-analytics';
export const transformInlineNode = api => metadata => ({
tr
}) => {
var _api$blockControls, _api$blockControls$sh;
const preservedSelection = api === null || api === void 0 ? void 0 : (_api$blockControls = api.blockControls) === null || _api$blockControls === void 0 ? void 0 : (_api$blockControls$sh = _api$blockControls.sharedState.currentState()) === null || _api$blockControls$sh === void 0 ? void 0 : _api$blockControls$sh.preservedSelection;
if (!preservedSelection || !(preservedSelection instanceof NodeSelection)) {
return tr;
}
const source = {
node: preservedSelection.node,
pos: preservedSelection.from
};
const analytics = createTransformAnalytics(api, tr, preservedSelection);
const measureId = `transformInlineNode_${metadata.targetTypeName}_${Date.now()}`;
startMeasure(measureId);
const isParentLayout = tr.doc.resolve(source.pos).parent.type === tr.doc.type.schema.nodes.layoutColumn;
const isNested = isNestedNode(preservedSelection, '') && !isParentLayout;
try {
var _api$blockControls2, _api$blockControls3;
const inlineNode = metadata.buildInlineNode(source.node);
const paragraphNode = tr.doc.type.schema.nodes.paragraph.createChecked({}, [inlineNode]);
tr.replaceWith(source.pos, source.pos + source.node.nodeSize, paragraphNode);
if (NodeSelection.isSelectable(inlineNode)) {
tr.setSelection(NodeSelection.create(tr.doc, source.pos + 1));
}
api === null || api === void 0 ? void 0 : (_api$blockControls2 = api.blockControls) === null || _api$blockControls2 === void 0 ? void 0 : _api$blockControls2.commands.stopPreservingSelection()({
tr
});
api === null || api === void 0 ? void 0 : (_api$blockControls3 = api.blockControls) === null || _api$blockControls3 === void 0 ? void 0 : _api$blockControls3.commands.toggleBlockMenu({
closeMenu: true
})({
tr
});
stopMeasure(measureId, (duration, startTime) => {
analytics.transformed(duration, startTime, {
isEmptyLine: isEmptyLine([source.node]),
isNested,
isSuggested: Boolean(metadata.isSuggested),
outputNodesCount: 1,
sourceNodes: [source.node],
targetNodeType: metadata.targetTypeName
});
});
} catch (error) {
stopMeasure(measureId);
analytics.errored(error, [source.node], metadata.targetTypeName);
}
return tr;
};