UNPKG

@atlaskit/editor-plugin-block-menu

Version:

BlockMenu plugin for @atlaskit/editor-core

54 lines • 2.71 kB
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; };