trilium/src/public/javascripts/services/keyboard_actions.js

80 lines
1.7 KiB
JavaScript
Raw Normal View History

import server from "./server.js";
import utils from "./utils.js";
class KeyboardAction {
constructor(params) {
/** @property {string} */
this.actionName = params.actionName;
/** @property {string[]} */
this.defaultShortcuts = params.defaultShortcuts;
/** @property {string[]} */
this.effectiveShortcuts = params.effectiveShortcuts;
/** @property {string} */
this.description = params.description;
}
addShortcut(shortcut) {
this.effectiveShortcuts.push(shortcut);
}
/**
* @param {string|string[]} shortcuts
*/
replaceShortcuts(shortcuts) {
this.effectiveShortcuts = Array.isArray(shortcuts) ? shortcuts : [shortcuts];
}
}
const keyboardActionRepo = {};
const keyboardActionsLoaded = server.get('keyboard-actions').then(actions => {
for (const action of actions) {
keyboardActionRepo[action.actionName] = new KeyboardAction(action);
}
});
function setActionHandler(actionName, handler) {
keyboardActionsLoaded.then(() => {
const action = keyboardActionRepo[actionName];
if (!action) {
throw new Error(`Cannot find keyboard action '${actionName}'`);
}
action.handler = handler;
for (const shortcut of action.effectiveShortcuts) {
if (shortcut) {
utils.bindGlobalShortcut(shortcut, handler);
}
}
});
}
async function triggerAction(actionName) {
2019-11-22 05:24:07 +08:00
const action = getAction(actionName);
if (!action.handler) {
throw new Error(`Action ${actionName} has no handler`);
}
await action.handler();
}
async function getAction(actionName) {
await keyboardActionsLoaded;
const action = keyboardActionRepo[actionName];
if (!action) {
throw new Error(`Cannot find action ${actionName}`);
}
2019-11-22 05:24:07 +08:00
return action;
}
export default {
setActionHandler,
2019-11-22 05:24:07 +08:00
triggerAction,
getAction
};