import { useCallback, useEffect, useRef, useState } from "react"; import { useAppContext } from "../app"; export type RequestProps = { url: string, method: string, data: any, shouldLoad: boolean, deload?: boolean, useAuth?: boolean } export function useRequest({ url, method, data, shouldLoad, deload = false, useAuth = false }: RequestProps) { const { request } = useAppContext() const [fetching, setFetching] = useState(false) const [returnData, setReturnData] = useState(null) const [fetchCount, setFetchCount] = useState(1) const lastData = useRef(JSON.stringify(data)) const [error, setError] = useState(null) const currentFetch = useRef(0) const reload: () => void = useCallback(() => { setFetchCount(a => a + 1) }, []) useEffect(() => { const strung = JSON.stringify(data) if (strung !== lastData.current) { lastData.current = strung setFetching(false) reload() } }, [data]) useEffect(() => { if (!shouldLoad) { if (deload) setReturnData(null) } else { setFetching(false) reload() } }, [shouldLoad, deload, url, method]) useEffect(() => { if (currentFetch.current === 0) { currentFetch.current = 1 return } if (!shouldLoad || !url) { setFetching(false) if (deload) setReturnData(null) } else if (!fetching) { setError(null) currentFetch.current = currentFetch.current + 1 const fetchNum = currentFetch.current setFetching(true) //console.log('fetching', url, method, data) request(url, method, data, useAuth).then((result: any) => { if (currentFetch.current === fetchNum) { setReturnData(result) setFetching(false) } }).catch((e: Error) => { console.error(e) if (currentFetch.current === fetchNum) { setError(e.message) if (deload) setReturnData(null) setFetching(false) } }) } }, [fetchCount]) return { data: returnData, reload, fetching, error } } export default useRequest;