import { useCallback, useMemo, ReactElement } from 'react'; import { IconButton } from '../components/IconButton'; import { type TextInputProps, type TextInputElementProps, TextInput, } from '../components/TextInput'; import useControlledValue from './useControlledValue'; export interface UseSearchableProps { searchable?: boolean; onQueryChange?: (search: string) => void; query?: string; searchInputProps?: Omit; } const useSearchInputProps = (props?: Partial) => { const onChange = props?.onChangeText; const onPressClear = useCallback(() => { onChange?.(''); }, [onChange]); const right = useCallback( ({ color, forceFocus }: TextInputElementProps) => ( ), [onPressClear, props?.value], ); return useMemo( () => (props?.right === undefined ? props : { right, ...props }), [props, right], ); }; const useSearchable = ({ searchable, onQueryChange, query, searchInputProps, }: UseSearchableProps = {}): ReactElement | null => { const [value, onValueChange] = useControlledValue({ value: query || '', defaultValue: '', // to disable the useControlledValue inside TextInput onChange: onQueryChange, disabled: !searchable, }); const props = useSearchInputProps( useMemo( () => ({ ...searchInputProps, value, onChangeText: onValueChange, }), [onValueChange, searchInputProps, value], ), ); return useMemo(() => { if (!searchable || !onQueryChange) return null; return ; }, [onQueryChange, props, searchable]); }; export { useSearchInputProps }; export default useSearchable;