Files
payload/src/admin/hooks/usePayloadAPI.tsx
2020-11-30 14:41:53 -05:00

74 lines
1.6 KiB
TypeScript

import { useState, useEffect } from 'react';
import queryString from 'qs';
import { useLocale } from '../components/utilities/Locale';
import { requests } from '../api';
type Result = [
{
isLoading: boolean
isError: boolean
data: any
},
{
setParams: React.Dispatch<unknown>
}
]
type Options = {
initialParams?: unknown
initialData?: any
}
type UsePayloadAPI = (url: string, options?: Options) => Result;
const usePayloadAPI: UsePayloadAPI = (url, options = {}) => {
const {
initialParams = {},
initialData = {},
} = options;
const [data, setData] = useState(initialData);
const [params, setParams] = useState(initialParams);
const [isLoading, setIsLoading] = useState(true);
const [isError, setIsError] = useState(false);
const locale = useLocale();
const search = queryString.stringify({
locale,
...(typeof params === 'object' ? params : {}),
});
useEffect(() => {
const fetchData = async () => {
setIsError(false);
setIsLoading(true);
try {
const response = await requests.get(`${url}?${search}`);
if (response.status > 201) {
setIsError(true);
}
const json = await response.json();
setData(json);
setIsLoading(false);
} catch (error) {
setIsError(true);
setIsLoading(false);
}
};
if (url) {
fetchData();
} else {
setIsError(false);
setIsLoading(false);
}
}, [url, locale, search]);
return [{ data, isLoading, isError }, { setParams }];
};
export default usePayloadAPI;