expo-key-event
Version:
Provides an interface for reading key events such as from external bluetooth keyboards on Android, iOS and Web.
52 lines • 2.03 kB
JavaScript
import { useCallback, useEffect } from "react";
export function useKeyEventListener(listener, optionsOrListenOnMount, preventReload, listenToRelease) {
// Backwards compatibility: detect if using old API (boolean) or new API (object/undefined)
let options;
if (typeof optionsOrListenOnMount === "boolean") {
// Legacy API: positional parameters (boolean explicitly passed)
options = {
listenOnMount: optionsOrListenOnMount,
preventReload: preventReload ?? false,
listenToRelease: listenToRelease ?? false,
};
}
else {
// New API: options object or undefined (defaults to {})
options = optionsOrListenOnMount ?? {};
}
return useKeyEventListenerImpl(listener, options);
}
function useKeyEventListenerImpl(listener, { listenOnMount = true, preventReload = false, listenToRelease = false, }) {
const onKeyDown = useCallback((event) => listener({ key: event.code, eventType: "press" }), [listener]);
const onKeyUp = useCallback((event) => listener({ key: event.code, eventType: "release" }), [listener]);
const startListening = useCallback(() => {
addEventListener("keydown", onKeyDown);
if (listenToRelease) {
addEventListener("keyup", onKeyUp);
}
}, [onKeyDown, onKeyUp, listenToRelease]);
const stopListening = useCallback(() => {
removeEventListener("keydown", onKeyDown);
if (listenToRelease) {
removeEventListener("keyup", onKeyUp);
}
}, [onKeyDown, onKeyUp, listenToRelease]);
useEffect(() => {
if (listenOnMount)
startListening();
return () => {
stopListening();
};
}, [listenOnMount, startListening, stopListening]);
return {
/**
* Start listening for key events
*/
startListening,
/**
* Stop listening for key events
*/
stopListening,
};
}
//# sourceMappingURL=useKeyEventListener.web.js.map