expo-key-event
Version:
Provides an interface for reading key events such as from external bluetooth keyboards on Android, iOS and Web.
84 lines • 3.22 kB
JavaScript
import { useEvent } from "expo";
import { useEffect, useMemo } from "react";
import { DevSettings } from "react-native";
import ExpoKeyEventModule from "../ExpoKeyEventModule";
import { unifyKeyCode } from "../utils/unifyKeyCode";
export function useKeyEvent(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 useKeyEventImpl(options);
}
function useKeyEventImpl({ listenOnMount = true, preventReload = false, listenToRelease = false, captureModifiers = false, }) {
const pressEvent = useEvent(ExpoKeyEventModule, "onKeyPress");
const releaseEvent = useEvent(ExpoKeyEventModule, "onKeyRelease");
useEffect(() => {
if (listenOnMount)
ExpoKeyEventModule.startListening();
return () => {
ExpoKeyEventModule.stopListening();
};
}, [listenOnMount]);
const keyEvent = useMemo(() => {
if (!pressEvent)
return null;
const uniKey = unifyKeyCode(pressEvent.key);
if (!preventReload && __DEV__ && uniKey === "KeyR")
DevSettings.reload();
// Build base event
const event = {
key: uniKey,
eventType: "press",
};
// Conditionally add modifiers
if (captureModifiers) {
event.shiftKey = pressEvent.shiftKey ?? false;
event.ctrlKey = pressEvent.ctrlKey ?? false;
event.altKey = pressEvent.altKey ?? false;
event.metaKey = pressEvent.metaKey ?? false;
event.repeat = pressEvent.repeat ?? false;
}
return event;
}, [pressEvent, preventReload, captureModifiers]);
const keyReleaseEvent = useMemo(() => {
if (!listenToRelease || !releaseEvent)
return null;
const uniKey = unifyKeyCode(releaseEvent.key);
const event = {
key: uniKey,
eventType: "release",
};
if (captureModifiers) {
event.shiftKey = releaseEvent.shiftKey ?? false;
event.ctrlKey = releaseEvent.ctrlKey ?? false;
event.altKey = releaseEvent.altKey ?? false;
event.metaKey = releaseEvent.metaKey ?? false;
event.repeat = releaseEvent.repeat ?? false;
}
return event;
}, [releaseEvent, listenToRelease, captureModifiers]);
return {
/**
* Start listening for key events
*/
startListening: ExpoKeyEventModule.startListening,
/**
* Stop listening for key events
*/
stopListening: ExpoKeyEventModule.stopListening,
keyEvent,
keyReleaseEvent,
};
}
//# sourceMappingURL=useKeyEvent.js.map