UNPKG

use-control

Version:

A powerful set of hooks for elegantly handling keyboard, mouse and gamepad input (soon)

43 lines 1.64 kB
import { useEffect } from 'react'; import { EMPTY, fromEvent, interval, merge } from 'rxjs'; import { distinctUntilChanged, filter, groupBy, map, mergeAll, switchMap } from 'rxjs/operators'; export var keydown$ = fromEvent(document, 'keydown'); export var keyup$ = fromEvent(document, 'keyup'); export var key$ = merge(keydown$, keyup$).pipe(groupBy(function (e) { return e.keyCode; }), map(function (group) { return group.pipe(distinctUntilChanged(function (a, b) { return a === b; }, function (e) { return e.type; })); }), mergeAll()); function useKeyEvents(key, eventType, sink) { useEffect(function () { var s = key$ .pipe(filter(function (ev) { return ev.keyCode === key && ev.type === eventType && !ev.repeat; })) .subscribe(sink); return function () { return s.unsubscribe(); }; }, [key, eventType, sink]); } export function useKeyDown(key, sink) { useKeyEvents(key, 'keydown', sink); } export function useKeyUp(key, sink) { useKeyEvents(key, 'keyup', sink); } export function useKeyHeld(key, intervalMs, sink) { useEffect(function () { var s = key$ .pipe(filter(function (ev) { return ev.keyCode === key; }), switchMap(function (ev) { var kev = ev; if (kev.type === 'keydown') { return interval(intervalMs); } else { return EMPTY; } })) .subscribe(sink); return function () { return s.unsubscribe(); }; }, [key, intervalMs, sink]); } //# sourceMappingURL=keyStream.js.map