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}