@atlaskit/editor-plugin-card
Version:
Card plugin for @atlaskit/editor-core
64 lines (63 loc) • 2.42 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';
const lookupPixel = 10;
const getClosestInlineCardPos = (state, editorView, direction) => {
var _editorView$posAtCoor;
const {
selection
} = state;
const {
parent
} = selection.$from;
const inlineCardType = state.schema.nodes.inlineCard;
if (!flatten(parent, false).some(({
node
}) => node.type === inlineCardType)) {
return null;
}
const coord = editorView.coordsAtPos(selection.$anchor.pos);
const 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) {
const newNode = state.doc.nodeAt(nearPos);
if (newNode) {
if (newNode.type !== inlineCardType || findChildren(parent, node => node === newNode, false).length === 0 || newNode === selection.node) {
return null;
}
return nearPos;
}
}
return null;
};
const selectAboveBelowInlineCard = direction => {
return (state, dispatch, editorView) => {
if (!editorView || !dispatch) {
return false;
}
const 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) {
const list = {};
const 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);
}