react-hotkeys-hook 4.1.0-0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/parseHotkeys.d.ts +2 -0
- package/dist/react-hotkeys-hook.cjs.development.js +74 -106
- package/dist/react-hotkeys-hook.cjs.development.js.map +1 -1
- package/dist/react-hotkeys-hook.cjs.production.min.js +1 -1
- package/dist/react-hotkeys-hook.cjs.production.min.js.map +1 -1
- package/dist/react-hotkeys-hook.esm.js +74 -106
- package/dist/react-hotkeys-hook.esm.js.map +1 -1
- package/dist/validators.d.ts +1 -1
- package/package.json +1 -1
- package/src/isHotkeyPressed.ts +40 -46
- package/src/parseHotkeys.ts +29 -15
- package/src/useHotkeys.ts +6 -11
- package/src/validators.ts +4 -3
package/dist/parseHotkeys.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import { Hotkey, Keys } from './types';
|
|
2
|
+
export declare function mapKey(key: string): string;
|
|
3
|
+
export declare function isHotkeyModifier(key: string): boolean;
|
|
2
4
|
export declare function parseKeysHookInput(keys: Keys, splitKey?: string): string[];
|
|
3
5
|
export declare function parseHotkey(hotkey: string, combinationKey?: string): Hotkey;
|
|
@@ -17,56 +17,32 @@ function _extends() {
|
|
|
17
17
|
};
|
|
18
18
|
return _extends.apply(this, arguments);
|
|
19
19
|
}
|
|
20
|
-
function _unsupportedIterableToArray(o, minLen) {
|
|
21
|
-
if (!o) return;
|
|
22
|
-
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
23
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
24
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
25
|
-
if (n === "Map" || n === "Set") return Array.from(o);
|
|
26
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
27
|
-
}
|
|
28
|
-
function _arrayLikeToArray(arr, len) {
|
|
29
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
30
|
-
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
31
|
-
return arr2;
|
|
32
|
-
}
|
|
33
|
-
function _createForOfIteratorHelperLoose(o, allowArrayLike) {
|
|
34
|
-
var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
|
|
35
|
-
if (it) return (it = it.call(o)).next.bind(it);
|
|
36
|
-
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
|
|
37
|
-
if (it) o = it;
|
|
38
|
-
var i = 0;
|
|
39
|
-
return function () {
|
|
40
|
-
if (i >= o.length) return {
|
|
41
|
-
done: true
|
|
42
|
-
};
|
|
43
|
-
return {
|
|
44
|
-
done: false,
|
|
45
|
-
value: o[i++]
|
|
46
|
-
};
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
50
|
-
}
|
|
51
20
|
|
|
52
21
|
var reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod'];
|
|
53
22
|
var mappedKeys = {
|
|
54
23
|
esc: 'escape',
|
|
55
24
|
"return": 'enter',
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
'
|
|
61
|
-
'
|
|
62
|
-
'
|
|
63
|
-
'
|
|
64
|
-
'
|
|
65
|
-
'
|
|
66
|
-
'
|
|
67
|
-
'
|
|
68
|
-
'
|
|
25
|
+
'.': 'period',
|
|
26
|
+
',': 'comma',
|
|
27
|
+
'-': 'slash',
|
|
28
|
+
' ': 'space',
|
|
29
|
+
'#': 'backslash',
|
|
30
|
+
'+': 'bracketright',
|
|
31
|
+
'ShiftLeft': 'shift',
|
|
32
|
+
'ShiftRight': 'shift',
|
|
33
|
+
'AltLeft': 'alt',
|
|
34
|
+
'AltRight': 'alt',
|
|
35
|
+
'MetaLeft': 'meta',
|
|
36
|
+
'MetaRight': 'meta',
|
|
37
|
+
'ControlLeft': 'ctrl',
|
|
38
|
+
'ControlRight': 'ctrl'
|
|
69
39
|
};
|
|
40
|
+
function mapKey(key) {
|
|
41
|
+
return (mappedKeys[key] || key).trim().toLowerCase().replace('key', '').replace('digit', '').replace('numpad', '').replace('arrow', '');
|
|
42
|
+
}
|
|
43
|
+
function isHotkeyModifier(key) {
|
|
44
|
+
return reservedModifierKeywords.includes(key);
|
|
45
|
+
}
|
|
70
46
|
function parseKeysHookInput(keys, splitKey) {
|
|
71
47
|
if (splitKey === void 0) {
|
|
72
48
|
splitKey = ',';
|
|
@@ -81,9 +57,7 @@ function parseHotkey(hotkey, combinationKey) {
|
|
|
81
57
|
combinationKey = '+';
|
|
82
58
|
}
|
|
83
59
|
var keys = hotkey.toLocaleLowerCase().split(combinationKey).map(function (k) {
|
|
84
|
-
return k
|
|
85
|
-
}).map(function (k) {
|
|
86
|
-
return mappedKeys[k] || k;
|
|
60
|
+
return mapKey(k);
|
|
87
61
|
});
|
|
88
62
|
var modifiers = {
|
|
89
63
|
alt: keys.includes('alt'),
|
|
@@ -99,15 +73,6 @@ function parseHotkey(hotkey, combinationKey) {
|
|
|
99
73
|
});
|
|
100
74
|
}
|
|
101
75
|
|
|
102
|
-
function deepEqual(x, y) {
|
|
103
|
-
//@ts-ignore
|
|
104
|
-
return x && y && typeof x === 'object' && typeof y === 'object'
|
|
105
|
-
//@ts-ignore
|
|
106
|
-
? Object.keys(x).length === Object.keys(y).length && Object.keys(x).reduce(function (isEqual, key) {
|
|
107
|
-
return isEqual && deepEqual(x[key], y[key]);
|
|
108
|
-
}, true) : x === y;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
76
|
var currentlyPressedKeys = /*#__PURE__*/new Set();
|
|
112
77
|
function isHotkeyPressed(key, splitKey) {
|
|
113
78
|
if (splitKey === void 0) {
|
|
@@ -115,52 +80,52 @@ function isHotkeyPressed(key, splitKey) {
|
|
|
115
80
|
}
|
|
116
81
|
var hotkeyArray = Array.isArray(key) ? key : key.split(splitKey);
|
|
117
82
|
return hotkeyArray.every(function (hotkey) {
|
|
118
|
-
|
|
119
|
-
for (var _iterator = _createForOfIteratorHelperLoose(currentlyPressedKeys), _step; !(_step = _iterator()).done;) {
|
|
120
|
-
var pressedHotkey = _step.value;
|
|
121
|
-
if (deepEqual(parsedHotkey, pressedHotkey)) {
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
83
|
+
return currentlyPressedKeys.has(hotkey.trim().toLowerCase());
|
|
125
84
|
});
|
|
126
85
|
}
|
|
127
86
|
function pushToCurrentlyPressedKeys(key) {
|
|
128
87
|
var hotkeyArray = Array.isArray(key) ? key : [key];
|
|
88
|
+
/*
|
|
89
|
+
Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.
|
|
90
|
+
https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser
|
|
91
|
+
Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.
|
|
92
|
+
*/
|
|
93
|
+
if (currentlyPressedKeys.has('meta')) {
|
|
94
|
+
currentlyPressedKeys.forEach(function (key) {
|
|
95
|
+
return !isHotkeyModifier(key) && currentlyPressedKeys["delete"](key);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
129
98
|
hotkeyArray.forEach(function (hotkey) {
|
|
130
|
-
return currentlyPressedKeys.add(
|
|
99
|
+
return currentlyPressedKeys.add(hotkey.toLowerCase());
|
|
131
100
|
});
|
|
132
101
|
}
|
|
133
102
|
function removeFromCurrentlyPressedKeys(key) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
103
|
+
/*
|
|
104
|
+
Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.
|
|
105
|
+
https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser
|
|
106
|
+
Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.
|
|
107
|
+
*/
|
|
108
|
+
if (key === 'meta') {
|
|
109
|
+
currentlyPressedKeys.clear();
|
|
110
|
+
} else {
|
|
111
|
+
currentlyPressedKeys["delete"](key);
|
|
112
|
+
}
|
|
144
113
|
}
|
|
145
114
|
(function () {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
removeFromCurrentlyPressedKeys(e.key);
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
}
|
|
115
|
+
document.addEventListener('keydown', function (e) {
|
|
116
|
+
if (e.key === undefined) {
|
|
117
|
+
// Synthetic event (e.g., Chrome autofill). Ignore.
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
pushToCurrentlyPressedKeys(mapKey(e.code));
|
|
121
|
+
});
|
|
122
|
+
document.addEventListener('keyup', function (e) {
|
|
123
|
+
if (e.key === undefined) {
|
|
124
|
+
// Synthetic event (e.g., Chrome autofill). Ignore.
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
removeFromCurrentlyPressedKeys(mapKey(e.code));
|
|
128
|
+
});
|
|
164
129
|
})();
|
|
165
130
|
|
|
166
131
|
function maybePreventDefault(e, hotkey, preventDefault) {
|
|
@@ -202,7 +167,7 @@ function isScopeActive(activeScopes, scopes) {
|
|
|
202
167
|
return scopes.includes(scope);
|
|
203
168
|
}) || activeScopes.includes('*');
|
|
204
169
|
}
|
|
205
|
-
var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, hotkey
|
|
170
|
+
var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, hotkey) {
|
|
206
171
|
var alt = hotkey.alt,
|
|
207
172
|
meta = hotkey.meta,
|
|
208
173
|
mod = hotkey.mod,
|
|
@@ -214,7 +179,7 @@ var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, ho
|
|
|
214
179
|
var shiftKey = isHotkeyPressed('shift');
|
|
215
180
|
var metaKey = isHotkeyPressed('meta');
|
|
216
181
|
var ctrlKey = isHotkeyPressed('ctrl');
|
|
217
|
-
var keyCode = code
|
|
182
|
+
var keyCode = mapKey(code);
|
|
218
183
|
var pressedKey = pressedKeyUppercase.toLowerCase();
|
|
219
184
|
if (altKey !== alt && pressedKey !== 'alt') {
|
|
220
185
|
return false;
|
|
@@ -238,9 +203,7 @@ var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, ho
|
|
|
238
203
|
return true;
|
|
239
204
|
} else if (keys) {
|
|
240
205
|
// Check if all keys are present in pressedDownKeys set
|
|
241
|
-
return keys
|
|
242
|
-
return pressedDownKeys.has(key);
|
|
243
|
-
});
|
|
206
|
+
return isHotkeyPressed(keys);
|
|
244
207
|
} else if (!keys) {
|
|
245
208
|
// If the key is not set, we only listen for modifiers, that check went alright, so we return true
|
|
246
209
|
return true;
|
|
@@ -266,6 +229,15 @@ function BoundHotkeysProxyProviderProvider(_ref) {
|
|
|
266
229
|
});
|
|
267
230
|
}
|
|
268
231
|
|
|
232
|
+
function deepEqual(x, y) {
|
|
233
|
+
//@ts-ignore
|
|
234
|
+
return x && y && typeof x === 'object' && typeof y === 'object'
|
|
235
|
+
//@ts-ignore
|
|
236
|
+
? Object.keys(x).length === Object.keys(y).length && Object.keys(x).reduce(function (isEqual, key) {
|
|
237
|
+
return isEqual && deepEqual(x[key], y[key]);
|
|
238
|
+
}, true) : x === y;
|
|
239
|
+
}
|
|
240
|
+
|
|
269
241
|
var HotkeysContext = /*#__PURE__*/react.createContext({
|
|
270
242
|
hotkeys: [],
|
|
271
243
|
enabledScopes: [],
|
|
@@ -369,9 +341,9 @@ var stopPropagation = function stopPropagation(e) {
|
|
|
369
341
|
e.stopImmediatePropagation();
|
|
370
342
|
};
|
|
371
343
|
var useSafeLayoutEffect = typeof window !== 'undefined' ? react.useLayoutEffect : react.useEffect;
|
|
372
|
-
var pressedDownKeys = /*#__PURE__*/new Set();
|
|
373
344
|
function useHotkeys(keys, callback, options, dependencies) {
|
|
374
345
|
var ref = react.useRef(null);
|
|
346
|
+
var hasTriggeredRef = react.useRef(false);
|
|
375
347
|
var _options = !(options instanceof Array) ? options : !(dependencies instanceof Array) ? dependencies : undefined;
|
|
376
348
|
var _deps = options instanceof Array ? options : dependencies instanceof Array ? dependencies : [];
|
|
377
349
|
var cb = react.useCallback(callback, [].concat(_deps));
|
|
@@ -400,12 +372,14 @@ function useHotkeys(keys, callback, options, dependencies) {
|
|
|
400
372
|
parseKeysHookInput(keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
|
|
401
373
|
var _hotkey$keys;
|
|
402
374
|
var hotkey = parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey);
|
|
403
|
-
if (isHotkeyMatchingKeyboardEvent(e, hotkey
|
|
375
|
+
if ((isHotkeyMatchingKeyboardEvent(e, hotkey) || (_hotkey$keys = hotkey.keys) != null && _hotkey$keys.includes('*')) && !hasTriggeredRef.current) {
|
|
376
|
+
hasTriggeredRef.current = true;
|
|
404
377
|
maybePreventDefault(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.preventDefault);
|
|
405
378
|
if (!isHotkeyEnabled(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.enabled)) {
|
|
406
379
|
stopPropagation(e);
|
|
407
380
|
return;
|
|
408
381
|
}
|
|
382
|
+
// Execute the user callback for that hotkey
|
|
409
383
|
cb(e, hotkey);
|
|
410
384
|
}
|
|
411
385
|
});
|
|
@@ -415,7 +389,6 @@ function useHotkeys(keys, callback, options, dependencies) {
|
|
|
415
389
|
// Synthetic event (e.g., Chrome autofill). Ignore.
|
|
416
390
|
return;
|
|
417
391
|
}
|
|
418
|
-
pressedDownKeys.add(event.key.toLowerCase());
|
|
419
392
|
if ((memoisedOptions == null ? void 0 : memoisedOptions.keydown) === undefined && (memoisedOptions == null ? void 0 : memoisedOptions.keyup) !== true || memoisedOptions != null && memoisedOptions.keydown) {
|
|
420
393
|
listener(event);
|
|
421
394
|
}
|
|
@@ -425,12 +398,7 @@ function useHotkeys(keys, callback, options, dependencies) {
|
|
|
425
398
|
// Synthetic event (e.g., Chrome autofill). Ignore.
|
|
426
399
|
return;
|
|
427
400
|
}
|
|
428
|
-
|
|
429
|
-
pressedDownKeys["delete"](event.key.toLowerCase());
|
|
430
|
-
} else {
|
|
431
|
-
// On macOS pressing down the meta key prevents triggering the keyup event for any other key https://stackoverflow.com/a/57153300/735226.
|
|
432
|
-
pressedDownKeys.clear();
|
|
433
|
-
}
|
|
401
|
+
hasTriggeredRef.current = false;
|
|
434
402
|
if (memoisedOptions != null && memoisedOptions.keyup) {
|
|
435
403
|
listener(event);
|
|
436
404
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-hotkeys-hook.cjs.development.js","sources":["../src/parseHotkeys.ts","../src/deepEqual.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n left: 'arrowleft',\n up: 'arrowup',\n right: 'arrowright',\n down: 'arrowdown',\n '1': 'digit1',\n '2': 'digit2',\n '3': 'digit3',\n '4': 'digit4',\n '5': 'digit5',\n '6': 'digit6',\n '7': 'digit7',\n '8': 'digit8',\n '9': 'digit9',\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey: string = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map(k => k.trim())\n .map(k => mappedKeys[k] || k)\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return (x && y && typeof x === 'object' && typeof y === 'object')\n //@ts-ignore\n ? (Object.keys(x).length === Object.keys(y).length) && Object.keys(x).reduce(function(isEqual, key) {\n return isEqual && deepEqual(x[key], y[key])\n }, true)\n : (x === y)\n}\n","import { Hotkey } from './types'\nimport { parseHotkey } from './parseHotkeys'\nimport deepEqual from './deepEqual'\n\nconst currentlyPressedKeys: Set<Hotkey> = new Set<Hotkey>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey: string = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (deepEqual(parsedHotkey, pressedHotkey)) {\n return true\n }\n }\n })\n}\n\nfunction pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(parseHotkey(hotkey)))\n}\n\nfunction removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach((hotkey) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (deepEqual(parsedHotkey, pressedHotkey)) {\n currentlyPressedKeys.delete(pressedHotkey)\n }\n }\n })\n}\n\n(() => {\n if (typeof window !== 'undefined') {\n window.addEventListener('DOMContentLoaded', () => {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(e.key)\n })\n\n document.addEventListener('keyup', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(e.key)\n })\n })\n }\n})()\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(tag => tag.toLowerCase() === targetTagName.toLowerCase()))\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, pressedDownKeys: Set<string>): boolean => {\n const { alt, meta, mod, shift, keys } = hotkey\n const { key: pressedKeyUppercase, code } = e\n\n const altKey = isHotkeyPressed('alt')\n const shiftKey = isHotkeyPressed('shift')\n const metaKey = isHotkeyPressed('meta')\n const ctrlKey = isHotkeyPressed('ctrl')\n\n const keyCode = code.toLowerCase().replace('key', '')\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (altKey !== alt && pressedKey !== 'alt') {\n return false\n }\n\n if (shiftKey !== shift && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {\n return false\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return keys.every(key => pressedDownKeys.has(key))\n }\n else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void,\n removeHotkey: (hotkey: Hotkey) => void,\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return <BoundHotkeysProxyProvider.Provider value={{addHotkey, removeHotkey}}>{children}</BoundHotkeysProxyProvider.Provider>\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({initiallyActiveScopes = ['*'], children}: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*'])\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([]);\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter(h => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider value={{enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope}}>\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nconst pressedDownKeys = new Set<string>()\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray,\n) {\n const ref = useRef<RefType<T>>(null)\n\n const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined\n const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []\n\n const cb = useCallback(callback, [..._deps])\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {\n stopPropagation(e)\n\n return\n }\n\n if (((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable)) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, pressedDownKeys) || hotkey.keys?.includes('*')) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n cb(e, hotkey)\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pressedDownKeys.add(event.key.toLowerCase())\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n if (event.key.toLowerCase() !== 'meta') {\n pressedDownKeys.delete(event.key.toLowerCase())\n } else {\n // On macOS pressing down the meta key prevents triggering the keyup event for any other key https://stackoverflow.com/a/57153300/735226.\n pressedDownKeys.clear()\n }\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || document).addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n\n return () => {\n // @ts-ignore\n (ref.current || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || document).removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n }\n }, [keys, cb, memoisedOptions, enabledScopes])\n\n return ref\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","left","up","right","down","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","trim","modifiers","alt","includes","shift","meta","mod","singleCharKeys","filter","deepEqual","x","y","Object","length","reduce","isEqual","key","currentlyPressedKeys","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","parsedHotkey","pressedHotkey","pushToCurrentlyPressedKeys","forEach","add","removeFromCurrentlyPressedKeys","window","addEventListener","document","e","undefined","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","toLowerCase","isScopeActive","activeScopes","scopes","console","warn","scope","isHotkeyMatchingKeyboardEvent","pressedDownKeys","pressedKeyUppercase","code","altKey","shiftKey","metaKey","ctrlKey","keyCode","replace","pressedKey","has","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","prev","from","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","_options","_deps","cb","memoisedOptions","proxy","listener","enableOnFormTags","activeElement","contains","isContentEditable","enableOnContentEditable","handleKeyDown","event","keydown","keyup","handleKeyUp","clear","removeEventListener"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-hotkeys-hook.cjs.development.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '#': 'backslash',\n '+': 'bracketright',\n 'ShiftLeft': 'shift',\n 'ShiftRight': 'shift',\n 'AltLeft': 'alt',\n 'AltRight': 'alt',\n 'MetaLeft': 'meta',\n 'MetaRight': 'meta',\n 'ControlLeft': 'ctrl',\n 'ControlRight': 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace('key', '')\n .replace('digit', '')\n .replace('numpad', '')\n .replace('arrow', '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey: string = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map(k => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey: string = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nfunction pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach(key => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key))\n }\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nfunction removeFromCurrentlyPressedKeys(key: string): void {\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n currentlyPressedKeys.delete(key)\n }\n}\n\n(() => {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(e.code))\n })\n\n document.addEventListener('keyup', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(e.code))\n })\n})()\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(tag => tag.toLowerCase() === targetTagName.toLowerCase()))\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey): boolean => {\n const { alt, meta, mod, shift, keys } = hotkey\n const { key: pressedKeyUppercase, code } = e\n\n const altKey = isHotkeyPressed('alt')\n const shiftKey = isHotkeyPressed('shift')\n const metaKey = isHotkeyPressed('meta')\n const ctrlKey = isHotkeyPressed('ctrl')\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (altKey !== alt && pressedKey !== 'alt') {\n return false\n }\n\n if (shiftKey !== shift && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {\n return false\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n }\n else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void,\n removeHotkey: (hotkey: Hotkey) => void,\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return <BoundHotkeysProxyProvider.Provider value={{addHotkey, removeHotkey}}>{children}</BoundHotkeysProxyProvider.Provider>\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return (x && y && typeof x === 'object' && typeof y === 'object')\n //@ts-ignore\n ? (Object.keys(x).length === Object.keys(y).length) && Object.keys(x).reduce(function(isEqual, key) {\n return isEqual && deepEqual(x[key], y[key])\n }, true)\n : (x === y)\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({initiallyActiveScopes = ['*'], children}: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*'])\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([]);\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter(h => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider value={{enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope}}>\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray,\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined\n const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []\n\n const cb = useCallback(callback, [..._deps])\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {\n stopPropagation(e)\n\n return\n }\n\n if (((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable)) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if ((isHotkeyMatchingKeyboardEvent(e, hotkey) || hotkey.keys?.includes('*')) && !hasTriggeredRef.current) {\n hasTriggeredRef.current = true\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cb(e, hotkey)\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || document).addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n\n return () => {\n // @ts-ignore\n (ref.current || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || document).removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n }\n }, [keys, cb, memoisedOptions, enabledScopes])\n\n return ref\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","modifiers","alt","shift","meta","mod","singleCharKeys","filter","currentlyPressedKeys","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","pushToCurrentlyPressedKeys","forEach","add","removeFromCurrentlyPressedKeys","clear","document","addEventListener","e","undefined","code","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","pressedKeyUppercase","altKey","shiftKey","metaKey","ctrlKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","prev","from","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_deps","cb","memoisedOptions","proxy","listener","enableOnFormTags","activeElement","contains","isContentEditable","enableOnContentEditable","handleKeyDown","event","keydown","keyup","handleKeyUp","removeEventListener"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react"),t=require("react/jsx-runtime");function n(){return(n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}
|
|
1
|
+
"use strict";var e=require("react"),t=require("react/jsx-runtime");function n(){return(n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}var r=["shift","alt","meta","mod"],o={esc:"escape",return:"enter",".":"period",",":"comma","-":"slash"," ":"space","#":"backslash","+":"bracketright",ShiftLeft:"shift",ShiftRight:"shift",AltLeft:"alt",AltRight:"alt",MetaLeft:"meta",MetaRight:"meta",ControlLeft:"ctrl",ControlRight:"ctrl"};function i(e){return(o[e]||e).trim().toLowerCase().replace("key","").replace("digit","").replace("numpad","").replace("arrow","")}function u(e,t){return void 0===t&&(t=","),"string"==typeof e?e.split(t):e}function c(e,t){void 0===t&&(t="+");var o=e.toLocaleLowerCase().split(t).map((function(e){return i(e)}));return n({},{alt:o.includes("alt"),shift:o.includes("shift"),meta:o.includes("meta"),mod:o.includes("mod")},{keys:o.filter((function(e){return!r.includes(e)}))})}var a=new Set;function l(e,t){return void 0===t&&(t=","),(Array.isArray(e)?e:e.split(t)).every((function(e){return a.has(e.trim().toLowerCase())}))}function s(e,t){var n=e.target;void 0===t&&(t=!1);var r=n&&n.tagName;return t instanceof Array?Boolean(r&&t&&t.some((function(e){return e.toLowerCase()===r.toLowerCase()}))):Boolean(r&&t&&!0===t)}document.addEventListener("keydown",(function(e){var t,n;void 0!==e.key&&(t=i(e.code),n=Array.isArray(t)?t:[t],a.has("meta")&&a.forEach((function(e){return!function(e){return r.includes(e)}(e)&&a.delete(e)})),n.forEach((function(e){return a.add(e.toLowerCase())})))})),document.addEventListener("keyup",(function(e){var t;void 0!==e.key&&("meta"===(t=i(e.code))?a.clear():a.delete(t))}));var f=e.createContext(void 0);function d(e){return t.jsx(f.Provider,{value:{addHotkey:e.addHotkey,removeHotkey:e.removeHotkey},children:e.children})}function v(e,t){return e&&t&&"object"==typeof e&&"object"==typeof t?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce((function(n,r){return n&&v(e[r],t[r])}),!0):e===t}var y=e.createContext({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),p=function(){return e.useContext(y)},m=function(e){e.stopPropagation(),e.preventDefault(),e.stopImmediatePropagation()},h="undefined"!=typeof window?e.useLayoutEffect:e.useEffect;exports.HotkeysProvider=function(n){var r=n.initiallyActiveScopes,o=void 0===r?["*"]:r,i=n.children,u=e.useState((null==o?void 0:o.length)>0?o:["*"]),c=u[0],a=u[1],l=e.useState([]),s=l[0],f=l[1],p=e.useCallback((function(e){a((function(t){return t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),m=e.useCallback((function(e){a((function(t){return 0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e}))}))}),[]),h=e.useCallback((function(e){a((function(t){return t.includes(e)?0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e})):t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),k=e.useCallback((function(e){f((function(t){return[].concat(t,[e])}))}),[]),b=e.useCallback((function(e){f((function(t){return t.filter((function(t){return!v(t,e)}))}))}),[]);return t.jsx(y.Provider,{value:{enabledScopes:c,hotkeys:s,enableScope:p,disableScope:m,toggleScope:h},children:t.jsx(d,{addHotkey:k,removeHotkey:b,children:i})})},exports.isHotkeyPressed=l,exports.useHotkeys=function(t,n,r,o){var a=e.useRef(null),d=e.useRef(!1),y=r instanceof Array?o instanceof Array?void 0:o:r,k=e.useCallback(n,[].concat(r instanceof Array?r:o instanceof Array?o:[])),b=function(t){var n=e.useRef(void 0);return v(n.current,t)||(n.current=t),n.current}(y),g=p().enabledScopes,w=e.useContext(f);return h((function(){if(!1!==(null==b?void 0:b.enabled)&&(n=null==b?void 0:b.scopes,0===(e=g).length&&n?(console.warn('A hotkey has the "scopes" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'),1):!n||e.some((function(e){return n.includes(e)}))||e.includes("*"))){var e,n,r=function(e){var n;s(e,["input","textarea","select"])&&!s(e,null==b?void 0:b.enableOnFormTags)||(null===a.current||document.activeElement===a.current||a.current.contains(document.activeElement)?(null==(n=e.target)||!n.isContentEditable||null!=b&&b.enableOnContentEditable)&&u(t,null==b?void 0:b.splitKey).forEach((function(t){var n,r=c(t,null==b?void 0:b.combinationKey);if((function(e,t){var n=t.alt,r=t.meta,o=t.mod,u=t.shift,c=t.keys,a=e.key,s=e.code,f=l("alt"),d=l("shift"),v=l("meta"),y=l("ctrl"),p=i(s),m=a.toLowerCase();if(f!==n&&"alt"!==m)return!1;if(d!==u&&"shift"!==m)return!1;if(o){if(!v&&!y)return!1}else if(v!==r&&y!==r&&"meta"!==p&&"ctrl"!==p)return!1;return!(!c||1!==c.length||!c.includes(m)&&!c.includes(p))||(c?l(c):!c)}(e,r)||null!=(n=r.keys)&&n.includes("*"))&&!d.current){if(d.current=!0,function(e,t,n){("function"==typeof n&&n(e,t)||!0===n)&&e.preventDefault()}(e,r,null==b?void 0:b.preventDefault),!function(e,t,n){return"function"==typeof n?n(e,t):!0===n||void 0===n}(e,r,null==b?void 0:b.enabled))return void m(e);k(e,r)}})):m(e))},o=function(e){void 0!==e.key&&(void 0===(null==b?void 0:b.keydown)&&!0!==(null==b?void 0:b.keyup)||null!=b&&b.keydown)&&r(e)},f=function(e){void 0!==e.key&&(d.current=!1,null!=b&&b.keyup&&r(e))};return(a.current||document).addEventListener("keyup",f),(a.current||document).addEventListener("keydown",o),w&&u(t,null==b?void 0:b.splitKey).forEach((function(e){return w.addHotkey(c(e,null==b?void 0:b.combinationKey))})),function(){(a.current||document).removeEventListener("keyup",f),(a.current||document).removeEventListener("keydown",o),w&&u(t,null==b?void 0:b.splitKey).forEach((function(e){return w.removeHotkey(c(e,null==b?void 0:b.combinationKey))}))}}}),[t,k,b,g]),a},exports.useHotkeysContext=p;
|
|
2
2
|
//# sourceMappingURL=react-hotkeys-hook.cjs.production.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-hotkeys-hook.cjs.production.min.js","sources":["../src/parseHotkeys.ts","../src/deepEqual.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/HotkeysProvider.tsx","../src/useHotkeys.ts","../src/useDeepEqualMemo.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n left: 'arrowleft',\n up: 'arrowup',\n right: 'arrowright',\n down: 'arrowdown',\n '1': 'digit1',\n '2': 'digit2',\n '3': 'digit3',\n '4': 'digit4',\n '5': 'digit5',\n '6': 'digit6',\n '7': 'digit7',\n '8': 'digit8',\n '9': 'digit9',\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey: string = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map(k => k.trim())\n .map(k => mappedKeys[k] || k)\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return (x && y && typeof x === 'object' && typeof y === 'object')\n //@ts-ignore\n ? (Object.keys(x).length === Object.keys(y).length) && Object.keys(x).reduce(function(isEqual, key) {\n return isEqual && deepEqual(x[key], y[key])\n }, true)\n : (x === y)\n}\n","import { Hotkey } from './types'\nimport { parseHotkey } from './parseHotkeys'\nimport deepEqual from './deepEqual'\n\nconst currentlyPressedKeys: Set<Hotkey> = new Set<Hotkey>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey: string = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (deepEqual(parsedHotkey, pressedHotkey)) {\n return true\n }\n }\n })\n}\n\nfunction pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(parseHotkey(hotkey)))\n}\n\nfunction removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach((hotkey) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (deepEqual(parsedHotkey, pressedHotkey)) {\n currentlyPressedKeys.delete(pressedHotkey)\n }\n }\n })\n}\n\n(() => {\n if (typeof window !== 'undefined') {\n window.addEventListener('DOMContentLoaded', () => {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(e.key)\n })\n\n document.addEventListener('keyup', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(e.key)\n })\n })\n }\n})()\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(tag => tag.toLowerCase() === targetTagName.toLowerCase()))\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, pressedDownKeys: Set<string>): boolean => {\n const { alt, meta, mod, shift, keys } = hotkey\n const { key: pressedKeyUppercase, code } = e\n\n const altKey = isHotkeyPressed('alt')\n const shiftKey = isHotkeyPressed('shift')\n const metaKey = isHotkeyPressed('meta')\n const ctrlKey = isHotkeyPressed('ctrl')\n\n const keyCode = code.toLowerCase().replace('key', '')\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (altKey !== alt && pressedKey !== 'alt') {\n return false\n }\n\n if (shiftKey !== shift && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {\n return false\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return keys.every(key => pressedDownKeys.has(key))\n }\n else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void,\n removeHotkey: (hotkey: Hotkey) => void,\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return <BoundHotkeysProxyProvider.Provider value={{addHotkey, removeHotkey}}>{children}</BoundHotkeysProxyProvider.Provider>\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({initiallyActiveScopes = ['*'], children}: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*'])\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([]);\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter(h => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider value={{enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope}}>\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nconst pressedDownKeys = new Set<string>()\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray,\n) {\n const ref = useRef<RefType<T>>(null)\n\n const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined\n const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []\n\n const cb = useCallback(callback, [..._deps])\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {\n stopPropagation(e)\n\n return\n }\n\n if (((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable)) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, pressedDownKeys) || hotkey.keys?.includes('*')) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n cb(e, hotkey)\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pressedDownKeys.add(event.key.toLowerCase())\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n if (event.key.toLowerCase() !== 'meta') {\n pressedDownKeys.delete(event.key.toLowerCase())\n } else {\n // On macOS pressing down the meta key prevents triggering the keyup event for any other key https://stackoverflow.com/a/57153300/735226.\n pressedDownKeys.clear()\n }\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || document).addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n\n return () => {\n // @ts-ignore\n (ref.current || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || document).removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n }\n }, [keys, cb, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","return","left","up","right","down","1","2","3","4","5","6","7","8","9","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","trim","alt","includes","shift","meta","mod","filter","deepEqual","x","y","Object","length","reduce","isEqual","key","currentlyPressedKeys","Set","isHotkeyPressed","Array","isArray","every","parsedHotkey","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","toLowerCase","window","addEventListener","document","e","undefined","forEach","add","pressedHotkey","BoundHotkeysProxyProvider","createContext","BoundHotkeysProxyProviderProvider","_jsx","Provider","value","addHotkey","removeHotkey","children","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","useContext","stopPropagation","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","pressedDownKeys","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","scope","prev","from","s","addBoundHotkey","removeBoundHotkey","h","callback","options","dependencies","ref","useRef","_options","cb","memoisedOptions","current","useDeepEqualMemo","proxy","enabled","scopes","activeScopes","console","warn","listener","enableOnFormTags","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","pressedKeyUppercase","code","altKey","shiftKey","metaKey","ctrlKey","keyCode","replace","pressedKey","has","isHotkeyMatchingKeyboardEvent","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","clear","removeEventListener"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-hotkeys-hook.cjs.production.min.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useHotkeys.ts","../src/useDeepEqualMemo.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '#': 'backslash',\n '+': 'bracketright',\n 'ShiftLeft': 'shift',\n 'ShiftRight': 'shift',\n 'AltLeft': 'alt',\n 'AltRight': 'alt',\n 'MetaLeft': 'meta',\n 'MetaRight': 'meta',\n 'ControlLeft': 'ctrl',\n 'ControlRight': 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace('key', '')\n .replace('digit', '')\n .replace('numpad', '')\n .replace('arrow', '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey: string = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map(k => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey: string = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nfunction pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach(key => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key))\n }\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nfunction removeFromCurrentlyPressedKeys(key: string): void {\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n currentlyPressedKeys.delete(key)\n }\n}\n\n(() => {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(e.code))\n })\n\n document.addEventListener('keyup', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(e.code))\n })\n})()\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(tag => tag.toLowerCase() === targetTagName.toLowerCase()))\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey): boolean => {\n const { alt, meta, mod, shift, keys } = hotkey\n const { key: pressedKeyUppercase, code } = e\n\n const altKey = isHotkeyPressed('alt')\n const shiftKey = isHotkeyPressed('shift')\n const metaKey = isHotkeyPressed('meta')\n const ctrlKey = isHotkeyPressed('ctrl')\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (altKey !== alt && pressedKey !== 'alt') {\n return false\n }\n\n if (shiftKey !== shift && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {\n return false\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n }\n else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void,\n removeHotkey: (hotkey: Hotkey) => void,\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return <BoundHotkeysProxyProvider.Provider value={{addHotkey, removeHotkey}}>{children}</BoundHotkeysProxyProvider.Provider>\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return (x && y && typeof x === 'object' && typeof y === 'object')\n //@ts-ignore\n ? (Object.keys(x).length === Object.keys(y).length) && Object.keys(x).reduce(function(isEqual, key) {\n return isEqual && deepEqual(x[key], y[key])\n }, true)\n : (x === y)\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({initiallyActiveScopes = ['*'], children}: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*'])\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([]);\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter(h => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider value={{enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope}}>\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray,\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined\n const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []\n\n const cb = useCallback(callback, [..._deps])\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {\n stopPropagation(e)\n\n return\n }\n\n if (((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable)) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if ((isHotkeyMatchingKeyboardEvent(e, hotkey) || hotkey.keys?.includes('*')) && !hasTriggeredRef.current) {\n hasTriggeredRef.current = true\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cb(e, hotkey)\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || document).addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n\n return () => {\n // @ts-ignore\n (ref.current || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || document).removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n }\n }, [keys, cb, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","return",".",",","-"," ","#","+","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","alt","includes","shift","meta","mod","filter","currentlyPressedKeys","Set","isHotkeyPressed","Array","isArray","every","has","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","document","addEventListener","e","hotkeyArray","undefined","code","forEach","isHotkeyModifier","add","clear","BoundHotkeysProxyProvider","createContext","BoundHotkeysProxyProviderProvider","_jsx","Provider","value","addHotkey","removeHotkey","children","deepEqual","x","y","Object","length","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","useContext","stopPropagation","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","scope","prev","from","s","addBoundHotkey","removeBoundHotkey","h","callback","options","dependencies","ref","useRef","hasTriggeredRef","_options","cb","memoisedOptions","current","useDeepEqualMemo","proxy","enabled","scopes","activeScopes","console","warn","listener","enableOnFormTags","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","pressedKeyUppercase","altKey","shiftKey","metaKey","ctrlKey","keyCode","pressedKey","isHotkeyMatchingKeyboardEvent","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","removeEventListener"],"mappings":"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"}
|