UNPKG

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