diff options
Diffstat (limited to 'src/components/forms/SearchInput.tsx')
-rw-r--r-- | src/components/forms/SearchInput.tsx | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/components/forms/SearchInput.tsx b/src/components/forms/SearchInput.tsx new file mode 100644 index 000000000..30791d005 --- /dev/null +++ b/src/components/forms/SearchInput.tsx @@ -0,0 +1,75 @@ +import React from 'react' +import {TextInput, View} from 'react-native' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {HITSLOP_10} from '#/lib/constants' +import {isNative} from '#/platform/detection' +import {atoms as a, useTheme} from '#/alf' +import {Button, ButtonIcon} from '#/components/Button' +import * as TextField from '#/components/forms/TextField' +import {MagnifyingGlass2_Stroke2_Corner0_Rounded as MagnifyingGlassIcon} from '#/components/icons/MagnifyingGlass2' +import {TimesLarge_Stroke2_Corner0_Rounded as X} from '#/components/icons/Times' + +type SearchInputProps = Omit<TextField.InputProps, 'label'> & { + label?: TextField.InputProps['label'] + /** + * Called when the user presses the (X) button + */ + onClearText?: () => void +} + +export const SearchInput = React.forwardRef<TextInput, SearchInputProps>( + function SearchInput({value, label, onClearText, ...rest}, ref) { + const t = useTheme() + const {_} = useLingui() + + return ( + <View style={[a.w_full, a.relative]}> + <TextField.Root> + <TextField.Icon icon={MagnifyingGlassIcon} /> + <TextField.Input + inputRef={ref} + label={label || _(msg`Search`)} + value={value} + placeholder={_(msg`Search`)} + returnKeyType="search" + keyboardAppearance={t.scheme} + selectTextOnFocus={isNative} + autoFocus={false} + accessibilityRole="search" + autoCorrect={false} + autoComplete="off" + autoCapitalize="none" + {...rest} + /> + </TextField.Root> + + {value && value.length > 0 && ( + <View + style={[ + a.absolute, + a.z_10, + a.my_auto, + a.inset_0, + a.justify_center, + a.pr_sm, + {left: 'auto'}, + ]}> + <Button + testID="searchTextInputClearBtn" + onPress={onClearText} + label={_(msg`Clear search query`)} + hitSlop={HITSLOP_10} + size="tiny" + shape="round" + variant="ghost" + color="secondary"> + <ButtonIcon icon={X} size="xs" /> + </Button> + </View> + )} + </View> + ) + }, +) |