@@ -15,9 +15,20 @@ vi.mock("react-native-keyboard-controller/src/bindings", () => ({
1515 return { remove : ( ) => named . delete ( listener ) } ;
1616 } ,
1717 } ,
18- KeyboardControllerNative : { dismiss : ( ) => { } } ,
18+ KeyboardControllerNative : { dismiss : vi . fn ( ) } ,
1919} ) ) ;
2020
21+ vi . mock ( "react-native" , ( ) => ( {
22+ Keyboard : { isVisible : ( ) => false , dismiss : vi . fn ( ) } ,
23+ } ) ) ;
24+ vi . mock ( "react-native-keyboard-controller" , async ( ) => {
25+ const { KeyboardController } = await import ( "react-native-keyboard-controller/src/module" ) ;
26+ const { KeyboardEvents } = await import ( "react-native-keyboard-controller/src/bindings" ) ;
27+ return { KeyboardController, KeyboardEvents } ;
28+ } ) ;
29+
30+ import { dismissOpenKeyboard } from "./dismissOpenKeyboard" ;
31+ import { KeyboardControllerNative } from "react-native-keyboard-controller/src/bindings" ;
2132import { useKeyboardState } from "react-native-keyboard-controller/src/hooks/useKeyboardState" ;
2233import { KeyboardController } from "react-native-keyboard-controller/src/module" ;
2334
@@ -82,3 +93,29 @@ it("waits for the native hide before dismiss resolves after a didShow-only repai
8293 emit ( "keyboardDidHide" , 0 ) ;
8394 await dismissal ;
8495} ) ;
96+
97+ it ( "dismisses the custom composer before Back navigates, including after resume" , ( ) => {
98+ using _keyboard = setup ( ) ;
99+ const dismiss = vi . mocked ( KeyboardControllerNative . dismiss ) ;
100+ dismiss . mockClear ( ) ;
101+
102+ emit ( "keyboardDidShow" , 376 ) ;
103+ expect ( dismissOpenKeyboard ( ) ) . toBe ( true ) ;
104+ expect ( dismiss ) . toHaveBeenCalledTimes ( 1 ) ;
105+ emit ( "keyboardDidHide" , 0 ) ;
106+ expect ( dismissOpenKeyboard ( ) ) . toBe ( false ) ;
107+
108+ emit ( "keyboardDidShow" , 376 ) ;
109+ expect ( dismissOpenKeyboard ( ) ) . toBe ( true ) ;
110+ // A dropped hide event must not trap later Back presses in a stale visible cache.
111+ expect ( dismissOpenKeyboard ( ) ) . toBe ( false ) ;
112+ expect ( dismiss ) . toHaveBeenCalledTimes ( 2 ) ;
113+
114+ emit ( "keyboardWillShow" , 376 ) ;
115+ expect ( dismissOpenKeyboard ( ) ) . toBe ( true ) ;
116+ expect ( dismissOpenKeyboard ( ) ) . toBe ( false ) ;
117+ emit ( "keyboardDidShow" , 376 ) ;
118+ expect ( dismissOpenKeyboard ( ) ) . toBe ( true ) ;
119+ emit ( "keyboardDidHide" , 0 ) ;
120+ expect ( dismissOpenKeyboard ( ) ) . toBe ( false ) ;
121+ } ) ;
0 commit comments