UNPKG

@react-hookz/web

Version:

React hooks done right, for browser and SSR.

40 lines (39 loc) 1.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useKeyboardEvent = void 0; var react_1 = require("react"); var __1 = require(".."); var const_1 = require("../util/const"); var misc_1 = require("../util/misc"); var createKeyPredicate = function (keyFilter) { if (typeof keyFilter === 'function') return keyFilter; if (typeof keyFilter === 'string') return function (ev) { return ev.key === keyFilter; }; return keyFilter ? misc_1.yieldTrue : misc_1.yieldFalse; }; var WINDOW_OR_NULL = const_1.isBrowser ? window : null; /** * Executes callback when keyboard event occurred on target (window by default). * * @param keyOrPredicate Filters keypresses on which `callback` will be executed. * @param callback Function to call when key is pressed and `keyOrPredicate` matches positive. * @param deps Dependencies list that will be passed to underlying `useMemo`. * @param options Hook options. */ function useKeyboardEvent(keyOrPredicate, callback, deps, options) { if (options === void 0) { options = {}; } var _a = options.event, event = _a === void 0 ? 'keydown' : _a, _b = options.target, target = _b === void 0 ? WINDOW_OR_NULL : _b, eventOptions = options.eventOptions; var cbRef = (0, __1.useSyncedRef)(callback); var handler = (0, react_1.useMemo)(function () { var predicate = createKeyPredicate(keyOrPredicate); return function kbEventHandler(ev) { if (predicate(ev)) { cbRef.current.call(this, ev); } }; // eslint-disable-next-line react-hooks/exhaustive-deps }, deps); (0, __1.useEventListener)(target, event, handler, eventOptions); } exports.useKeyboardEvent = useKeyboardEvent;