expo-key-event
Version:
Provides an interface for reading key events such as from external bluetooth keyboards on Android, iOS and Web.
76 lines • 3.06 kB
JavaScript
import { useEventListener } from "expo";
import { useCallback, useEffect } from "react";
import { DevSettings } from "react-native";
import ExpoKeyEventModule from "../ExpoKeyEventModule";
import { unifyKeyCode } from "../utils/unifyKeyCode";
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, captureModifiers = false, }) {
const onKeyPress = useCallback((rawEvent) => {
const uniKey = unifyKeyCode(rawEvent.key);
if (!preventReload && __DEV__ && uniKey === "KeyR")
DevSettings.reload();
const event = {
key: uniKey,
eventType: "press",
};
if (captureModifiers) {
event.shiftKey = rawEvent.shiftKey ?? false;
event.ctrlKey = rawEvent.ctrlKey ?? false;
event.altKey = rawEvent.altKey ?? false;
event.metaKey = rawEvent.metaKey ?? false;
event.repeat = rawEvent.repeat ?? false;
}
listener(event);
}, [listener, preventReload, captureModifiers]);
const onKeyRelease = useCallback((rawEvent) => {
const uniKey = unifyKeyCode(rawEvent.key);
const event = {
key: uniKey,
eventType: "release",
};
if (captureModifiers) {
event.shiftKey = rawEvent.shiftKey ?? false;
event.ctrlKey = rawEvent.ctrlKey ?? false;
event.altKey = rawEvent.altKey ?? false;
event.metaKey = rawEvent.metaKey ?? false;
event.repeat = rawEvent.repeat ?? false;
}
listener(event);
}, [listener, captureModifiers]);
useEventListener(ExpoKeyEventModule, "onKeyPress", onKeyPress);
useEventListener(ExpoKeyEventModule, "onKeyRelease", listenToRelease ? onKeyRelease : () => { });
useEffect(() => {
if (listenOnMount)
ExpoKeyEventModule.startListening();
return () => {
ExpoKeyEventModule.stopListening();
};
}, [listenOnMount]);
return {
/**
* Start listening for key events
*/
startListening: ExpoKeyEventModule.startListening,
/**
* Stop listening for key events
*/
stopListening: ExpoKeyEventModule.stopListening,
};
}
//# sourceMappingURL=useKeyEventListener.js.map