matrix-react-sdk
Version:
SDK for matrix.org using React
115 lines (110 loc) • 15.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getKeyboardShortcutsForUI = exports.getKeyboardShortcuts = exports.getKeyboardShortcutValue = exports.getKeyboardShortcutDisplayName = void 0;
var _Keyboard = require("../Keyboard");
var _languageHandler = require("../languageHandler");
var _PlatformPeg = _interopRequireDefault(require("../PlatformPeg"));
var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore"));
var _KeyboardShortcuts = require("./KeyboardShortcuts");
/*
Copyright 2024 New Vector Ltd.
Copyright 2022 Šimon Brandner <simon.bra.ag@gmail.com>
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
/**
* This function gets the keyboard shortcuts that should be presented in the UI
* but they shouldn't be consumed by KeyBindingDefaults. That means that these
* have to be manually mirrored in KeyBindingDefaults.
*/
const getUIOnlyShortcuts = () => {
const ctrlEnterToSend = _SettingsStore.default.getValue("MessageComposerInput.ctrlEnterToSend");
const keyboardShortcuts = {
[_KeyboardShortcuts.KeyBindingAction.SendMessage]: {
default: {
key: _Keyboard.Key.ENTER,
ctrlOrCmdKey: ctrlEnterToSend
},
displayName: (0, _languageHandler._td)("composer|send_button_title")
},
[_KeyboardShortcuts.KeyBindingAction.NewLine]: {
default: {
key: _Keyboard.Key.ENTER,
shiftKey: !ctrlEnterToSend
},
displayName: (0, _languageHandler._td)("keyboard|composer_new_line")
},
[_KeyboardShortcuts.KeyBindingAction.CompleteAutocomplete]: {
default: {
key: _Keyboard.Key.ENTER
},
displayName: (0, _languageHandler._td)("action|complete")
},
[_KeyboardShortcuts.KeyBindingAction.ForceCompleteAutocomplete]: {
default: {
key: _Keyboard.Key.TAB
},
displayName: (0, _languageHandler._td)("keyboard|autocomplete_force")
},
[_KeyboardShortcuts.KeyBindingAction.SearchInRoom]: {
default: {
ctrlOrCmdKey: true,
key: _Keyboard.Key.F
},
displayName: (0, _languageHandler._td)("keyboard|search")
}
};
if (_PlatformPeg.default.get()?.overrideBrowserShortcuts()) {
// XXX: This keyboard shortcut isn't manually added to
// KeyBindingDefaults as it can't be easily handled by the
// KeyBindingManager
keyboardShortcuts[_KeyboardShortcuts.KeyBindingAction.SwitchToSpaceByNumber] = {
default: {
ctrlOrCmdKey: true,
key: _KeyboardShortcuts.DIGITS
},
displayName: (0, _languageHandler._td)("keyboard|switch_to_space")
};
}
return keyboardShortcuts;
};
/**
* This function gets keyboard shortcuts that can be consumed by the KeyBindingDefaults.
*/
const getKeyboardShortcuts = () => {
const overrideBrowserShortcuts = _PlatformPeg.default.get()?.overrideBrowserShortcuts();
return Object.keys(_KeyboardShortcuts.KEYBOARD_SHORTCUTS).filter(k => {
if (_KeyboardShortcuts.KEYBOARD_SHORTCUTS[k]?.controller?.settingDisabled) return false;
if (_KeyboardShortcuts.MAC_ONLY_SHORTCUTS.includes(k) && !_Keyboard.IS_MAC) return false;
if (_KeyboardShortcuts.DESKTOP_SHORTCUTS.includes(k) && !overrideBrowserShortcuts) return false;
return true;
}).reduce((o, key) => {
o[key] = _KeyboardShortcuts.KEYBOARD_SHORTCUTS[key];
return o;
}, {});
};
/**
* Gets keyboard shortcuts that should be presented to the user in the UI.
*/
exports.getKeyboardShortcuts = getKeyboardShortcuts;
const getKeyboardShortcutsForUI = () => {
const entries = [...Object.entries(getUIOnlyShortcuts()), ...Object.entries(getKeyboardShortcuts())];
return entries.reduce((acc, [key, value]) => {
acc[key] = value;
return acc;
}, {});
};
exports.getKeyboardShortcutsForUI = getKeyboardShortcutsForUI;
const getKeyboardShortcutValue = name => {
return getKeyboardShortcutsForUI()[name]?.default;
};
exports.getKeyboardShortcutValue = getKeyboardShortcutValue;
const getKeyboardShortcutDisplayName = name => {
const keyboardShortcutDisplayName = getKeyboardShortcutsForUI()[name]?.displayName;
return keyboardShortcutDisplayName && (0, _languageHandler._t)(keyboardShortcutDisplayName);
};
exports.getKeyboardShortcutDisplayName = getKeyboardShortcutDisplayName;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfS2V5Ym9hcmQiLCJyZXF1aXJlIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9QbGF0Zm9ybVBlZyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfU2V0dGluZ3NTdG9yZSIsIl9LZXlib2FyZFNob3J0Y3V0cyIsImdldFVJT25seVNob3J0Y3V0cyIsImN0cmxFbnRlclRvU2VuZCIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsImtleWJvYXJkU2hvcnRjdXRzIiwiS2V5QmluZGluZ0FjdGlvbiIsIlNlbmRNZXNzYWdlIiwiZGVmYXVsdCIsImtleSIsIktleSIsIkVOVEVSIiwiY3RybE9yQ21kS2V5IiwiZGlzcGxheU5hbWUiLCJfdGQiLCJOZXdMaW5lIiwic2hpZnRLZXkiLCJDb21wbGV0ZUF1dG9jb21wbGV0ZSIsIkZvcmNlQ29tcGxldGVBdXRvY29tcGxldGUiLCJUQUIiLCJTZWFyY2hJblJvb20iLCJGIiwiUGxhdGZvcm1QZWciLCJnZXQiLCJvdmVycmlkZUJyb3dzZXJTaG9ydGN1dHMiLCJTd2l0Y2hUb1NwYWNlQnlOdW1iZXIiLCJESUdJVFMiLCJnZXRLZXlib2FyZFNob3J0Y3V0cyIsIk9iamVjdCIsImtleXMiLCJLRVlCT0FSRF9TSE9SVENVVFMiLCJmaWx0ZXIiLCJrIiwiY29udHJvbGxlciIsInNldHRpbmdEaXNhYmxlZCIsIk1BQ19PTkxZX1NIT1JUQ1VUUyIsImluY2x1ZGVzIiwiSVNfTUFDIiwiREVTS1RPUF9TSE9SVENVVFMiLCJyZWR1Y2UiLCJvIiwiZXhwb3J0cyIsImdldEtleWJvYXJkU2hvcnRjdXRzRm9yVUkiLCJlbnRyaWVzIiwiYWNjIiwidmFsdWUiLCJnZXRLZXlib2FyZFNob3J0Y3V0VmFsdWUiLCJuYW1lIiwiZ2V0S2V5Ym9hcmRTaG9ydGN1dERpc3BsYXlOYW1lIiwia2V5Ym9hcmRTaG9ydGN1dERpc3BsYXlOYW1lIiwiX3QiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWNjZXNzaWJpbGl0eS9LZXlib2FyZFNob3J0Y3V0VXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgxaBpbW9uIEJyYW5kbmVyIDxzaW1vbi5icmEuYWdAZ21haWwuY29tPlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBLZXlDb21ibyB9IGZyb20gXCIuLi9LZXlCaW5kaW5nc01hbmFnZXJcIjtcbmltcG9ydCB7IElTX01BQywgS2V5IH0gZnJvbSBcIi4uL0tleWJvYXJkXCI7XG5pbXBvcnQgeyBfdCwgX3RkIH0gZnJvbSBcIi4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IFBsYXRmb3JtUGVnIGZyb20gXCIuLi9QbGF0Zm9ybVBlZ1wiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCB7XG4gICAgREVTS1RPUF9TSE9SVENVVFMsXG4gICAgRElHSVRTLFxuICAgIElLZXlib2FyZFNob3J0Y3V0cyxcbiAgICBLZXlCaW5kaW5nQWN0aW9uLFxuICAgIEtFWUJPQVJEX1NIT1JUQ1VUUyxcbiAgICBLZXlib2FyZFNob3J0Y3V0U2V0dGluZyxcbiAgICBNQUNfT05MWV9TSE9SVENVVFMsXG59IGZyb20gXCIuL0tleWJvYXJkU2hvcnRjdXRzXCI7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBrZXlib2FyZCBzaG9ydGN1dHMgdGhhdCBzaG91bGQgYmUgcHJlc2VudGVkIGluIHRoZSBVSVxuICogYnV0IHRoZXkgc2hvdWxkbid0IGJlIGNvbnN1bWVkIGJ5IEtleUJpbmRpbmdEZWZhdWx0cy4gVGhhdCBtZWFucyB0aGF0IHRoZXNlXG4gKiBoYXZlIHRvIGJlIG1hbnVhbGx5IG1pcnJvcmVkIGluIEtleUJpbmRpbmdEZWZhdWx0cy5cbiAqL1xuY29uc3QgZ2V0VUlPbmx5U2hvcnRjdXRzID0gKCk6IElLZXlib2FyZFNob3J0Y3V0cyA9PiB7XG4gICAgY29uc3QgY3RybEVudGVyVG9TZW5kID0gU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcIk1lc3NhZ2VDb21wb3NlcklucHV0LmN0cmxFbnRlclRvU2VuZFwiKTtcblxuICAgIGNvbnN0IGtleWJvYXJkU2hvcnRjdXRzOiBJS2V5Ym9hcmRTaG9ydGN1dHMgPSB7XG4gICAgICAgIFtLZXlCaW5kaW5nQWN0aW9uLlNlbmRNZXNzYWdlXToge1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkVOVEVSLFxuICAgICAgICAgICAgICAgIGN0cmxPckNtZEtleTogY3RybEVudGVyVG9TZW5kLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBfdGQoXCJjb21wb3NlcnxzZW5kX2J1dHRvbl90aXRsZVwiKSxcbiAgICAgICAgfSxcbiAgICAgICAgW0tleUJpbmRpbmdBY3Rpb24uTmV3TGluZV06IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5FTlRFUixcbiAgICAgICAgICAgICAgICBzaGlmdEtleTogIWN0cmxFbnRlclRvU2VuZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogX3RkKFwia2V5Ym9hcmR8Y29tcG9zZXJfbmV3X2xpbmVcIiksXG4gICAgICAgIH0sXG4gICAgICAgIFtLZXlCaW5kaW5nQWN0aW9uLkNvbXBsZXRlQXV0b2NvbXBsZXRlXToge1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkVOVEVSLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBfdGQoXCJhY3Rpb258Y29tcGxldGVcIiksXG4gICAgICAgIH0sXG4gICAgICAgIFtLZXlCaW5kaW5nQWN0aW9uLkZvcmNlQ29tcGxldGVBdXRvY29tcGxldGVdOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAga2V5OiBLZXkuVEFCLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBfdGQoXCJrZXlib2FyZHxhdXRvY29tcGxldGVfZm9yY2VcIiksXG4gICAgICAgIH0sXG4gICAgICAgIFtLZXlCaW5kaW5nQWN0aW9uLlNlYXJjaEluUm9vbV06IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBjdHJsT3JDbWRLZXk6IHRydWUsXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuRixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogX3RkKFwia2V5Ym9hcmR8c2VhcmNoXCIpLFxuICAgICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAoUGxhdGZvcm1QZWcuZ2V0KCk/Lm92ZXJyaWRlQnJvd3NlclNob3J0Y3V0cygpKSB7XG4gICAgICAgIC8vIFhYWDogVGhpcyBrZXlib2FyZCBzaG9ydGN1dCBpc24ndCBtYW51YWxseSBhZGRlZCB0b1xuICAgICAgICAvLyBLZXlCaW5kaW5nRGVmYXVsdHMgYXMgaXQgY2FuJ3QgYmUgZWFzaWx5IGhhbmRsZWQgYnkgdGhlXG4gICAgICAgIC8vIEtleUJpbmRpbmdNYW5hZ2VyXG4gICAgICAgIGtleWJvYXJkU2hvcnRjdXRzW0tleUJpbmRpbmdBY3Rpb24uU3dpdGNoVG9TcGFjZUJ5TnVtYmVyXSA9IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBjdHJsT3JDbWRLZXk6IHRydWUsXG4gICAgICAgICAgICAgICAga2V5OiBESUdJVFMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IF90ZChcImtleWJvYXJkfHN3aXRjaF90b19zcGFjZVwiKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5Ym9hcmRTaG9ydGN1dHM7XG59O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBrZXlib2FyZCBzaG9ydGN1dHMgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgdGhlIEtleUJpbmRpbmdEZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEtleWJvYXJkU2hvcnRjdXRzID0gKCk6IElLZXlib2FyZFNob3J0Y3V0cyA9PiB7XG4gICAgY29uc3Qgb3ZlcnJpZGVCcm93c2VyU2hvcnRjdXRzID0gUGxhdGZvcm1QZWcuZ2V0KCk/Lm92ZXJyaWRlQnJvd3NlclNob3J0Y3V0cygpO1xuXG4gICAgcmV0dXJuIChPYmplY3Qua2V5cyhLRVlCT0FSRF9TSE9SVENVVFMpIGFzIEtleUJpbmRpbmdBY3Rpb25bXSlcbiAgICAgICAgLmZpbHRlcigoaykgPT4ge1xuICAgICAgICAgICAgaWYgKEtFWUJPQVJEX1NIT1JUQ1VUU1trXT8uY29udHJvbGxlcj8uc2V0dGluZ0Rpc2FibGVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoTUFDX09OTFlfU0hPUlRDVVRTLmluY2x1ZGVzKGspICYmICFJU19NQUMpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChERVNLVE9QX1NIT1JUQ1VUUy5pbmNsdWRlcyhrKSAmJiAhb3ZlcnJpZGVCcm93c2VyU2hvcnRjdXRzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuICAgICAgICAucmVkdWNlKChvLCBrZXkpID0+IHtcbiAgICAgICAgICAgIG9ba2V5IGFzIEtleUJpbmRpbmdBY3Rpb25dID0gS0VZQk9BUkRfU0hPUlRDVVRTW2tleSBhcyBLZXlCaW5kaW5nQWN0aW9uXTtcbiAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICB9LCB7fSBhcyBJS2V5Ym9hcmRTaG9ydGN1dHMpO1xufTtcblxuLyoqXG4gKiBHZXRzIGtleWJvYXJkIHNob3J0Y3V0cyB0aGF0IHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIFVJLlxuICovXG5leHBvcnQgY29uc3QgZ2V0S2V5Ym9hcmRTaG9ydGN1dHNGb3JVSSA9ICgpOiBJS2V5Ym9hcmRTaG9ydGN1dHMgPT4ge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbLi4uT2JqZWN0LmVudHJpZXMoZ2V0VUlPbmx5U2hvcnRjdXRzKCkpLCAuLi5PYmplY3QuZW50cmllcyhnZXRLZXlib2FyZFNob3J0Y3V0cygpKV0gYXMgW1xuICAgICAgICBLZXlCaW5kaW5nQWN0aW9uLFxuICAgICAgICBLZXlib2FyZFNob3J0Y3V0U2V0dGluZyxcbiAgICBdW107XG5cbiAgICByZXR1cm4gZW50cmllcy5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgSUtleWJvYXJkU2hvcnRjdXRzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRLZXlib2FyZFNob3J0Y3V0VmFsdWUgPSAobmFtZTogS2V5QmluZGluZ0FjdGlvbik6IEtleUNvbWJvIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gZ2V0S2V5Ym9hcmRTaG9ydGN1dHNGb3JVSSgpW25hbWVdPy5kZWZhdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEtleWJvYXJkU2hvcnRjdXREaXNwbGF5TmFtZSA9IChuYW1lOiBLZXlCaW5kaW5nQWN0aW9uKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBrZXlib2FyZFNob3J0Y3V0RGlzcGxheU5hbWUgPSBnZXRLZXlib2FyZFNob3J0Y3V0c0ZvclVJKClbbmFtZV0/LmRpc3BsYXlOYW1lO1xuICAgIHJldHVybiBrZXlib2FyZFNob3J0Y3V0RGlzcGxheU5hbWUgJiYgX3Qoa2V5Ym9hcmRTaG9ydGN1dERpc3BsYXlOYW1lKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFTQSxJ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