@atlaskit/editor-plugin-card
Version:
Card plugin for @atlaskit/editor-core
63 lines (62 loc) • 2.54 kB
JavaScript
import { getBrowserInfo } from '@atlaskit/editor-common/browser';
import { bindKeymapWithCommand, moveDown, moveUp } from '@atlaskit/editor-common/keymaps';
import { keymap } from '@atlaskit/editor-prosemirror/keymap';
import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
import { findChildren, flatten } from '@atlaskit/editor-prosemirror/utils';
var lookupPixel = 10;
var getClosestInlineCardPos = function getClosestInlineCardPos(state, editorView, direction) {
var _editorView$posAtCoor;
var selection = state.selection;
var parent = selection.$from.parent;
var inlineCardType = state.schema.nodes.inlineCard;
if (!flatten(parent, false).some(function (_ref) {
var node = _ref.node;
return node.type === inlineCardType;
})) {
return null;
}
var coord = editorView.coordsAtPos(selection.$anchor.pos);
var nearPos = (_editorView$posAtCoor = editorView.posAtCoords({
left: coord.left,
top: direction === 'up' ? coord.top - lookupPixel : coord.bottom + lookupPixel
})) === null || _editorView$posAtCoor === void 0 ? void 0 : _editorView$posAtCoor.inside;
if (typeof nearPos === 'number' && nearPos > -1) {
var newNode = state.doc.nodeAt(nearPos);
if (newNode) {
if (newNode.type !== inlineCardType || findChildren(parent, function (node) {
return node === newNode;
}, false).length === 0 || newNode === selection.node) {
return null;
}
return nearPos;
}
}
return null;
};
var selectAboveBelowInlineCard = function selectAboveBelowInlineCard(direction) {
return function (state, dispatch, editorView) {
if (!editorView || !dispatch) {
return false;
}
var pos = getClosestInlineCardPos(state, editorView, direction);
if (pos) {
dispatch(state.tr.setSelection(new NodeSelection(state.doc.resolve(pos))));
return true;
}
return false;
};
};
export function cardKeymap(featureFlags) {
var list = {};
var browser = getBrowserInfo();
// https://bugs.chromium.org/p/chromium/issues/detail?id=1227468 introduced since Chrome 91
if (browser.chrome && browser.chrome_version > 90) {
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
bindKeymapWithCommand(moveUp.common, selectAboveBelowInlineCard('up'), list);
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
bindKeymapWithCommand(moveDown.common, selectAboveBelowInlineCard('down'), list);
}
return keymap(list);
}