UNPKG

@atlaskit/editor-plugin-card

Version:

Card plugin for @atlaskit/editor-core

64 lines (63 loc) 2.42 kB
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); }