import { DocumentNode } from "graphql"; import { useState } from "react"; import { QueryResult } from "react-apollo"; import makeQuery, { UseQueryResult } from "./makeQuery"; import useDebounce from "./useDebounce"; export interface SearchVariables { after?: string; first: number; query: string; } export interface UseSearchResult { loadMore: () => void; result: QueryResult; search: (query: string) => void; } export type UseSearchOpts = Partial<{ skip: boolean; variables: TVariables; }>; export type UseSearchHook = ( opts: UseSearchOpts ) => UseSearchResult; function makeSearch( query: DocumentNode, loadMoreFn: (result: UseQueryResult) => void ): UseSearchHook { const useSearchQuery = makeQuery(query); function useSearch( opts: UseSearchOpts ): UseSearchResult { 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; } export default makeSearch;