use-control
Version:
A powerful set of hooks for elegantly handling keyboard, mouse and gamepad input (soon)
43 lines • 1.64 kB
JavaScript
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