@react-hookz/web
Version:
React hooks done right, for browser and SSR.
40 lines (39 loc) • 1.75 kB
JavaScript
;
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;