@nextcloud/vue
Version:
Nextcloud vue components
1 lines • 3.88 kB
Source Map (JSON)
{"version":3,"file":"useHotKey.cjs","sources":["../../src/composables/useHotKey/index.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { onKeyStroke } from '@vueuse/core'\n\nconst disableKeyboardShortcuts = window.OCP?.Accessibility?.disableKeyboardShortcuts?.()\nconst isMac = /mac|ipad|iphone|darwin/i.test(navigator.userAgent)\n\n/**\n * Check if event target (active element) is editable (allows input from keyboard) or NcModal is open\n * If true, a hot key should not trigger the callback\n * TODO discuss if we should abort on another interactive elements (button, a, e.t.c)\n *\n * @param {KeyboardEvent} event keyboard event\n * @return {boolean} whether it should prevent callback\n */\nfunction shouldIgnoreEvent(event) {\n\tif (event.target instanceof HTMLInputElement\n\t\t|| event.target instanceof HTMLTextAreaElement\n\t\t|| event.target instanceof HTMLSelectElement\n\t\t|| event.target?.isContentEditable) {\n\t\treturn true\n\t}\n\t/** Abort if any modal/dialog opened */\n\treturn document.getElementsByClassName('modal-mask').length !== 0\n}\n\nconst eventHandler = (callback, options) => (event) => {\n\tconst ctrlKeyPressed = isMac ? event.metaKey : event.ctrlKey\n\tif (ctrlKeyPressed !== Boolean(options.ctrl)) {\n\t\t// Ctrl is required and not pressed, or the opposite\n\t\treturn\n\t} else if (!!options.alt !== event.altKey) {\n\t\t// Alt is required and not pressed, or the opposite\n\t\treturn\n\t} else if (!!options.shift !== event.shiftKey) {\n\t\t// Shift is required and not pressed, or the opposite\n\t\treturn\n\t} else if (shouldIgnoreEvent(event)) {\n\t\t// Keyboard shortcuts are disabled, because active element assumes input\n\t\treturn\n\t}\n\n\tif (options.prevent) {\n\t\tevent.preventDefault()\n\t}\n\tif (options.stop) {\n\t\tevent.stopPropagation()\n\t}\n\tcallback(event)\n}\n\n/**\n * @param {string} key - keyboard key or keys to listen to\n * @param {Function} callback - callback function\n * @param {object} options - composable options\n * @see docs/composables/usekeystroke.md\n */\nexport function useHotKey(key, callback = () => {}, options = {}) {\n\tif (disableKeyboardShortcuts) {\n\t\t// Keyboard shortcuts are disabled\n\t\treturn () => {}\n\t}\n\n\tconst stopKeyDown = onKeyStroke(key, eventHandler(callback, options), {\n\t\teventName: 'keydown',\n\t\tdedupe: true,\n\t\tpassive: !options.prevent,\n\t})\n\n\tconst stopKeyUp = options.push\n\t\t? onKeyStroke(key, eventHandler(callback, options), {\n\t\t\teventName: 'keyup',\n\t\t\tpassive: !options.prevent,\n\t\t})\n\t\t: () => {}\n\n\treturn () => {\n\t\tstopKeyDown()\n\t\tstopKeyUp()\n\t}\n}\n"],"names":["_a","onKeyStroke"],"mappings":";;;;AAMA,MAAM,4BAA2B,wBAAO,QAAP,mBAAY,kBAAZ,mBAA2B,6BAA3B;AACjC,MAAM,QAAQ,0BAA0B,KAAK,UAAU,SAAS;AAUhE,SAAS,kBAAkB,OAAO;;AACjC,MAAI,MAAM,kBAAkB,oBACxB,MAAM,kBAAkB,uBACxB,MAAM,kBAAkB,uBACxBA,MAAA,MAAM,WAAN,gBAAAA,IAAc,oBAAmB;AACpC,WAAO;AAAA,EACP;AAED,SAAO,SAAS,uBAAuB,YAAY,EAAE,WAAW;AACjE;AAEA,MAAM,eAAe,CAAC,UAAU,YAAY,CAAC,UAAU;AACtD,QAAM,iBAAiB,QAAQ,MAAM,UAAU,MAAM;AACrD,MAAI,mBAAmB,QAAQ,QAAQ,IAAI,GAAG;AAE7C;AAAA,EACA,WAAU,CAAC,CAAC,QAAQ,QAAQ,MAAM,QAAQ;AAE1C;AAAA,EACA,WAAU,CAAC,CAAC,QAAQ,UAAU,MAAM,UAAU;AAE9C;AAAA,EACF,WAAY,kBAAkB,KAAK,GAAG;AAEpC;AAAA,EACA;AAED,MAAI,QAAQ,SAAS;AACpB,UAAM,eAAgB;AAAA,EACtB;AACD,MAAI,QAAQ,MAAM;AACjB,UAAM,gBAAiB;AAAA,EACvB;AACD,WAAS,KAAK;AACf;AAQO,SAAS,UAAU,KAAK,WAAW,MAAM;AAAA,GAAI,UAAU,CAAA,GAAI;AACjE,MAAI,0BAA0B;AAE7B,WAAO,MAAM;AAAA,IAAE;AAAA,EACf;AAED,QAAM,cAAcC,KAAAA,YAAY,KAAK,aAAa,UAAU,OAAO,GAAG;AAAA,IACrE,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS,CAAC,QAAQ;AAAA,EACpB,CAAE;AAED,QAAM,YAAY,QAAQ,OACvBA,KAAAA,YAAY,KAAK,aAAa,UAAU,OAAO,GAAG;AAAA,IACnD,WAAW;AAAA,IACX,SAAS,CAAC,QAAQ;AAAA,EACrB,CAAG,IACC,MAAM;AAAA,EAAE;AAEX,SAAO,MAAM;AACZ,gBAAa;AACb,cAAW;AAAA,EACX;AACF;;"}