diff options
author | Samuel Newman <mozzius@protonmail.com> | 2024-10-01 00:53:11 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-30 16:53:11 -0500 |
commit | 2129f69fa0fdf85645fabe77f0803beb6d93f819 (patch) | |
tree | cb0c72c14951072de406dfbe5598c639f6af47d3 /src/components/forms | |
parent | b4941d8556492375ce3ce96292e00d4e21c73e5e (diff) | |
download | voidsky-2129f69fa0fdf85645fabe77f0803beb6d93f819.tar.zst |
ALF text input for generic search input (#5511)
* alf text input for generic search input * clearer ref naming * Adjust props and definition * Migrate props * Migrate props * Migrate props * Replace on search screen * rm old props --------- Co-authored-by: Eric Bailey <git@esb.lol>
Diffstat (limited to 'src/components/forms')
-rw-r--r-- | src/components/forms/SearchInput.tsx | 75 | ||||
-rw-r--r-- | src/components/forms/TextField.tsx | 2 |
2 files changed, 76 insertions, 1 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> + ) + }, +) diff --git a/src/components/forms/TextField.tsx b/src/components/forms/TextField.tsx index 21928d3df..96d3481cd 100644 --- a/src/components/forms/TextField.tsx +++ b/src/components/forms/TextField.tsx @@ -126,7 +126,7 @@ export type InputProps = Omit<TextInputProps, 'value' | 'onChangeText'> & { value?: string onChangeText?: (value: string) => void isInvalid?: boolean - inputRef?: React.RefObject<TextInput> + inputRef?: React.RefObject<TextInput> | React.ForwardedRef<TextInput> } export function createInput(Component: typeof TextInput) { |