All files shortcuts.ts

97.56% Statements 40/41
90.32% Branches 28/31
100% Functions 1/1
97.56% Lines 40/41

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67          16x           16x 16x   16x 6x 6x 2x     2x   4x 2x 2x 1x   1x   6x 10x 2x 2x 2x 2x 8x 7x 7x 7x 7x   2x 2x 1x   2x   1x 1x   2x 2x 1x   2x   1x 1x   1x 1x   7x 7x      
import React from 'react';
import { stopPropagation } from './utils';
import { SelectionText } from './SelectionText';
 
export default function shortcuts(e: React.KeyboardEvent<HTMLTextAreaElement>, indentWidth: number = 2) {
  const api = new SelectionText(e.target as HTMLTextAreaElement);
  /**
   * Support of shortcuts for React v16
   * https://github.com/uiwjs/react-textarea-code-editor/issues/128
   * https://blog.saeloun.com/2021/04/23/react-keyboard-event-code.html
   */
  const code = (e.code || e.nativeEvent.code).toLocaleLowerCase();
  const indent = ' '.repeat(indentWidth);
 
  if (code === 'tab') {
    stopPropagation(e);
    if (api.start === api.end) {
      Iif (e.shiftKey) {
        api.lineStarRemove(indent);
      } else {
        api.insertText(indent).position(api.start + indentWidth, api.end + indentWidth);
      }
    } else if (api.getSelectedValue().indexOf('\n') > -1 && e.shiftKey) {
      api.lineStarRemove(indent);
    } else if (api.getSelectedValue().indexOf('\n') > -1) {
      api.lineStarInstert(indent);
    } else {
      api.insertText(indent).position(api.start + indentWidth, api.end);
    }
    api.notifyChange();
  } else if (code === 'enter') {
    stopPropagation(e);
    const indent = `\n${api.getIndentText()}`;
    api.insertText(indent).position(api.start + indent.length, api.start + indent.length);
    api.notifyChange();
  } else if (code && /^(quote|backquote|bracketleft|digit9|comma)$/.test(code) && api.getSelectedValue()) {
    stopPropagation(e);
    const val = api.getSelectedValue();
    let txt = '';
    switch (code) {
      case 'quote':
        txt = `'${val}'`;
        if (e.shiftKey) {
          txt = `"${val}"`;
        }
        break;
      case 'backquote':
        txt = `\`${val}\``;
        break;
      case 'bracketleft':
        txt = `[${val}]`;
        if (e.shiftKey) {
          txt = `{${val}}`;
        }
        break;
      case 'digit9':
        txt = `(${val})`;
        break;
      case 'comma':
        txt = `<${val}>`;
        break;
    }
    api.insertText(txt);
    api.notifyChange();
  }
}