diff options
author | Paul Frazee <pfrazee@gmail.com> | 2023-03-20 16:10:29 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-20 16:10:29 -0500 |
commit | 8a3601c07c693fa85800644f072ab895f3be4242 (patch) | |
tree | e702865de80960190249076b263b11ce31cd29af /src/view/com/composer/text-input/mobile | |
parent | df6a712834326d62fdac3fe459bcd1eb23bf5010 (diff) | |
download | voidsky-8a3601c07c693fa85800644f072ab895f3be4242.tar.zst |
* Improve layout in composer to ensure the mentions autocomplete is visible (closes #326) * Dont dismiss the keyboard in the composer
Diffstat (limited to 'src/view/com/composer/text-input/mobile')
-rw-r--r-- | src/view/com/composer/text-input/mobile/Autocomplete.tsx | 75 |
1 files changed, 45 insertions, 30 deletions
diff --git a/src/view/com/composer/text-input/mobile/Autocomplete.tsx b/src/view/com/composer/text-input/mobile/Autocomplete.tsx index 424a8629f..293c89da5 100644 --- a/src/view/com/composer/text-input/mobile/Autocomplete.tsx +++ b/src/view/com/composer/text-input/mobile/Autocomplete.tsx @@ -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}> - @{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}> + @{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, |