···66import {ImageModel} from '#/state/models/media/image'
77import {GalleryModel} from '#/state/models/media/gallery'
88import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
99-import {EmbedPlayerSource} from '#/lib/strings/embed-player.ts'
99+import {EmbedPlayerSource} from '#/lib/strings/embed-player'
1010import {ThreadgateSetting} from '../queries/threadgate'
11111212export interface ConfirmModal {
+24-1
src/view/com/modals/AltImage.tsx
···44 StyleSheet,
55 TouchableOpacity,
66 View,
77+ TextInput as RNTextInput,
78 useWindowDimensions,
99+ ScrollView as RNScrollView,
810} from 'react-native'
911import {ScrollView, TextInput} from './util'
1012import {Image} from 'expo-image'
···1315import {enforceLen} from 'lib/strings/helpers'
1416import {MAX_ALT_TEXT} from 'lib/constants'
1517import {useTheme} from 'lib/ThemeContext'
1818+import {useIsKeyboardVisible} from 'lib/hooks/useIsKeyboardVisible'
1619import {Text} from '../util/text/Text'
1720import LinearGradient from 'react-native-linear-gradient'
1821import {isWeb} from 'platform/detection'
···3437 const [altText, setAltText] = useState(image.altText)
3538 const windim = useWindowDimensions()
3639 const {closeModal} = useModalControls()
4040+ const inputRef = React.useRef<RNTextInput>(null)
4141+ const scrollViewRef = React.useRef<RNScrollView>(null)
4242+ const keyboardShown = useIsKeyboardVisible()
4343+4444+ // Autofocus hack when we open the modal. We have to wait for the animation to complete first
4545+ React.useEffect(() => {
4646+ setTimeout(() => {
4747+ inputRef.current?.focus()
4848+ }, 500)
4949+ }, [])
5050+5151+ // We'd rather be at the bottom here so that we can easily dismiss the modal instead of having to scroll
5252+ // (especially on android, it acts weird)
5353+ React.useEffect(() => {
5454+ if (keyboardShown[0]) {
5555+ scrollViewRef.current?.scrollToEnd()
5656+ }
5757+ }, [keyboardShown])
37583859 const imageStyles = useMemo<ImageStyle>(() => {
3960 const maxWidth = isWeb ? 450 : windim.width
···7192 testID="altTextImageModal"
7293 style={[pal.view, styles.scrollContainer]}
7394 keyboardShouldPersistTaps="always"
9595+ ref={scrollViewRef}
7496 nativeID="imageAltText">
7597 <View style={styles.scrollInner}>
7698 <View style={[pal.viewLight, styles.imageContainer]}>
···97119 accessibilityLabel={_(msg`Image alt text`)}
98120 accessibilityHint=""
99121 accessibilityLabelledBy="imageAltText"
100100- autoFocus
122122+ // @ts-ignore This is fine, type is weird on the BottomSheetTextInput
123123+ ref={inputRef}
101124 />
102125 <View style={styles.buttonControls}>
103126 <TouchableOpacity