import {useEffect, useState} from "react"; import {checkHttpResponseStatus} from "network/checkHttpResponseStatus"; export interface LoaderState { data: T; error: null; isLoading: boolean; } export function useDataLoader(url: string, loader: () => Promise) { const [loaderState, setLoaderState] = useState>({ data: null, error: null, isLoading: false, }); useEffect(() => { setLoaderState({ data: null, error: null, isLoading: true, }); loader() .then(data => setLoaderState({ data, error: null, isLoading: false, })) .catch(error => setLoaderState({ data: null, error, isLoading: false, })); }, [url]); return loaderState; } export function useUrlDataLoader(url: string) { return useDataLoader(url, () => fetch(url).then(checkHttpResponseStatus)); }