From 1e06c803334e8207347ccd50d6397574f35129dd Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 7 Jun 2024 22:27:16 -0700 Subject: [PATCH] Reliably focus keyboard on Android (#4427) (cherry picked from commit a2d1cf68b9cf6b2d935439e522c838359a94a9a4) --- src/view/com/composer/Composer.tsx | 33 +++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 5807488393..fac08a7113 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -134,8 +134,8 @@ export const ComposePost = observer(function ComposePost({ // See https://github.com/bluesky-social/social-app/pull/4399 const {setEnabled} = useKeyboardContext() React.useEffect(() => { + if (!isAndroid) return setEnabled(false) - return () => { setEnabled(true) } @@ -402,6 +402,37 @@ export const ComposePost = observer(function ComposePost({ bottomBarAnimatedStyle, } = useAnimatedBorders() + // Backup focus on android, if the keyboard *still* refuses to show + useEffect(() => { + if (!isAndroid) return + if (!isModalReady) return + + function tryFocus() { + if (!Keyboard.isVisible()) { + textInput.current?.blur() + textInput.current?.focus() + } + } + + tryFocus() + // Retry with enough gap to avoid interrupting the previous attempt. + // Unfortunately we don't know which attempt will succeed. + const retryInterval = setInterval(tryFocus, 500) + + function stopTrying() { + clearInterval(retryInterval) + } + + // Deactivate this fallback as soon as anything happens. + const sub1 = Keyboard.addListener('keyboardDidShow', stopTrying) + const sub2 = Keyboard.addListener('keyboardDidHide', stopTrying) + return () => { + clearInterval(retryInterval) + sub1.remove() + sub2.remove() + } + }, [isModalReady]) + return ( <>