@react-native-aria/interactions
Version:
43 lines (38 loc) • 1.04 kB
text/typescript
import { useEffect } from 'react';
import { useBackHandler } from './useBackHandler';
type IParams = {
enabled?: boolean;
callback: () => any;
};
let keyboardDismissHandlers: Array<() => any> = [];
export const keyboardDismissHandlerManager = {
push: (handler: () => any) => {
keyboardDismissHandlers.push(handler);
return () => {
keyboardDismissHandlers = keyboardDismissHandlers.filter(
(h) => h !== handler
);
};
},
length: () => keyboardDismissHandlers.length,
pop: () => {
return keyboardDismissHandlers.pop();
},
};
/**
* Handles attaching callback for Escape key listener on web and Back button listener on Android
*/
export const useKeyboardDismissable = ({ enabled, callback }: IParams) => {
useEffect(() => {
let cleanupFn = () => {};
if (enabled) {
cleanupFn = keyboardDismissHandlerManager.push(callback);
} else {
cleanupFn();
}
return () => {
cleanupFn();
};
}, [enabled, callback]);
useBackHandler({ enabled, callback });
};