UNPKG

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
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