@atlaskit/editor-plugin-breakout
Version:
Breakout plugin for @atlaskit/editor-core
69 lines (68 loc) • 3.42 kB
JavaScript
import { getBrowserInfo } from '@atlaskit/editor-common/browser';
import { getBreakoutResizableNodeTypes, getBreakoutResizableNodeTypesNew } from '@atlaskit/editor-common/utils';
import { NodeSelection, TextSelection } from '@atlaskit/editor-prosemirror/state';
import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
import { setBreakoutWidth } from '../editor-commands/set-breakout-width';
import { clampWidthToResizeBounds, getResizeContainerWidth } from './resize-width';
const KEYBOARD_RESIZE_STEP = 10;
const getKeyboardResizeWidth = (currentWidth, step, api) => {
const containerWidth = getResizeContainerWidth(api);
const resizeStartWidth = Math.min(currentWidth, containerWidth);
return clampWidthToResizeBounds(resizeStartWidth + step, containerWidth);
};
const getAncestorResizableNode = (view, breakoutResizableNodes) => {
const selection = view.state.selection;
if (selection instanceof NodeSelection) {
const selectedNode = selection.node;
if (breakoutResizableNodes.has(selectedNode.type)) {
return {
node: selectedNode,
pos: selection.$from.pos
};
}
} else if (selection instanceof TextSelection) {
let node = null;
let nodePos = null;
// only top level nodes are resizable
const resolvedPos = view.state.doc.resolve(selection.$from.pos);
const currentNode = resolvedPos.node(1);
if (breakoutResizableNodes.has(currentNode.type)) {
node = currentNode;
nodePos = resolvedPos.before(1);
return {
node: node,
pos: nodePos
};
}
}
return null;
};
export const handleKeyDown = api => (view, event) => {
const browser = getBrowserInfo();
const metaKey = browser.mac ? event.metaKey : event.ctrlKey;
const isBracketKey = event.code === 'BracketRight' || event.code === 'BracketLeft';
if (metaKey && event.altKey && isBracketKey) {
const breakoutResizableNodes = isExperimentEnabled('platform_editor_lovability_resize_extensions') ? getBreakoutResizableNodeTypesNew(view.state.schema) : getBreakoutResizableNodeTypes(view.state.schema, expValEquals('platform_editor_lovability_resize_dividers_panels', 'isEnabled', true));
const result = getAncestorResizableNode(view, breakoutResizableNodes);
if (result) {
const {
node,
pos
} = result;
const breakoutMark = node === null || node === void 0 ? void 0 : node.marks.find(mark => mark.type.name === 'breakout');
if (breakoutMark) {
const step = event.code === 'BracketRight' ? KEYBOARD_RESIZE_STEP : -KEYBOARD_RESIZE_STEP;
const newWidth = getKeyboardResizeWidth(breakoutMark.attrs.width, step, api);
if (newWidth !== breakoutMark.attrs.width) {
var _api$editorViewMode, _api$editorViewMode$s;
const isEditMode = (api === null || api === void 0 ? void 0 : (_api$editorViewMode = api.editorViewMode) === null || _api$editorViewMode === void 0 ? void 0 : (_api$editorViewMode$s = _api$editorViewMode.sharedState.currentState()) === null || _api$editorViewMode$s === void 0 ? void 0 : _api$editorViewMode$s.mode) === 'edit';
setBreakoutWidth(newWidth, breakoutMark.attrs.mode, pos, isEditMode)(view.state, view.dispatch);
view.focus();
}
return true;
}
}
}
return false;
};