saleor-dashboard/src/hooks/makeSearch.ts

58 lines
1.5 KiB
TypeScript
Raw Normal View History

2019-11-19 11:31:32 +00:00
import { DocumentNode } from "graphql";
import { useState } from "react";
2019-11-19 15:01:54 +00:00
import { QueryResult } from "react-apollo";
2019-11-19 11:31:32 +00:00
2019-11-19 15:01:54 +00:00
import makeQuery, { UseQueryResult } from "./makeQuery";
import useDebounce from "./useDebounce";
2019-11-19 11:31:32 +00:00
2019-11-19 15:01:54 +00:00
export interface SearchVariables {
2019-11-19 11:31:32 +00:00
after?: string;
first: number;
query: string;
}
2019-11-19 15:01:54 +00:00
export interface UseSearchResult<TData, TVariables extends SearchVariables> {
loadMore: () => void;
result: QueryResult<TData, TVariables>;
search: (query: string) => void;
}
export type UseSearchOpts<TVariables extends SearchVariables> = Partial<{
skip: boolean;
variables: TVariables;
}>;
export type UseSearchHook<TData, TVariables extends SearchVariables> = (
opts: UseSearchOpts<TVariables>
) => UseSearchResult<TData, TVariables>;
function makeSearch<TData, TVariables extends SearchVariables>(
2019-11-19 11:31:32 +00:00
query: DocumentNode,
loadMoreFn: (result: UseQueryResult<TData, TVariables>) => void
): UseSearchHook<TData, TVariables> {
2019-11-19 15:01:54 +00:00
const useSearchQuery = makeQuery<TData, TVariables>(query);
function useSearch(
opts: UseSearchOpts<TVariables>
): UseSearchResult<TData, TVariables> {
const [searchQuery, setSearchQuery] = useState("");
const debouncedSearch = useDebounce(setSearchQuery);
const result = useSearchQuery({
...opts,
displayLoader: true,
variables: {
...opts.variables,
query: searchQuery
}
});
return {
loadMore: () => loadMoreFn(result),
result,
search: debouncedSearch
};
}
return useSearch;
2019-11-19 11:31:32 +00:00
}
2019-11-19 15:01:54 +00:00
export default makeSearch;