editor.js/src/components/utils/shortcuts.ts
Peter Savchenko 3272efc3f7
chore(linting): eslint updated, code linted (#2174)
* update eslint + autofix

* a bunch of eslint fixes

* some spelling & eslint fixes

* fix some eslint errors and spells

* Update __module.ts

* a bunch of eslint fixes in tests

* Update cypress.yml

* Update cypress.yml

* fix cypress docker image name

* fixes for tests

* more tests fixed

* rm rule ignore

* rm another ignored rule

* Update .eslintrc
2022-11-25 21:56:50 +04:00

107 lines
2.3 KiB
TypeScript

import Shortcut from '@codexteam/shortcuts';
/**
* Contains keyboard and mouse events binded on each Block by Block Manager
*/
/**
* ShortcutData interface
* Each shortcut must have name and handler
* `name` is a shortcut, like 'CMD+K', 'CMD+B' etc
* `handler` is a callback
*
* @interface ShortcutData
*/
export interface ShortcutData {
/**
* Shortcut name
* Ex. CMD+I, CMD+B ....
*/
name: string;
/**
* Shortcut handler
*/
handler(event): void;
/**
* Element handler should be added for
*/
on: HTMLElement;
}
/**
* @class Shortcut
* @classdesc Allows to register new shortcut
*
* Internal Shortcuts Module
*/
class Shortcuts {
/**
* All registered shortcuts
*
* @type {Map<Element, Shortcut[]>}
*/
private registeredShortcuts: Map<Element, Shortcut[]> = new Map();
/**
* Register shortcut
*
* @param shortcut - shortcut options
*/
public add(shortcut: ShortcutData): void {
const foundShortcut = this.findShortcut(shortcut.on, shortcut.name);
if (foundShortcut) {
throw Error(
`Shortcut ${shortcut.name} is already registered for ${shortcut.on}. Please remove it before add a new handler.`
);
}
const newShortcut = new Shortcut({
name: shortcut.name,
on: shortcut.on,
callback: shortcut.handler,
});
const shortcuts = this.registeredShortcuts.get(shortcut.on) || [];
this.registeredShortcuts.set(shortcut.on, [...shortcuts, newShortcut]);
}
/**
* Remove shortcut
*
* @param element - Element shortcut is set for
* @param name - shortcut name
*/
public remove(element: Element, name: string): void {
const shortcut = this.findShortcut(element, name);
if (!shortcut) {
return;
}
shortcut.remove();
const shortcuts = this.registeredShortcuts.get(element);
this.registeredShortcuts.set(element, shortcuts.filter(el => el !== shortcut));
}
/**
* Get Shortcut instance if exist
*
* @param element - Element shorcut is set for
* @param shortcut - shortcut name
* @returns {number} index - shortcut index if exist
*/
private findShortcut(element: Element, shortcut: string): Shortcut | void {
const shortcuts = this.registeredShortcuts.get(element) || [];
return shortcuts.find(({ name }) => name === shortcut);
}
}
export default new Shortcuts();