From a2d1cf68b9cf6b2d935439e522c838359a94a9a4 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 8 Jun 2024 06:27:16 +0100 Subject: [PATCH] Reliably focus keyboard on Android (#4427) --- src/view/com/composer/Composer.tsx | 32 +++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 7872ea18..fac08a71 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -405,13 +405,31 @@ export const ComposePost = observer(function ComposePost({ // Backup focus on android, if the keyboard *still* refuses to show useEffect(() => { if (!isAndroid) return - if (isModalReady) { - setTimeout(() => { - if (!Keyboard.isVisible()) { - textInput.current?.blur() - textInput.current?.focus() - } - }, 300) + 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])