Skip to content

Commit 63dcc2f

Browse files
Fix: Keyboard opens on android when clicked on switch to keyboard btn in emoji picker (#9464) (#9471)
(cherry picked from commit 98bf396) Co-authored-by: Rajat Dabade <rajatdabade1997@gmail.com>
1 parent bfeabe1 commit 63dcc2f

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

app/components/emoji_category_bar/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import TouchableWithFeedback from '@components/touchable_with_feedback';
99
import {useKeyboardAnimationContext} from '@context/keyboard_animation';
1010
import {useTheme} from '@context/theme';
1111
import {selectEmojiCategoryBarSection, useEmojiCategoryBar} from '@hooks/emoji_category_bar';
12+
import {useFocusAfterEmojiDismiss} from '@hooks/useFocusAfterEmojiDismiss';
1213
import {usePreventDoubleTap} from '@hooks/utils';
1314
import {deleteLastGrapheme} from '@utils/grapheme';
1415
import {changeOpacity, makeStyleSheetFromTheme} from '@utils/theme';
@@ -61,11 +62,14 @@ const EmojiCategoryBar = ({onSelect}: Props) => {
6162
const keyboardContext = useKeyboardAnimationContext();
6263
const {
6364
focusInput,
65+
inputRef,
6466
updateValue,
6567
updateCursorPosition,
6668
cursorPositionRef,
6769
} = keyboardContext;
6870

71+
const {focus: focusWithEmojiDismiss} = useFocusAfterEmojiDismiss(inputRef, focusInput);
72+
6973
// Only show keyboard/delete buttons if we're in input accessory view mode
7074
// Check if updateValue is available (not null) to determine if we're in input accessory context
7175
const showActionButtons = updateValue !== null;
@@ -80,8 +84,8 @@ const EmojiCategoryBar = ({onSelect}: Props) => {
8084
}, [onSelect]);
8185

8286
const handleKeyboardPress = usePreventDoubleTap(useCallback(() => {
83-
focusInput();
84-
}, [focusInput]));
87+
focusWithEmojiDismiss();
88+
}, [focusWithEmojiDismiss]));
8589

8690
const deleteCharFromCurrentCursorPosition = useCallback(() => {
8791
if (!updateValue || !updateCursorPosition || !cursorPositionRef) {

app/hooks/useFocusAfterEmojiDismiss.ts

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,16 @@ export const useFocusAfterEmojiDismiss = (
4545

4646
inputRef.current?.blur();
4747

48-
const handleDelayedFocus = () => {
49-
focusInput();
50-
setIsManuallyFocusingAfterEmojiDismiss(false);
51-
focusTimeoutRef.current = null;
52-
};
48+
// Use requestAnimationFrame to ensure state updates have been applied
49+
requestAnimationFrame(() => {
50+
const handleDelayedFocus = () => {
51+
focusInput();
52+
setIsManuallyFocusingAfterEmojiDismiss(false);
53+
focusTimeoutRef.current = null;
54+
};
5355

54-
focusTimeoutRef.current = setTimeout(handleDelayedFocus, 200);
56+
focusTimeoutRef.current = setTimeout(handleDelayedFocus, 200);
57+
});
5558

5659
return () => {
5760
if (focusTimeoutRef.current) {
@@ -80,6 +83,20 @@ export const useFocusAfterEmojiDismiss = (
8083

8184
setIsEmojiSearchFocused(false);
8285
setShowInputAccessoryView(false);
86+
87+
if (focusTimeoutRef.current) {
88+
clearTimeout(focusTimeoutRef.current);
89+
}
90+
91+
inputRef.current?.blur();
92+
93+
// Schedule focus after emoji picker closes
94+
focusTimeoutRef.current = setTimeout(() => {
95+
focusInput();
96+
setIsManuallyFocusingAfterEmojiDismiss(false);
97+
isDismissingEmojiPicker.current = false;
98+
focusTimeoutRef.current = null;
99+
}, 200);
83100
} else {
84101
focusInput();
85102
}
@@ -91,6 +108,7 @@ export const useFocusAfterEmojiDismiss = (
91108
keyboardTranslateY,
92109
isTransitioningFromCustomView,
93110
setIsEmojiSearchFocused,
111+
inputRef,
94112
focusInput,
95113
]);
96114

0 commit comments

Comments
 (0)