diff --git a/native/search/search-bar.react.js b/native/search/search-bar.react.js new file mode 100644 --- /dev/null +++ b/native/search/search-bar.react.js @@ -0,0 +1,110 @@ +//@flow + +import * as React from 'react'; +import { TextInput, TouchableOpacity, View } from 'react-native'; + +import SWMansionIcon from '../components/swmansion-icon.react.js'; +import { useStyles } from '../themes/colors.js'; + +type Props = { + onPressSend: (text: string) => void, + onClear: () => void, +}; + +function SearchBox(props: Props): React.Node { + const { onPressSend, onClear } = props; + + const [text, setText] = React.useState(''); + + const onEndEditing = React.useCallback( + () => onPressSend(text), + [onPressSend, text], + ); + + const onClearSearchFiled = React.useCallback(() => { + onClear(); + setText(''); + }, [onClear]); + + const styles = useStyles(unboundStyles); + + const clearButton = React.useMemo(() => { + if (text.length !== 0) { + return ( + + + + ); + } + return null; + }, [ + onClearSearchFiled, + styles.cancelButton, + styles.cancelButtonIcon, + text.length, + ]); + + return ( + + + + + + + {clearButton} + + ); +} + +const unboundStyles = { + container: { + backgroundColor: 'searchMessagesInputFieldBackground', + borderRadius: 8, + paddingHorizontal: 11, + alignItems: 'center', + flexDirection: 'row', + justifyContent: 'space-between', + }, + searchBoxTextStyle: { + color: 'listForegroundLabel', + fontSize: 16, + fontWeight: '400', + placeholderTextColor: 'searchMessagesSecondaryForeground', + marginHorizontal: 8, + marginVertical: 6, + }, + button: { + color: 'searchMessagesSecondaryForeground', + }, + cancelButton: { + backgroundColor: 'modalButton', + borderRadius: 56, + width: 18, + height: 18, + alignItems: 'center', + justifyContent: 'center', + }, + cancelButtonIcon: { + color: 'modalButtonLabel', + }, + wrapper: { + flex: 1, + }, +}; + +export default SearchBox; diff --git a/native/search/search-header.react.js b/native/search/search-header.react.js new file mode 100644 --- /dev/null +++ b/native/search/search-header.react.js @@ -0,0 +1,17 @@ +// @flow + +import invariant from 'invariant'; +import * as React from 'react'; + +import SearchBox from './search-bar.react.js'; +import { MessageSearchContext } from './search-provider.react.js'; + +function SearchHeader(): React.Node { + const searchContext = React.useContext(MessageSearchContext); + invariant(searchContext, 'searchContext should be set'); + const { setQuery, clearQuery } = searchContext; + + return ; +} + +export default SearchHeader; diff --git a/native/themes/colors.js b/native/themes/colors.js --- a/native/themes/colors.js +++ b/native/themes/colors.js @@ -95,6 +95,8 @@ messageLabel: '#0A0A0A', modalSeparator: '#CCCCCC', secondaryButtonBorder: '#FFFFFF', + searchMessagesInputFieldBackground: '#CCCCCC', + searchMessagesSecondaryForeground: '#999999', }); export type Colors = $Exact; @@ -186,6 +188,8 @@ messageLabel: '#CCCCCC', modalSeparator: '#404040', secondaryButtonBorder: '#FFFFFF', + searchMessagesInputFieldBackground: '#404040', + searchMessagesSecondaryForeground: '#808080', }); const colors = { light, dark };