This commit is contained in:
dominik-zeglen 2019-11-19 12:31:32 +01:00
parent 9b459f70af
commit 6f2bff218f
3 changed files with 40 additions and 3 deletions

View file

@ -16,7 +16,7 @@ export interface LoadMore<TData, TVariables> {
) => Promise<ApolloQueryResult<TData>>;
}
type UseQuery<TData, TVariables> = QueryResult<TData, TVariables> &
export type UseQueryResult<TData, TVariables> = QueryResult<TData, TVariables> &
LoadMore<TData, TVariables>;
type UseQueryOpts<TData, TVariables> = Partial<{
displayLoader: boolean;
@ -26,7 +26,7 @@ type UseQueryOpts<TData, TVariables> = Partial<{
}>;
type UseQueryHook<TData, TVariables> = (
opts: UseQueryOpts<TData, TVariables>
) => UseQuery<TData, TVariables>;
) => UseQueryResult<TData, TVariables>;
function makeQuery<TData, TVariables>(
query: DocumentNode
@ -36,7 +36,7 @@ function makeQuery<TData, TVariables>(
require,
skip,
variables
}: UseQueryOpts<TData, TVariables>): UseQuery<TData, TVariables> {
}: UseQueryOpts<TData, TVariables>): UseQueryResult<TData, TVariables> {
const notify = useNotifier();
const intl = useIntl();
const [, dispatchAppState] = useAppState();

18
src/hooks/makeSearch.ts Normal file
View file

@ -0,0 +1,18 @@
import { DocumentNode } from "graphql";
import { useState } from "react";
import Debounce from "../components/Debounce";
import { UseQueryResult } from "./makeQuery";
export interface SearchQueryVariables {
after?: string;
first: number;
query: string;
}
function makeSearch<TData, TVariables extends SearchQueryVariables>(
query: DocumentNode,
loadMoreFn: (result: UseQueryResult<TData, TVariables>) => void
): UseSearchHook<TData, TVariables> {
const [searchQuery, setSearchQuery] = useState("");
}

19
src/hooks/useDebounce.ts Normal file
View file

@ -0,0 +1,19 @@
import { useEffect, useRef } from "react";
export type UseDebounceFn<T> = (...args: T[]) => void;
function useDebounce<T>(
debounceFn: UseDebounceFn<T>,
time = 200
): UseDebounceFn<T> {
const timer = useRef(null);
useEffect(() => () => clearTimeout(timer.current));
return (...args: T[]) => {
if (timer.current) {
clearTimeout(timer.current);
}
timer.current = setTimeout(() => debounceFn(...args), time);
};
}
export default useDebounce;