diff --git a/packages/react-native-aria/interactions/src/index.ts b/packages/react-native-aria/interactions/src/index.ts index 682cfaff51..b9a3f10de3 100644 --- a/packages/react-native-aria/interactions/src/index.ts +++ b/packages/react-native-aria/interactions/src/index.ts @@ -10,5 +10,6 @@ export { export { keyboardDismissHandlerManager, useKeyboardDismissable, - useBackHandler, } from './useKeyboardDismisssable'; + +export { useBackHandler } from './useBackHandler'; diff --git a/packages/react-native-aria/interactions/src/index.web.ts b/packages/react-native-aria/interactions/src/index.web.ts deleted file mode 100644 index e448ba1174..0000000000 --- a/packages/react-native-aria/interactions/src/index.web.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { useHover } from './useHover.web'; -export { usePress } from './usePress'; -export { - keyboardDismissHandlerManager, - useKeyboardDismissable, - useBackHandler, -} from './useKeyboardDismisssable'; diff --git a/packages/react-native-aria/interactions/src/useBackHandler.ts b/packages/react-native-aria/interactions/src/useBackHandler.ts new file mode 100644 index 0000000000..c18a840a8c --- /dev/null +++ b/packages/react-native-aria/interactions/src/useBackHandler.ts @@ -0,0 +1,27 @@ +import { useEffect, useRef } from 'react'; +import { BackHandler, NativeEventSubscription } from 'react-native'; + +type IParams = { + enabled?: boolean; + callback: () => any; +}; + +export function useBackHandler({ enabled, callback }: IParams) { + const backHandlerRef = useRef(null); + + useEffect(() => { + const backHandler = () => { + callback(); + return true; + }; + if (enabled) { + backHandlerRef.current = BackHandler.addEventListener( + 'hardwareBackPress', + backHandler + ); + } else { + backHandlerRef.current?.remove(); + } + return () => backHandlerRef.current?.remove(); + }, [enabled, callback]); +} diff --git a/packages/react-native-aria/interactions/src/useBackHandler.web.ts b/packages/react-native-aria/interactions/src/useBackHandler.web.ts new file mode 100644 index 0000000000..829eac3108 --- /dev/null +++ b/packages/react-native-aria/interactions/src/useBackHandler.web.ts @@ -0,0 +1,21 @@ +import { useEffect } from 'react'; + +type IParams = { + enabled?: boolean; + callback: () => any; +}; + +export function useBackHandler({ enabled, callback }: IParams) { + useEffect(() => { + const handleEscape = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + callback(); + } + }; + + document?.body?.addEventListener?.('keyup', handleEscape); + return () => { + document?.body?.removeEventListener?.('keyup', handleEscape); + }; + }, [enabled, callback]); +} diff --git a/packages/react-native-aria/interactions/src/useKeyboardDismisssable.ts b/packages/react-native-aria/interactions/src/useKeyboardDismisssable.ts index 416b4190ad..0d951c41f3 100644 --- a/packages/react-native-aria/interactions/src/useKeyboardDismisssable.ts +++ b/packages/react-native-aria/interactions/src/useKeyboardDismisssable.ts @@ -1,6 +1,5 @@ -import React from 'react'; import { useEffect } from 'react'; -import { BackHandler, Platform } from 'react-native'; +import { useBackHandler } from './useBackHandler'; type IParams = { enabled?: boolean; @@ -27,7 +26,7 @@ export const keyboardDismissHandlerManager = { * Handles attaching callback for Escape key listener on web and Back button listener on Android */ export const useKeyboardDismissable = ({ enabled, callback }: IParams) => { - React.useEffect(() => { + useEffect(() => { let cleanupFn = () => {}; if (enabled) { cleanupFn = keyboardDismissHandlerManager.push(callback); @@ -41,32 +40,3 @@ export const useKeyboardDismissable = ({ enabled, callback }: IParams) => { useBackHandler({ enabled, callback }); }; - -export function useBackHandler({ enabled, callback }: IParams) { - useEffect(() => { - if (Platform.OS === 'web') { - const handleEscape = (e: KeyboardEvent) => { - if (e.key === 'Escape') { - callback(); - } - }; - - document?.body?.addEventListener?.('keyup', handleEscape); - return () => { - document?.body?.removeEventListener?.('keyup', handleEscape); - }; - } else { - let backHandler = () => { - callback(); - return true; - }; - if (enabled) { - BackHandler.addEventListener('hardwareBackPress', backHandler); - } else { - BackHandler.removeEventListener('hardwareBackPress', backHandler); - } - return () => - BackHandler.removeEventListener('hardwareBackPress', backHandler); - } - }, [enabled, callback]); -} diff --git a/packages/unstyled/hooks/src/use-back-handler/index.ts b/packages/unstyled/hooks/src/use-back-handler/index.ts new file mode 100644 index 0000000000..a674f83a4d --- /dev/null +++ b/packages/unstyled/hooks/src/use-back-handler/index.ts @@ -0,0 +1,27 @@ +import { useEffect, useRef } from 'react'; +import { BackHandler, type NativeEventSubscription } from 'react-native'; + +type IParams = { + enabled?: boolean; + callback: () => any; +}; + +export function useBackHandler({ enabled, callback }: IParams) { + const backHandlerRef = useRef(null); + + useEffect(() => { + const backHandler = () => { + callback(); + return true; + }; + if (enabled) { + backHandlerRef.current = BackHandler.addEventListener( + 'hardwareBackPress', + backHandler + ); + } else { + backHandlerRef.current?.remove(); + } + return () => backHandlerRef.current?.remove(); + }, [enabled, callback]); +} diff --git a/packages/unstyled/hooks/src/use-back-handler/index.web.ts b/packages/unstyled/hooks/src/use-back-handler/index.web.ts new file mode 100644 index 0000000000..829eac3108 --- /dev/null +++ b/packages/unstyled/hooks/src/use-back-handler/index.web.ts @@ -0,0 +1,21 @@ +import { useEffect } from 'react'; + +type IParams = { + enabled?: boolean; + callback: () => any; +}; + +export function useBackHandler({ enabled, callback }: IParams) { + useEffect(() => { + const handleEscape = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + callback(); + } + }; + + document?.body?.addEventListener?.('keyup', handleEscape); + return () => { + document?.body?.removeEventListener?.('keyup', handleEscape); + }; + }, [enabled, callback]); +} diff --git a/packages/unstyled/hooks/src/use-keyboard-dismissable/index.ts b/packages/unstyled/hooks/src/use-keyboard-dismissable/index.ts index 54979c6c24..ff3ce00b77 100644 --- a/packages/unstyled/hooks/src/use-keyboard-dismissable/index.ts +++ b/packages/unstyled/hooks/src/use-keyboard-dismissable/index.ts @@ -1,6 +1,5 @@ import React from 'react'; -import { useEffect } from 'react'; -import { BackHandler, Platform } from 'react-native'; +import { useBackHandler } from '../use-back-handler'; type IParams = { enabled?: boolean; @@ -41,32 +40,3 @@ export const useKeyboardDismissable = ({ enabled, callback }: IParams) => { useBackHandler({ enabled, callback }); }; - -export function useBackHandler({ enabled, callback }: IParams) { - useEffect(() => { - if (Platform.OS === 'web') { - const handleEscape = (e: KeyboardEvent) => { - if (e.key === 'Escape') { - callback(); - } - }; - - document?.body?.addEventListener?.('keyup', handleEscape); - return () => { - document?.body?.removeEventListener?.('keyup', handleEscape); - }; - } else { - const backHandler = () => { - callback(); - return true; - }; - if (enabled) { - BackHandler.addEventListener('hardwareBackPress', backHandler); - } else { - BackHandler.removeEventListener('hardwareBackPress', backHandler); - } - return () => - BackHandler.removeEventListener('hardwareBackPress', backHandler); - } - }, [enabled, callback]); -} diff --git a/packages/unstyled/react-native-aria/src/useKeyboardDismisssable.ts b/packages/unstyled/react-native-aria/src/useKeyboardDismisssable.ts index f3cfa44402..af4d20ce7c 100644 --- a/packages/unstyled/react-native-aria/src/useKeyboardDismisssable.ts +++ b/packages/unstyled/react-native-aria/src/useKeyboardDismisssable.ts @@ -1,6 +1,5 @@ -import React from 'react'; -import { useEffect } from 'react'; -import { BackHandler } from 'react-native'; +import { useEffect, useRef } from 'react'; +import { BackHandler, NativeEventSubscription } from 'react-native'; type IParams = { enabled?: boolean; @@ -27,7 +26,7 @@ export const keyboardDismissHandlerManager = { * Handles attaching callback for Escape key listener on web and Back button listener on Android */ export const useKeyboardDismissable = ({ enabled, callback }: IParams) => { - React.useEffect(() => { + useEffect(() => { let cleanupFn = () => {}; if (enabled) { cleanupFn = keyboardDismissHandlerManager.push(callback); @@ -41,19 +40,22 @@ export const useKeyboardDismissable = ({ enabled, callback }: IParams) => { useBackHandler({ enabled, callback }); }; - export function useBackHandler({ enabled, callback }: IParams) { + const backHandlerRef = useRef(null); + useEffect(() => { - let backHandler = () => { + const backHandler = () => { callback(); return true; }; if (enabled) { - BackHandler.addEventListener('hardwareBackPress', backHandler); + backHandlerRef.current = BackHandler.addEventListener( + 'hardwareBackPress', + backHandler + ); } else { - BackHandler.removeEventListener('hardwareBackPress', backHandler); + backHandlerRef.current?.remove(); } - return () => - BackHandler.removeEventListener('hardwareBackPress', backHandler); + return () => backHandlerRef.current?.remove(); }, [enabled, callback]); }