react-hotkeys-hook 4.4.0 → 4.4.1
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/BoundHotkeysProxyProvider.d.ts +1 -1
- package/dist/HotkeysProvider.d.ts +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/isHotkeyPressed.d.ts +2 -1
- package/dist/react-hotkeys-hook.cjs.development.js +7 -3
- 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 +7 -3
- package/dist/react-hotkeys-hook.esm.js.map +1 -1
- package/dist/types.d.ts +4 -4
- package/dist/validators.d.ts +1 -1
- package/package.json +12 -12
- package/src/index.ts +11 -2
- package/src/isHotkeyPressed.ts +7 -2
- package/src/types.ts +4 -4
- package/src/useHotkeys.ts +2 -2
- package/src/validators.ts +6 -3
|
@@ -10,5 +10,5 @@ interface Props {
|
|
|
10
10
|
addHotkey: (hotkey: Hotkey) => void;
|
|
11
11
|
removeHotkey: (hotkey: Hotkey) => void;
|
|
12
12
|
}
|
|
13
|
-
export default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props): JSX.Element;
|
|
13
|
+
export default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props): import("react").JSX.Element;
|
|
14
14
|
export {};
|
|
@@ -12,5 +12,5 @@ interface Props {
|
|
|
12
12
|
initiallyActiveScopes?: string[];
|
|
13
13
|
children: ReactNode;
|
|
14
14
|
}
|
|
15
|
-
export declare const HotkeysProvider: ({ initiallyActiveScopes, children }: Props) => JSX.Element;
|
|
15
|
+
export declare const HotkeysProvider: ({ initiallyActiveScopes, children }: Props) => import("react").JSX.Element;
|
|
16
16
|
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import useHotkeys from './useHotkeys';
|
|
2
|
-
import type { Options } from './types';
|
|
2
|
+
import type { Options, Keys, HotkeyCallback } from './types';
|
|
3
3
|
import { HotkeysProvider, useHotkeysContext } from './HotkeysProvider';
|
|
4
4
|
import { isHotkeyPressed } from './isHotkeyPressed';
|
|
5
5
|
import useRecordHotkeys from './useRecordHotkeys';
|
|
6
|
-
export { useHotkeys, useRecordHotkeys, useHotkeysContext, isHotkeyPressed, HotkeysProvider, Options };
|
|
6
|
+
export { useHotkeys, useRecordHotkeys, useHotkeysContext, isHotkeyPressed, HotkeysProvider, Options, Keys, HotkeyCallback, };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export declare function
|
|
1
|
+
export declare function isReadonlyArray(value: unknown): value is readonly unknown[];
|
|
2
|
+
export declare function isHotkeyPressed(key: string | readonly string[], splitKey?: string): boolean;
|
|
2
3
|
export declare function pushToCurrentlyPressedKeys(key: string | string[]): void;
|
|
3
4
|
export declare function removeFromCurrentlyPressedKeys(key: string | string[]): void;
|
|
@@ -99,11 +99,15 @@ function parseHotkey(hotkey, combinationKey, description) {
|
|
|
99
99
|
}
|
|
100
100
|
})();
|
|
101
101
|
var currentlyPressedKeys = /*#__PURE__*/new Set();
|
|
102
|
+
// https://github.com/microsoft/TypeScript/issues/17002
|
|
103
|
+
function isReadonlyArray(value) {
|
|
104
|
+
return Array.isArray(value);
|
|
105
|
+
}
|
|
102
106
|
function isHotkeyPressed(key, splitKey) {
|
|
103
107
|
if (splitKey === void 0) {
|
|
104
108
|
splitKey = ',';
|
|
105
109
|
}
|
|
106
|
-
var hotkeyArray =
|
|
110
|
+
var hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey);
|
|
107
111
|
return hotkeyArray.every(function (hotkey) {
|
|
108
112
|
return currentlyPressedKeys.has(hotkey.trim().toLowerCase());
|
|
109
113
|
});
|
|
@@ -160,7 +164,7 @@ function isHotkeyEnabledOnTag(_ref, enabledOnTags) {
|
|
|
160
164
|
enabledOnTags = false;
|
|
161
165
|
}
|
|
162
166
|
var targetTagName = target && target.tagName;
|
|
163
|
-
if (enabledOnTags
|
|
167
|
+
if (isReadonlyArray(enabledOnTags)) {
|
|
164
168
|
return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(function (tag) {
|
|
165
169
|
return tag.toLowerCase() === targetTagName.toLowerCase();
|
|
166
170
|
}));
|
|
@@ -367,7 +371,7 @@ function useHotkeys(keys, callback, options, dependencies) {
|
|
|
367
371
|
var ref = react.useRef(null);
|
|
368
372
|
var hasTriggeredRef = react.useRef(false);
|
|
369
373
|
var _options = !(options instanceof Array) ? options : !(dependencies instanceof Array) ? dependencies : undefined;
|
|
370
|
-
var _keys = keys
|
|
374
|
+
var _keys = isReadonlyArray(keys) ? keys.join(_options == null ? void 0 : _options.splitKey) : keys;
|
|
371
375
|
var _deps = options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined;
|
|
372
376
|
var memoisedCB = react.useCallback(callback, _deps != null ? _deps : []);
|
|
373
377
|
var cbRef = react.useRef(memoisedCB);
|
|
@@ -1 +1 @@
|
|
|
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","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: '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|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+', description?: 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 ctrl: keys.includes('ctrl') || keys.includes('control'),\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 description,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\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.key), 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.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function 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.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(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 (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\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(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\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, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\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 } 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 (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.Provider>\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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), 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(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\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\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\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 { mapKey, 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'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\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)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = keys instanceof Array ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\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, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n if (memoisedOptions?.ignoreEventWhen?.(e)) {\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 (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\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, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\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 cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\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 pushToCurrentlyPressedKeys(mapKey(event.code))\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 removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n }\n }, [_keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","description","toLocaleLowerCase","map","k","modifiers","alt","ctrl","shift","meta","mod","singleCharKeys","filter","_extends","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","forEach","add","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","_ref","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","Provider","value","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","_ref$initiallyActiveS","_useState","useState","internalActiveScopes","setInternalActiveScopes","_useState2","boundHotkeys","setBoundHotkeys","useCallback","prev","from","concat","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","memoisedOptions","_useHotkeysContext","proxy","listener","isKeyUp","enableOnFormTags","ignoreEventWhen","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","_hotkey$keys","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"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","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: '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|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+', description?: 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 ctrl: keys.includes('ctrl') || keys.includes('control'),\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 description,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\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.key), 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.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\n// https://github.com/microsoft/TypeScript/issues/17002\nexport function isReadonlyArray(value: unknown): value is readonly unknown[] {\n return Array.isArray(value)\n}\n\nexport function isHotkeyPressed(key: string | readonly string[], splitKey = ','): boolean {\n const hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function 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.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(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 (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed, isReadonlyArray } 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(\n { target }: KeyboardEvent,\n enabledOnTags: readonly FormTags[] | boolean = false\n): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (isReadonlyArray(enabledOnTags)) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\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, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\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 } 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 (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.Provider>\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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), 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(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\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\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\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 { mapKey, 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'\nimport { isReadonlyArray, pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\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)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = isReadonlyArray(keys) ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\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, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n if (memoisedOptions?.ignoreEventWhen?.(e)) {\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 (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\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, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\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 cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\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 pushToCurrentlyPressedKeys(mapKey(event.code))\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 removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n }\n }, [_keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","description","toLocaleLowerCase","map","k","modifiers","alt","ctrl","shift","meta","mod","singleCharKeys","filter","_extends","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isReadonlyArray","value","Array","isArray","isHotkeyPressed","hotkeyArray","every","has","forEach","add","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","_ref","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","Provider","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","_ref$initiallyActiveS","_useState","useState","internalActiveScopes","setInternalActiveScopes","_useState2","boundHotkeys","setBoundHotkeys","useCallback","prev","from","concat","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","memoisedOptions","_useHotkeysContext","proxy","listener","isKeyUp","enableOnFormTags","ignoreEventWhen","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","_hotkey$keys","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"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 o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}var o=["shift","alt","meta","mod","ctrl"],r={esc:"escape",return:"enter",".":"period",",":"comma","-":"slash"," ":"space","`":"backquote","#":"backslash","+":"bracketright",ShiftLeft:"shift",ShiftRight:"shift",AltLeft:"alt",AltRight:"alt",MetaLeft:"meta",MetaRight:"meta",OSLeft:"meta",OSRight:"meta",ControlLeft:"ctrl",ControlRight:"ctrl"};function i(e){return(r[e]||e).trim().toLowerCase().replace(/key|digit|numpad|arrow/,"")}function u(e,t){return void 0===t&&(t=","),e.split(t)}function c(e,t,r){void 0===t&&(t="+");var u=e.toLocaleLowerCase().split(t).map((function(e){return i(e)}));return n({},{alt:u.includes("alt"),ctrl:u.includes("ctrl")||u.includes("control"),shift:u.includes("shift"),meta:u.includes("meta"),mod:u.includes("mod")},{keys:u.filter((function(e){return!o.includes(e)})),description:r})}"undefined"!=typeof document&&(document.addEventListener("keydown",(function(e){void 0!==e.key&&
|
|
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 o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}var o=["shift","alt","meta","mod","ctrl"],r={esc:"escape",return:"enter",".":"period",",":"comma","-":"slash"," ":"space","`":"backquote","#":"backslash","+":"bracketright",ShiftLeft:"shift",ShiftRight:"shift",AltLeft:"alt",AltRight:"alt",MetaLeft:"meta",MetaRight:"meta",OSLeft:"meta",OSRight:"meta",ControlLeft:"ctrl",ControlRight:"ctrl"};function i(e){return(r[e]||e).trim().toLowerCase().replace(/key|digit|numpad|arrow/,"")}function u(e,t){return void 0===t&&(t=","),e.split(t)}function c(e,t,r){void 0===t&&(t="+");var u=e.toLocaleLowerCase().split(t).map((function(e){return i(e)}));return n({},{alt:u.includes("alt"),ctrl:u.includes("ctrl")||u.includes("control"),shift:u.includes("shift"),meta:u.includes("meta"),mod:u.includes("mod")},{keys:u.filter((function(e){return!o.includes(e)})),description:r})}"undefined"!=typeof document&&(document.addEventListener("keydown",(function(e){void 0!==e.key&&d([i(e.key),i(e.code)])})),document.addEventListener("keyup",(function(e){void 0!==e.key&&f([i(e.key),i(e.code)])}))),"undefined"!=typeof window&&window.addEventListener("blur",(function(){a.clear()}));var a=new Set;function l(e){return Array.isArray(e)}function s(e,t){return void 0===t&&(t=","),(l(e)?e:e.split(t)).every((function(e){return a.has(e.trim().toLowerCase())}))}function d(e){var t=Array.isArray(e)?e:[e];a.has("meta")&&a.forEach((function(e){return!function(e){return o.includes(e)}(e)&&a.delete(e.toLowerCase())})),t.forEach((function(e){return a.add(e.toLowerCase())}))}function f(e){var t=Array.isArray(e)?e:[e];"meta"===e?a.clear():t.forEach((function(e){return a.delete(e.toLowerCase())}))}function v(e,t){var n=e.target;void 0===t&&(t=!1);var o=n&&n.tagName;return l(t)?Boolean(o&&t&&t.some((function(e){return e.toLowerCase()===o.toLowerCase()}))):Boolean(o&&t&&!0===t)}var y=e.createContext(void 0);function p(e){return t.jsx(y.Provider,{value:{addHotkey:e.addHotkey,removeHotkey:e.removeHotkey},children:e.children})}function k(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,o){return n&&k(e[o],t[o])}),!0):e===t}var m=e.createContext({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),h=function(){return e.useContext(m)},b=function(e){e.stopPropagation(),e.preventDefault(),e.stopImmediatePropagation()},w="undefined"!=typeof window?e.useLayoutEffect:e.useEffect;exports.HotkeysProvider=function(n){var o=n.initiallyActiveScopes,r=void 0===o?["*"]:o,i=n.children,u=e.useState((null==r?void 0:r.length)>0?r:["*"]),c=u[0],a=u[1],l=e.useState([]),s=l[0],d=l[1],f=e.useCallback((function(e){a((function(t){return t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),v=e.useCallback((function(e){a((function(t){return 0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e}))}))}),[]),y=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])))}))}),[]),h=e.useCallback((function(e){d((function(t){return[].concat(t,[e])}))}),[]),b=e.useCallback((function(e){d((function(t){return t.filter((function(t){return!k(t,e)}))}))}),[]);return t.jsx(m.Provider,{value:{enabledScopes:c,hotkeys:s,enableScope:f,disableScope:v,toggleScope:y},children:t.jsx(p,{addHotkey:h,removeHotkey:b,children:i})})},exports.isHotkeyPressed=s,exports.useHotkeys=function(t,n,o,r){var a=e.useRef(null),p=e.useRef(!1),m=o instanceof Array?r instanceof Array?void 0:r:o,g=l(t)?t.join(null==m?void 0:m.splitKey):t,C=o instanceof Array?o:r instanceof Array?r:void 0,L=e.useCallback(n,null!=C?C:[]),S=e.useRef(L);S.current=C?L:n;var E=function(t){var n=e.useRef(void 0);return k(n.current,t)||(n.current=t),n.current}(m),A=h().enabledScopes,x=e.useContext(y);return w((function(){if(!1!==(null==E?void 0:E.enabled)&&(t=null==E?void 0:E.scopes,0===(e=A).length&&t?(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):!t||e.some((function(e){return t.includes(e)}))||e.includes("*"))){var e,t,n=function(e,t){var n;void 0===t&&(t=!1),(!v(e,["input","textarea","select"])||v(e,null==E?void 0:E.enableOnFormTags))&&(null!=E&&null!=E.ignoreEventWhen&&E.ignoreEventWhen(e)||(null===a.current||document.activeElement===a.current||a.current.contains(document.activeElement)?(null==(n=e.target)||!n.isContentEditable||null!=E&&E.enableOnContentEditable)&&u(g,null==E?void 0:E.splitKey).forEach((function(n){var o,r=c(n,null==E?void 0:E.combinationKey);if(function(e,t,n){void 0===n&&(n=!1);var o=t.alt,r=t.meta,u=t.mod,c=t.shift,a=t.ctrl,l=t.keys,d=e.key,f=e.ctrlKey,v=e.metaKey,y=e.shiftKey,p=e.altKey,k=i(e.code),m=d.toLowerCase();if(!n){if(o===!p&&"alt"!==m)return!1;if(c===!y&&"shift"!==m)return!1;if(u){if(!v&&!f)return!1}else{if(r===!v&&"meta"!==m&&"os"!==m)return!1;if(a===!f&&"ctrl"!==m&&"control"!==m)return!1}}return!(!l||1!==l.length||!l.includes(m)&&!l.includes(k))||(l?s(l):!l)}(e,r,null==E?void 0:E.ignoreModifiers)||null!=(o=r.keys)&&o.includes("*")){if(t&&p.current)return;if(function(e,t,n){("function"==typeof n&&n(e,t)||!0===n)&&e.preventDefault()}(e,r,null==E?void 0:E.preventDefault),!function(e,t,n){return"function"==typeof n?n(e,t):!0===n||void 0===n}(e,r,null==E?void 0:E.enabled))return void b(e);S.current(e,r),t||(p.current=!0)}})):b(e)))},o=function(e){void 0!==e.key&&(d(i(e.code)),(void 0===(null==E?void 0:E.keydown)&&!0!==(null==E?void 0:E.keyup)||null!=E&&E.keydown)&&n(e))},r=function(e){void 0!==e.key&&(f(i(e.code)),p.current=!1,null!=E&&E.keyup&&n(e,!0))},l=a.current||(null==m?void 0:m.document)||document;return l.addEventListener("keyup",r),l.addEventListener("keydown",o),x&&u(g,null==E?void 0:E.splitKey).forEach((function(e){return x.addHotkey(c(e,null==E?void 0:E.combinationKey,null==E?void 0:E.description))})),function(){l.removeEventListener("keyup",r),l.removeEventListener("keydown",o),x&&u(g,null==E?void 0:E.splitKey).forEach((function(e){return x.removeHotkey(c(e,null==E?void 0:E.combinationKey,null==E?void 0:E.description))}))}}}),[g,E,A]),a},exports.useHotkeysContext=h,exports.useRecordHotkeys=function(){var t=e.useState(new Set),n=t[0],o=t[1],r=e.useState(!1),u=r[0],c=r[1],a=e.useCallback((function(e){void 0!==e.key&&(e.preventDefault(),e.stopPropagation(),o((function(t){var n=new Set(t);return n.add(i(e.code)),n})))}),[]),l=e.useCallback((function(){"undefined"!=typeof document&&(document.removeEventListener("keydown",a),c(!1))}),[a]);return[n,{start:e.useCallback((function(){o(new Set),"undefined"!=typeof document&&(l(),document.addEventListener("keydown",a),c(!0))}),[a,l]),stop:l,isRecording:u}]};
|
|
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/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useHotkeys.ts","../src/useDeepEqualMemo.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: '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|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+', description?: 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 ctrl: keys.includes('ctrl') || keys.includes('control'),\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 description,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\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.key), 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.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function 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.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(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 (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\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(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\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, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\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 } 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 (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.Provider>\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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), 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(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\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\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\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 { mapKey, 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'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\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)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = keys instanceof Array ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\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, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n if (memoisedOptions?.ignoreEventWhen?.(e)) {\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 (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\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, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\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 cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\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 pushToCurrentlyPressedKeys(mapKey(event.code))\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 removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n }\n }, [_keys, 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","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","return",".",",","-"," ","`","#","+","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","description","toLocaleLowerCase","map","k","_extends","alt","includes","ctrl","shift","meta","mod","filter","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isHotkeyPressed","Array","isArray","every","has","hotkeyArray","forEach","isHotkeyModifier","add","isHotkeyEnabledOnTag","_ref","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","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","useLayoutEffect","useEffect","initiallyActiveScopes","_ref$initiallyActiveS","_useState","useState","internalActiveScopes","setInternalActiveScopes","_useState2","boundHotkeys","setBoundHotkeys","useCallback","scope","prev","from","concat","s","addBoundHotkey","removeBoundHotkey","h","callback","options","dependencies","ref","useRef","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","current","memoisedOptions","useDeepEqualMemo","proxy","enabled","scopes","activeScopes","console","warn","listener","isKeyUp","enableOnFormTags","ignoreEventWhen","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","isHotkeyMatchingKeyboardEvent","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"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","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: '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|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+', description?: 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 ctrl: keys.includes('ctrl') || keys.includes('control'),\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 description,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\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.key), 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.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\n// https://github.com/microsoft/TypeScript/issues/17002\nexport function isReadonlyArray(value: unknown): value is readonly unknown[] {\n return Array.isArray(value)\n}\n\nexport function isHotkeyPressed(key: string | readonly string[], splitKey = ','): boolean {\n const hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function 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.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(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 (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed, isReadonlyArray } 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(\n { target }: KeyboardEvent,\n enabledOnTags: readonly FormTags[] | boolean = false\n): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (isReadonlyArray(enabledOnTags)) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\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, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\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 } 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 (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.Provider>\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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), 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(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\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\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\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 { mapKey, 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'\nimport { isReadonlyArray, pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\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)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = isReadonlyArray(keys) ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\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, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n if (memoisedOptions?.ignoreEventWhen?.(e)) {\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 (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\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, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\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 cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\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 pushToCurrentlyPressedKeys(mapKey(event.code))\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 removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n }\n }, [_keys, 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","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","return",".",",","-"," ","`","#","+","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","description","toLocaleLowerCase","map","k","_extends","alt","includes","ctrl","shift","meta","mod","filter","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isReadonlyArray","value","Array","isArray","isHotkeyPressed","every","has","hotkeyArray","forEach","isHotkeyModifier","add","isHotkeyEnabledOnTag","_ref","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","BoundHotkeysProxyProvider","createContext","BoundHotkeysProxyProviderProvider","_jsx","Provider","addHotkey","removeHotkey","children","deepEqual","x","y","Object","length","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","useContext","stopPropagation","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","initiallyActiveScopes","_ref$initiallyActiveS","_useState","useState","internalActiveScopes","setInternalActiveScopes","_useState2","boundHotkeys","setBoundHotkeys","useCallback","scope","prev","from","concat","s","addBoundHotkey","removeBoundHotkey","h","callback","options","dependencies","ref","useRef","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","current","memoisedOptions","useDeepEqualMemo","proxy","enabled","scopes","activeScopes","console","warn","listener","isKeyUp","enableOnFormTags","ignoreEventWhen","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","isHotkeyMatchingKeyboardEvent","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
|
|
@@ -97,11 +97,15 @@ function parseHotkey(hotkey, combinationKey, description) {
|
|
|
97
97
|
}
|
|
98
98
|
})();
|
|
99
99
|
var currentlyPressedKeys = /*#__PURE__*/new Set();
|
|
100
|
+
// https://github.com/microsoft/TypeScript/issues/17002
|
|
101
|
+
function isReadonlyArray(value) {
|
|
102
|
+
return Array.isArray(value);
|
|
103
|
+
}
|
|
100
104
|
function isHotkeyPressed(key, splitKey) {
|
|
101
105
|
if (splitKey === void 0) {
|
|
102
106
|
splitKey = ',';
|
|
103
107
|
}
|
|
104
|
-
var hotkeyArray =
|
|
108
|
+
var hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey);
|
|
105
109
|
return hotkeyArray.every(function (hotkey) {
|
|
106
110
|
return currentlyPressedKeys.has(hotkey.trim().toLowerCase());
|
|
107
111
|
});
|
|
@@ -158,7 +162,7 @@ function isHotkeyEnabledOnTag(_ref, enabledOnTags) {
|
|
|
158
162
|
enabledOnTags = false;
|
|
159
163
|
}
|
|
160
164
|
var targetTagName = target && target.tagName;
|
|
161
|
-
if (enabledOnTags
|
|
165
|
+
if (isReadonlyArray(enabledOnTags)) {
|
|
162
166
|
return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(function (tag) {
|
|
163
167
|
return tag.toLowerCase() === targetTagName.toLowerCase();
|
|
164
168
|
}));
|
|
@@ -365,7 +369,7 @@ function useHotkeys(keys, callback, options, dependencies) {
|
|
|
365
369
|
var ref = useRef(null);
|
|
366
370
|
var hasTriggeredRef = useRef(false);
|
|
367
371
|
var _options = !(options instanceof Array) ? options : !(dependencies instanceof Array) ? dependencies : undefined;
|
|
368
|
-
var _keys = keys
|
|
372
|
+
var _keys = isReadonlyArray(keys) ? keys.join(_options == null ? void 0 : _options.splitKey) : keys;
|
|
369
373
|
var _deps = options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined;
|
|
370
374
|
var memoisedCB = useCallback(callback, _deps != null ? _deps : []);
|
|
371
375
|
var cbRef = useRef(memoisedCB);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-hotkeys-hook.esm.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","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: '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|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+', description?: 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 ctrl: keys.includes('ctrl') || keys.includes('control'),\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 description,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\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.key), 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.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function 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.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(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 (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\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(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\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, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\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 } 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 (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.Provider>\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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), 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(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\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\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\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 { mapKey, 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'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\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)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = keys instanceof Array ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\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, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n if (memoisedOptions?.ignoreEventWhen?.(e)) {\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 (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\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, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\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 cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\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 pushToCurrentlyPressedKeys(mapKey(event.code))\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 removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n }\n }, [_keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","description","toLocaleLowerCase","map","k","modifiers","alt","ctrl","shift","meta","mod","singleCharKeys","filter","_extends","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","forEach","add","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","_ref","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","Provider","value","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","_ref$initiallyActiveS","_useState","useState","internalActiveScopes","setInternalActiveScopes","_useState2","boundHotkeys","setBoundHotkeys","useCallback","prev","from","concat","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","memoisedOptions","_useHotkeysContext","proxy","listener","isKeyUp","enableOnFormTags","ignoreEventWhen","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","_hotkey$keys","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-hotkeys-hook.esm.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","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: '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|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+', description?: 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 ctrl: keys.includes('ctrl') || keys.includes('control'),\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 description,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\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.key), 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.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\n// https://github.com/microsoft/TypeScript/issues/17002\nexport function isReadonlyArray(value: unknown): value is readonly unknown[] {\n return Array.isArray(value)\n}\n\nexport function isHotkeyPressed(key: string | readonly string[], splitKey = ','): boolean {\n const hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function 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.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(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 (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed, isReadonlyArray } 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(\n { target }: KeyboardEvent,\n enabledOnTags: readonly FormTags[] | boolean = false\n): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (isReadonlyArray(enabledOnTags)) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\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, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\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 } 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 (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.Provider>\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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), 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(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\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\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\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 { mapKey, 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'\nimport { isReadonlyArray, pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\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)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = isReadonlyArray(keys) ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\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, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n if (memoisedOptions?.ignoreEventWhen?.(e)) {\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 (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\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, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\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 cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\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 pushToCurrentlyPressedKeys(mapKey(event.code))\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 removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n }\n }, [_keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","description","toLocaleLowerCase","map","k","modifiers","alt","ctrl","shift","meta","mod","singleCharKeys","filter","_extends","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isReadonlyArray","value","Array","isArray","isHotkeyPressed","hotkeyArray","every","has","forEach","add","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","_ref","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","Provider","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","_ref$initiallyActiveS","_useState","useState","internalActiveScopes","setInternalActiveScopes","_useState2","boundHotkeys","setBoundHotkeys","useCallback","prev","from","concat","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","memoisedOptions","_useHotkeysContext","proxy","listener","isKeyUp","enableOnFormTags","ignoreEventWhen","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","_hotkey$keys","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { DependencyList } from 'react';
|
|
2
2
|
export declare type FormTags = 'input' | 'textarea' | 'select' | 'INPUT' | 'TEXTAREA' | 'SELECT';
|
|
3
|
-
export declare type Keys = string | string[];
|
|
4
|
-
export declare type Scopes = string | string[];
|
|
3
|
+
export declare type Keys = string | readonly string[];
|
|
4
|
+
export declare type Scopes = string | readonly string[];
|
|
5
5
|
export declare type RefType<T> = T | null;
|
|
6
6
|
export declare type KeyboardModifiers = {
|
|
7
7
|
alt?: boolean;
|
|
@@ -11,7 +11,7 @@ export declare type KeyboardModifiers = {
|
|
|
11
11
|
mod?: boolean;
|
|
12
12
|
};
|
|
13
13
|
export declare type Hotkey = KeyboardModifiers & {
|
|
14
|
-
keys?: string[];
|
|
14
|
+
keys?: readonly string[];
|
|
15
15
|
scopes?: Scopes;
|
|
16
16
|
description?: string;
|
|
17
17
|
};
|
|
@@ -20,7 +20,7 @@ export declare type HotkeyCallback = (keyboardEvent: KeyboardEvent, hotkeysEvent
|
|
|
20
20
|
export declare type Trigger = boolean | ((keyboardEvent: KeyboardEvent, hotkeysEvent: HotkeysEvent) => boolean);
|
|
21
21
|
export declare type Options = {
|
|
22
22
|
enabled?: Trigger;
|
|
23
|
-
enableOnFormTags?: FormTags[] | boolean;
|
|
23
|
+
enableOnFormTags?: readonly FormTags[] | boolean;
|
|
24
24
|
enableOnContentEditable?: boolean;
|
|
25
25
|
ignoreEventWhen?: (e: KeyboardEvent) => boolean;
|
|
26
26
|
combinationKey?: string;
|
package/dist/validators.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ import { FormTags, Hotkey, Scopes, Trigger } from './types';
|
|
|
2
2
|
export declare function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void;
|
|
3
3
|
export declare function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean;
|
|
4
4
|
export declare function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean;
|
|
5
|
-
export declare function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags?: FormTags[] | boolean): boolean;
|
|
5
|
+
export declare function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags?: readonly FormTags[] | boolean): boolean;
|
|
6
6
|
export declare function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean;
|
|
7
7
|
export declare const isHotkeyMatchingKeyboardEvent: (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers?: boolean) => boolean;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-hotkeys-hook",
|
|
3
3
|
"description": "React hook for handling keyboard shortcuts",
|
|
4
|
-
"version": "4.4.
|
|
4
|
+
"version": "4.4.1",
|
|
5
5
|
"repository": "https://JohannesKlauss@github.com/JohannesKlauss/react-keymap-hook.git",
|
|
6
6
|
"homepage": "https://johannesklauss.github.io/react-hotkeys-hook/",
|
|
7
7
|
"author": "Johannes Klauss",
|
|
@@ -75,31 +75,31 @@
|
|
|
75
75
|
}
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
|
-
"@babel/core": "7.21.
|
|
78
|
+
"@babel/core": "7.21.8",
|
|
79
79
|
"@babel/plugin-proposal-class-properties": "7.18.6",
|
|
80
|
-
"@babel/plugin-transform-react-jsx": "7.21.
|
|
81
|
-
"@babel/preset-env": "7.21.
|
|
80
|
+
"@babel/plugin-transform-react-jsx": "7.21.5",
|
|
81
|
+
"@babel/preset-env": "7.21.5",
|
|
82
82
|
"@babel/preset-react": "7.18.6",
|
|
83
|
-
"@babel/preset-typescript": "7.21.
|
|
83
|
+
"@babel/preset-typescript": "7.21.5",
|
|
84
84
|
"@testing-library/jest-dom": "5.16.5",
|
|
85
85
|
"@testing-library/react": "14.0.0",
|
|
86
86
|
"@testing-library/user-event": "14.4.3",
|
|
87
|
-
"@types/jest": "29.5.
|
|
88
|
-
"@types/react": "18.
|
|
89
|
-
"@types/react-dom": "18.
|
|
90
|
-
"@typescript-eslint/eslint-plugin": "5.
|
|
91
|
-
"@typescript-eslint/parser": "5.
|
|
87
|
+
"@types/jest": "29.5.2",
|
|
88
|
+
"@types/react": "18.2.14",
|
|
89
|
+
"@types/react-dom": "18.2.6",
|
|
90
|
+
"@typescript-eslint/eslint-plugin": "5.60.0",
|
|
91
|
+
"@typescript-eslint/parser": "5.60.0",
|
|
92
92
|
"eslint": "^8.34.0",
|
|
93
93
|
"eslint-plugin-prettier": "4.2.1",
|
|
94
94
|
"eslint-plugin-react": "^7.32.2",
|
|
95
95
|
"jest": "29.5.0",
|
|
96
96
|
"jest-environment-jsdom": "29.5.0",
|
|
97
|
-
"prettier": "2.8.
|
|
97
|
+
"prettier": "2.8.8",
|
|
98
98
|
"react": "18.2.0",
|
|
99
99
|
"react-dom": "18.2.0",
|
|
100
100
|
"react-test-renderer": "18.2.0",
|
|
101
101
|
"tsdx": "0.14.1",
|
|
102
|
-
"tslib": "2.5.
|
|
102
|
+
"tslib": "2.5.3",
|
|
103
103
|
"typescript": "5.0.4"
|
|
104
104
|
},
|
|
105
105
|
"peerDependencies": {
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import useHotkeys from './useHotkeys'
|
|
2
|
-
import type { Options } from './types'
|
|
2
|
+
import type { Options, Keys, HotkeyCallback } from './types'
|
|
3
3
|
import { HotkeysProvider, useHotkeysContext } from './HotkeysProvider'
|
|
4
4
|
import { isHotkeyPressed } from './isHotkeyPressed'
|
|
5
5
|
import useRecordHotkeys from './useRecordHotkeys'
|
|
6
6
|
|
|
7
|
-
export {
|
|
7
|
+
export {
|
|
8
|
+
useHotkeys,
|
|
9
|
+
useRecordHotkeys,
|
|
10
|
+
useHotkeysContext,
|
|
11
|
+
isHotkeyPressed,
|
|
12
|
+
HotkeysProvider,
|
|
13
|
+
Options,
|
|
14
|
+
Keys,
|
|
15
|
+
HotkeyCallback,
|
|
16
|
+
}
|
package/src/isHotkeyPressed.ts
CHANGED
|
@@ -29,8 +29,13 @@ import { isHotkeyModifier, mapKey } from './parseHotkeys'
|
|
|
29
29
|
|
|
30
30
|
const currentlyPressedKeys: Set<string> = new Set<string>()
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
// https://github.com/microsoft/TypeScript/issues/17002
|
|
33
|
+
export function isReadonlyArray(value: unknown): value is readonly unknown[] {
|
|
34
|
+
return Array.isArray(value)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function isHotkeyPressed(key: string | readonly string[], splitKey = ','): boolean {
|
|
38
|
+
const hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey)
|
|
34
39
|
|
|
35
40
|
return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))
|
|
36
41
|
}
|
package/src/types.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { DependencyList } from 'react'
|
|
2
2
|
|
|
3
3
|
export type FormTags = 'input' | 'textarea' | 'select' | 'INPUT' | 'TEXTAREA' | 'SELECT'
|
|
4
|
-
export type Keys = string | string[]
|
|
5
|
-
export type Scopes = string | string[]
|
|
4
|
+
export type Keys = string | readonly string[]
|
|
5
|
+
export type Scopes = string | readonly string[]
|
|
6
6
|
|
|
7
7
|
export type RefType<T> = T | null
|
|
8
8
|
|
|
@@ -15,7 +15,7 @@ export type KeyboardModifiers = {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export type Hotkey = KeyboardModifiers & {
|
|
18
|
-
keys?: string[]
|
|
18
|
+
keys?: readonly string[]
|
|
19
19
|
scopes?: Scopes
|
|
20
20
|
description?: string
|
|
21
21
|
}
|
|
@@ -28,7 +28,7 @@ export type Trigger = boolean | ((keyboardEvent: KeyboardEvent, hotkeysEvent: Ho
|
|
|
28
28
|
|
|
29
29
|
export type Options = {
|
|
30
30
|
enabled?: Trigger // Main setting that determines if the hotkey is enabled or not. (Default: true)
|
|
31
|
-
enableOnFormTags?: FormTags[] | boolean // Enable hotkeys on a list of tags. (Default: false)
|
|
31
|
+
enableOnFormTags?: readonly FormTags[] | boolean // Enable hotkeys on a list of tags. (Default: false)
|
|
32
32
|
enableOnContentEditable?: boolean // Enable hotkeys on tags with contentEditable props. (Default: false)
|
|
33
33
|
ignoreEventWhen?: (e: KeyboardEvent) => boolean // Ignore evenets based on a condition (Default: undefined)
|
|
34
34
|
combinationKey?: string // Character to split keys in hotkeys combinations. (Default: +)
|
package/src/useHotkeys.ts
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import { useHotkeysContext } from './HotkeysProvider'
|
|
13
13
|
import { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'
|
|
14
14
|
import useDeepEqualMemo from './useDeepEqualMemo'
|
|
15
|
-
import { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'
|
|
15
|
+
import { isReadonlyArray, pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'
|
|
16
16
|
|
|
17
17
|
const stopPropagation = (e: KeyboardEvent): void => {
|
|
18
18
|
e.stopPropagation()
|
|
@@ -36,7 +36,7 @@ export default function useHotkeys<T extends HTMLElement>(
|
|
|
36
36
|
: !(dependencies instanceof Array)
|
|
37
37
|
? (dependencies as Options)
|
|
38
38
|
: undefined
|
|
39
|
-
const _keys: string = keys
|
|
39
|
+
const _keys: string = isReadonlyArray(keys) ? keys.join(_options?.splitKey) : keys
|
|
40
40
|
const _deps: DependencyList | undefined =
|
|
41
41
|
options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined
|
|
42
42
|
|
package/src/validators.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FormTags, Hotkey, Scopes, Trigger } from './types'
|
|
2
|
-
import { isHotkeyPressed } from './isHotkeyPressed'
|
|
2
|
+
import { isHotkeyPressed, isReadonlyArray } from './isHotkeyPressed'
|
|
3
3
|
import { mapKey } from './parseHotkeys'
|
|
4
4
|
|
|
5
5
|
export function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {
|
|
@@ -20,10 +20,13 @@ export function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {
|
|
|
20
20
|
return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
export function isHotkeyEnabledOnTag(
|
|
23
|
+
export function isHotkeyEnabledOnTag(
|
|
24
|
+
{ target }: KeyboardEvent,
|
|
25
|
+
enabledOnTags: readonly FormTags[] | boolean = false
|
|
26
|
+
): boolean {
|
|
24
27
|
const targetTagName = target && (target as HTMLElement).tagName
|
|
25
28
|
|
|
26
|
-
if (enabledOnTags
|
|
29
|
+
if (isReadonlyArray(enabledOnTags)) {
|
|
27
30
|
return Boolean(
|
|
28
31
|
targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())
|
|
29
32
|
)
|