Skip to content
Snippets Groups Projects
Commit 6c8866e5 authored by Chif Gergő's avatar Chif Gergő
Browse files

Create useRequest hook and type definitions

parent 10077ee7
Branches
No related tags found
1 merge request!7update master to dev
......@@ -11,4 +11,8 @@ module.exports = {
env: {
browser: true,
},
rules: {
'implicit-arrow-linebreak': 0,
},
};
import { AxiosPromise } from 'axios';
export interface ResponseData<T> {
isLoading: boolean;
isError: boolean;
data?: T;
}
export interface RequestArgs<T = any> {
request: ApiRequest<T>;
initialData?: T;
initialParams?: RequestParams;
}
export interface RequestParams {
body?: any;
params?: any;
args?: any;
}
export type ApiRequest<T> = (params: RequestParams) => AxiosPromise<T>;
export type Refetch = (params?: RequestParams) => void;
export interface INews {
title: string;
text: string;
publishedAt: string;
}
import { useCallback, useEffect, useState } from 'react';
import { Refetch, RequestArgs, ResponseData } from './types';
function useRequest<T = any>({
request,
initialData,
initialParams,
}: RequestArgs<T>): [ResponseData<T>, Refetch] {
const [data, setData] = useState(initialData);
const [isLoading, setIsLoading] = useState(false);
const [isError, setIsError] = useState(false);
const [fetching, setFetching] = useState(false);
const [requestParams, setRequestParams] = useState(initialParams ?? {});
const refetch = useCallback((newParams?) => {
setRequestParams(newParams ?? {});
setFetching(true);
}, []);
useEffect(() => {
const fetchData = async () => {
setIsError(false);
setIsLoading(true);
try {
const result = await request(requestParams);
setData(result.data);
} catch (error) {
setIsError(true);
}
setFetching(false);
setIsLoading(false);
};
if (fetching && !isLoading) {
fetchData();
}
}, [request, fetching, isLoading, requestParams]);
return [{ data, isLoading, isError }, refetch];
}
export default useRequest;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment