@uiw/react-native
Version:
UIW for React Native
117 lines (116 loc) • 3.28 kB
JavaScript
import React, { useState } from 'react';
import { View, StyleSheet, TouchableOpacity, TextInput } from 'react-native';
import Icon from '../Icon';
import Loader from '../Loader';
import Text from '../Typography/Text';
import { useTheme } from '@shopify/restyle';
const SearchInputBar = props => {
const inputRef = React.createRef();
const theme = useTheme();
const [state, setState] = useState({
showIcon: false
});
const needFocus = type => {
if (type === 'close') {
props.onClear?.();
} else if (type === 'search') {
props.onSearch?.();
return;
}
if (type === 'actived') {
setState({
showIcon: true
});
}
inputRef.current && inputRef.current.focus();
};
// 右侧搜索
const renderSearch = () => {
const {
showActionButton,
searchRender,
touchProps,
actionName = '搜索'
} = props;
const {
showIcon
} = state;
if (showActionButton || showIcon) {
return searchRender ? searchRender : <TouchableOpacity {...touchProps} style={[styles.search, {
paddingHorizontal: 10
}]}>
<Text color="primary_background">{actionName}</Text>
</TouchableOpacity>;
}
return null;
};
const {
value,
onChangeText,
showActionButton,
inputStyle,
containerStyle,
searchIcon,
closeIcon,
loading = false,
...other
} = props;
return <Loader loading={loading} rounded={5} maskColor="transparent">
<View style={[styles.centerFlex]}>
<View style={StyleSheet.flatten([{
backgroundColor: theme.colors.mask || '#fff'
}, styles.searchContainer, styles.centerFlex, containerStyle])}>
<TouchableOpacity onPress={() => needFocus('search')}>
<Icon name="search" size={14} color={theme.colors.text} height={'100%'} {...searchIcon} />
</TouchableOpacity>
<TextInput {...other} value={value} onChangeText={onChangeText} ref={inputRef} style={[{
color: theme.colors.primary_text || '#A6ACB1'
}, styles.textInput, inputStyle]} onFocus={e => {
if (showActionButton !== null) {
setState({
showIcon: true
});
}
other?.onFocus?.(e);
}} onBlur={e => {
if (showActionButton !== null && !value && !loading) {
setState({
showIcon: false
});
}
other?.onBlur?.(e);
}} />
{Boolean(value) && <TouchableOpacity style={{}} onPress={() => needFocus('close')}>
<Icon name="close" size={14} color={theme.colors.primary_text || '#A6ACB1'} height={'100%'} {...closeIcon} />
</TouchableOpacity>}
</View>
{renderSearch()}
</View>
</Loader>;
};
export default SearchInputBar;
const styles = StyleSheet.create({
centerFlex: {
flexDirection: 'row',
justifyContent: 'center',
alignContent: 'center'
},
searchContainer: {
height: 40,
borderRadius: 5,
flex: 1,
paddingHorizontal: 15
},
textInput: {
paddingVertical: 0,
height: '100%',
flex: 1,
fontSize: 14,
fontWeight: '400',
paddingLeft: 10
},
search: {
justifyContent: 'center',
borderWidth: 0
}
});