import Ionicons from '@expo/vector-icons/build/Ionicons'; import { useNavigation } from '@react-navigation/native'; import React from 'react'; import { Dimensions, LayoutAnimation, LayoutChangeEvent, StyleSheet, Text, TextInput, TextStyle, TouchableOpacity, View, } from 'react-native'; const Layout = { window: { width: Dimensions.get('window').width, }, }; const SearchContainerHorizontalMargin = 10; const SearchContainerWidth = Layout.window.width - SearchContainerHorizontalMargin * 2; const SearchIcon = () => ( ); export default function SearchBar({ textColor, cancelButtonText, tintColor, placeholderTextColor, onChangeQuery, onSubmit, onCancelPress, initialValue = '', }: { initialValue?: string; cancelButtonText?: string; selectionColor?: string; tintColor: string; placeholderTextColor?: string; underlineColorAndroid?: string; textColor?: string; onSubmit?: (query: string) => void; onChangeQuery?: (query: string) => void; onCancelPress?: (goBack: () => void) => void; }) { const navigation = useNavigation(); const [text, setText] = React.useState(initialValue); const [showCancelButton, setShowCancelButton] = React.useState(false); const [inputWidth, setInputWidth] = React.useState(SearchContainerWidth); const _textInput = React.useRef(null); React.useEffect(() => { requestAnimationFrame(() => { _textInput.current?.focus(); }); }, []); const _handleLayoutCancelButton = (e: LayoutChangeEvent) => { if (showCancelButton) { return; } const cancelButtonWidth = e.nativeEvent.layout.width; requestAnimationFrame(() => { LayoutAnimation.configureNext({ duration: 200, create: { type: LayoutAnimation.Types.linear, property: LayoutAnimation.Properties.opacity, }, update: { type: LayoutAnimation.Types.spring, springDamping: 0.9, initialVelocity: 10, }, }); setShowCancelButton(true); setInputWidth(SearchContainerWidth - cancelButtonWidth); }); }; const _handleChangeText = (text: string) => { setText(text); onChangeQuery?.(text); }; const _handleSubmit = () => { onSubmit?.(text); _textInput.current?.blur?.(); }; const _handlePressCancelButton = () => { if (onCancelPress) { onCancelPress(navigation.goBack); } else { navigation.goBack(); } }; const searchInputStyle: TextStyle = {}; if (textColor) { searchInputStyle.color = textColor; } return ( {cancelButtonText || 'Cancel'} ); } const styles = StyleSheet.create({ container: { flex: 1, flexDirection: 'row', }, buttonContainer: { position: 'absolute', right: 0, top: 0, paddingTop: 15, flexDirection: 'row', alignItems: 'center', justifyContent: 'center', }, button: { paddingRight: 17, paddingLeft: 2, }, searchContainer: { height: 30, width: SearchContainerWidth, backgroundColor: '#f2f2f2', borderRadius: 5, marginHorizontal: SearchContainerHorizontalMargin, marginTop: 10, paddingLeft: 27, }, searchIconContainer: { position: 'absolute', left: 7, top: 6, bottom: 0, }, searchInput: { flex: 1, fontSize: 14, paddingTop: 1, }, });