diff --git a/plugins/search/src/components/SearchFilter/SearchFilter.stories.tsx b/plugins/search/src/components/SearchFilter/SearchFilter.stories.tsx index d6fc70716e..dbedff8c63 100644 --- a/plugins/search/src/components/SearchFilter/SearchFilter.stories.tsx +++ b/plugins/search/src/components/SearchFilter/SearchFilter.stories.tsx @@ -56,3 +56,19 @@ export const SelectFilter = () => { ); }; + +export const AsyncSelectFilter = () => { + return ( + + { + const response = await fetch('https://swapi.dev/api/planets'); + const json: { results: Array<{ name: string }> } = + await response.json(); + return json.results.map(r => r.name); + }} + /> + + ); +}; diff --git a/plugins/search/src/components/SearchFilter/SearchFilter.tsx b/plugins/search/src/components/SearchFilter/SearchFilter.tsx index 52b03c785b..93d0bd2fd7 100644 --- a/plugins/search/src/components/SearchFilter/SearchFilter.tsx +++ b/plugins/search/src/components/SearchFilter/SearchFilter.tsx @@ -27,6 +27,7 @@ import { } from '@material-ui/core'; import { useSearch } from '../SearchContext'; +import { useAsyncFilterValues } from './hooks'; const useStyles = makeStyles({ label: { @@ -34,24 +35,29 @@ const useStyles = makeStyles({ }, }); -export type Component = { +/** + * @public + */ +export type SearchFilterComponentProps = { className?: string; name: string; + label?: string; values?: string[]; + asyncValues?: (partial: string) => Promise; + asyncDebounce?: number; defaultValue?: string[] | string | null; }; -export type Props = Component & { - component: (props: Component) => ReactElement; +/** + * @public + */ +export type SearchFilterWrapperProps = SearchFilterComponentProps & { + component: (props: SearchFilterComponentProps) => ReactElement; debug?: boolean; }; -const CheckboxFilter = ({ - className, - name, - defaultValue, - values = [], -}: Component) => { +const CheckboxFilter = (props: SearchFilterComponentProps) => { + const { className, defaultValue, label, name, values = [] } = props; const classes = useStyles(); const { filters, setFilters } = useSearch(); @@ -84,7 +90,7 @@ const CheckboxFilter = ({ fullWidth data-testid="search-checkboxfilter-next" > - {name} + {label || name} {values.map((value: string) => ( { +const SelectFilter = (props: SearchFilterComponentProps) => { + const { + asyncValues, + asyncDebounce, + className, + defaultValue, + label, + name, + values: givenValues, + } = props; const classes = useStyles(); + const { value: values = [], loading } = useAsyncFilterValues( + asyncValues, + '', + givenValues, + asyncDebounce, + ); const { filters, setFilters } = useSearch(); useEffect(() => { @@ -138,13 +154,14 @@ const SelectFilter = ({ return ( - {name} + {label || name}