Fix visibility of the mentions autocomplete in the composer (#326) (#329)

* Improve layout in composer to ensure the mentions autocomplete is visible (closes #326)

* Dont dismiss the keyboard in the composer
This commit is contained in:
Paul Frazee 2023-03-20 16:10:29 -05:00 committed by GitHub
parent df6a712834
commit 8a3601c07c
3 changed files with 67 additions and 50 deletions

View file

@ -3,6 +3,7 @@ import {
NativeSyntheticEvent,
StyleSheet,
TextInputSelectionChangeEventData,
View,
} from 'react-native'
import PasteInput, {
PastedFile,
@ -185,7 +186,7 @@ export const TextInput = React.forwardRef(
}, [text, pal.link, pal.text])
return (
<>
<View style={styles.container}>
<PasteInput
testID="composerTextInput"
ref={textInput}
@ -202,15 +203,20 @@ export const TextInput = React.forwardRef(
view={autocompleteView}
onSelect={onSelectAutocompleteItem}
/>
</>
</View>
)
},
)
const styles = StyleSheet.create({
container: {
width: '100%',
},
textInput: {
flex: 1,
minHeight: 80,
padding: 5,
paddingBottom: 20,
marginLeft: 8,
alignSelf: 'flex-start',
},

View file

@ -1,10 +1,5 @@
import React, {useEffect} from 'react'
import {
Animated,
TouchableOpacity,
StyleSheet,
useWindowDimensions,
} from 'react-native'
import {Animated, TouchableOpacity, StyleSheet, View} from 'react-native'
import {observer} from 'mobx-react-lite'
import {UserAutocompleteViewModel} from 'state/models/user-autocomplete-view'
import {useAnimatedValue} from 'lib/hooks/useAnimatedValue'
@ -20,52 +15,72 @@ export const Autocomplete = observer(
onSelect: (item: string) => void
}) => {
const pal = usePalette('default')
const winDim = useWindowDimensions()
const positionInterp = useAnimatedValue(0)
useEffect(() => {
Animated.timing(positionInterp, {
toValue: view.isActive ? 1 : 0,
duration: 200,
useNativeDriver: false,
useNativeDriver: true,
}).start()
}, [positionInterp, view.isActive])
const topAnimStyle = {
top: positionInterp.interpolate({
inputRange: [0, 1],
outputRange: [winDim.height, winDim.height / 4],
}),
transform: [
{
translateY: positionInterp.interpolate({
inputRange: [0, 1],
outputRange: [200, 0],
}),
},
],
}
return (
<Animated.View style={[styles.outer, pal.view, pal.border, topAnimStyle]}>
{view.suggestions.map(item => (
<TouchableOpacity
testID="autocompleteButton"
key={item.handle}
style={[pal.border, styles.item]}
onPress={() => onSelect(item.handle)}>
<Text type="md-medium" style={pal.text}>
{item.displayName || item.handle}
<Text type="sm" style={pal.textLight}>
&nbsp;@{item.handle}
<View style={[styles.container, view.isActive && styles.visible]}>
<Animated.View
style={[
styles.animatedContainer,
pal.view,
pal.border,
topAnimStyle,
view.isActive && styles.visible,
]}>
{view.suggestions.slice(0, 5).map(item => (
<TouchableOpacity
testID="autocompleteButton"
key={item.handle}
style={[pal.border, styles.item]}
onPress={() => onSelect(item.handle)}>
<Text type="md-medium" style={pal.text}>
{item.displayName || item.handle}
<Text type="sm" style={pal.textLight}>
&nbsp;@{item.handle}
</Text>
</Text>
</Text>
</TouchableOpacity>
))}
</Animated.View>
</TouchableOpacity>
))}
</Animated.View>
</View>
)
},
)
const styles = StyleSheet.create({
outer: {
container: {
display: 'none',
height: 250,
},
animatedContainer: {
display: 'none',
position: 'absolute',
left: 0,
left: -64,
right: 0,
bottom: 0,
top: 0,
borderTopWidth: 1,
},
visible: {
display: 'flex',
},
item: {
borderBottomWidth: 1,
paddingVertical: 16,