diff options
author | Ivan Chen <ivan@tagg.id> | 2021-04-09 17:15:29 -0400 |
---|---|---|
committer | Ivan Chen <ivan@tagg.id> | 2021-04-09 17:15:29 -0400 |
commit | 347e9e450268e4897b8dd241721b84945d9e2ec9 (patch) | |
tree | 58334be3724398c886365e99901e4442f5657172 /src/screens/chat/ChatSearchBar.tsx | |
parent | 097b515066f1a0c38cb7fb69cf78b16b945594e5 (diff) | |
parent | 3ec56863bfdd47b2ee8d0f0fe5a45be779508660 (diff) |
Merge branch 'master' into tma756-bugfix-onpress-tagg-on-sp
# Conflicts:
# src/components/taggs/TaggsBar.tsx
Diffstat (limited to 'src/screens/chat/ChatSearchBar.tsx')
-rw-r--r-- | src/screens/chat/ChatSearchBar.tsx | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/screens/chat/ChatSearchBar.tsx b/src/screens/chat/ChatSearchBar.tsx new file mode 100644 index 00000000..4916ec45 --- /dev/null +++ b/src/screens/chat/ChatSearchBar.tsx @@ -0,0 +1,112 @@ +import React from 'react'; +import { + Keyboard, + NativeSyntheticEvent, + StyleSheet, + Text, + TextInput, + TextInputProps, + TextInputSubmitEditingEventData, + TouchableOpacity, + View, + ViewStyle, +} from 'react-native'; +import {normalize} from 'react-native-elements'; +import Animated, {useAnimatedStyle} from 'react-native-reanimated'; + +interface SearchBarProps extends TextInputProps { + onCancel: () => void; + animationProgress: Animated.SharedValue<number>; + searching: boolean; + placeholder: string; +} +const ChatSearchBar: React.FC<SearchBarProps> = ({ + onFocus, + onBlur, + onChangeText, + value, + onCancel, + searching, + animationProgress, + onLayout, + placeholder, +}) => { + const handleSubmit = ( + e: NativeSyntheticEvent<TextInputSubmitEditingEventData>, + ) => { + e.preventDefault(); + Keyboard.dismiss(); + }; + + /* + * On-search marginRight style ("cancel" button slides and fades in). + */ + const animatedStyles = useAnimatedStyle<ViewStyle>(() => ({ + marginRight: animationProgress.value * 58, + opacity: animationProgress.value, + })); + + return ( + <View style={styles.container} onLayout={onLayout}> + <Animated.View style={styles.inputContainer}> + <Animated.View style={styles.searchTextContainer}> + <Text style={styles.searchTextStyes}>To:</Text> + </Animated.View> + <TextInput + style={[styles.input]} + placeholderTextColor={'#828282'} + onSubmitEditing={handleSubmit} + clearButtonMode="always" + autoCapitalize="none" + autoCorrect={false} + {...{placeholder, value, onChangeText, onFocus, onBlur}} + /> + </Animated.View> + <Animated.View style={animatedStyles}> + <TouchableOpacity style={styles.cancelButton} onPress={onCancel}> + <Text style={styles.cancelText}>Cancel</Text> + </TouchableOpacity> + </Animated.View> + </View> + ); +}; + +const styles = StyleSheet.create({ + container: { + height: 40, + paddingHorizontal: 20, + flexDirection: 'row', + zIndex: 2, + }, + searchTextContainer: {marginHorizontal: 12}, + searchTextStyes: {fontWeight: 'bold', fontSize: 14, lineHeight: 17}, + inputContainer: { + flexGrow: 1, + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 8, + borderRadius: 20, + backgroundColor: '#F0F0F0', + }, + searchIcon: { + marginRight: 8, + }, + input: { + flex: 1, + fontSize: 16, + color: '#000', + letterSpacing: normalize(0.5), + }, + cancelButton: { + height: '100%', + position: 'absolute', + justifyContent: 'center', + paddingHorizontal: 8, + }, + cancelText: { + color: '#818181', + fontWeight: '500', + }, +}); + +export default ChatSearchBar; |