suneditor
Version:
Vanilla JavaScript based WYSIWYG web editor
64 lines (58 loc) • 2.12 kB
JavaScript
import { dom } from '../../../helper';
import { A } from '../actions';
/**
* @typedef {import('../actions').Action[]} EventActions
* @typedef {import('../ports').EventReducerPorts} EventPorts
* @typedef {import('../reducers/keydown.reducer').KeydownReducerCtx} EventKeydownCtx
*/
/**
*/
/**
* @this {void}
* @description Arrow key down rule
* @param {EventActions} actions - Action list
* @param {EventPorts} ports - Ports for interacting with editor
* @param {EventKeydownCtx} ctx - Context object
*/
export function reduceArrowDown(actions, ports, ctx) {
const { component } = ports;
const { formatEl, range, selectionNode, keyCode } = ctx;
// next component
let cmponentInfo = null;
switch (keyCode) {
case 'ArrowUp' /** up key */:
if (component.is(formatEl.previousElementSibling)) {
cmponentInfo = component.get(formatEl.previousElementSibling);
}
break;
case 'ArrowLeft' /** left key */:
if (dom.check.isEdgePoint(selectionNode, range.startOffset, 'front')) {
const prevEl = selectionNode.previousElementSibling || dom.query.getPreviousDeepestNode(selectionNode);
if (prevEl) {
if (component.is(prevEl)) cmponentInfo = component.get(prevEl);
} else if (component.is(formatEl.previousElementSibling)) {
cmponentInfo = component.get(formatEl.previousElementSibling);
}
}
break;
case 'ArrowDown' /** down key */:
if (component.is(formatEl.nextElementSibling)) {
cmponentInfo = component.get(formatEl.nextElementSibling);
}
break;
case 'ArrowRight' /** right key */:
if (dom.check.isEdgePoint(selectionNode, range.endOffset, 'end')) {
const nextEl = selectionNode.nextElementSibling || dom.query.getNextDeepestNode(selectionNode);
if (nextEl) {
if (component.is(nextEl)) cmponentInfo = component.get(nextEl);
} else if (component.is(formatEl.nextElementSibling)) {
cmponentInfo = component.get(formatEl.nextElementSibling);
}
}
break;
}
if (cmponentInfo && !cmponentInfo.options?.isInputComponent) {
actions.push(A.prevent());
actions.push(A.selectComponentFallback(cmponentInfo));
}
}