parent
b5b1e4d6b7
commit
a5bb320234
1 changed files with 55 additions and 0 deletions
@ -0,0 +1,55 @@ |
|||||||
|
import { useCallback } from 'react'; |
||||||
|
|
||||||
|
import api from '../lib/api'; |
||||||
|
import handleAPIError from '../lib/handleAPIError'; |
||||||
|
import useProtectedState from './useProtectedState'; |
||||||
|
|
||||||
|
type ActiveFetchSetter<T> = (data: T) => void; |
||||||
|
|
||||||
|
type ActiveFetcher = (url?: string) => void; |
||||||
|
|
||||||
|
type ActiveFetchHookResponse = { |
||||||
|
fetch: ActiveFetcher; |
||||||
|
loading: boolean; |
||||||
|
}; |
||||||
|
|
||||||
|
const useActiveFetch = <Data>( |
||||||
|
options: { |
||||||
|
onData?: ActiveFetchSetter<Data>; |
||||||
|
onError?: (emsg: Message) => void; |
||||||
|
url?: string; |
||||||
|
} = {}, |
||||||
|
): ActiveFetchHookResponse => { |
||||||
|
const { onError, onData, url: urlPrefix = '' } = options; |
||||||
|
|
||||||
|
const [loading, setLoading] = useProtectedState<boolean>(false); |
||||||
|
|
||||||
|
const fetch = useCallback<ActiveFetcher>( |
||||||
|
(urlPostfix = '') => { |
||||||
|
const url = `${urlPrefix}${urlPostfix}`; |
||||||
|
|
||||||
|
if (!url) return; |
||||||
|
|
||||||
|
setLoading(true); |
||||||
|
|
||||||
|
api |
||||||
|
.get<Data>(url) |
||||||
|
.then(({ data }) => { |
||||||
|
onData?.call(null, data); |
||||||
|
}) |
||||||
|
.catch((error) => { |
||||||
|
const emsg = handleAPIError(error); |
||||||
|
|
||||||
|
onError?.call(null, emsg); |
||||||
|
}) |
||||||
|
.finally(() => { |
||||||
|
setLoading(false); |
||||||
|
}); |
||||||
|
}, |
||||||
|
[urlPrefix, setLoading, onError, onData], |
||||||
|
); |
||||||
|
|
||||||
|
return { fetch, loading }; |
||||||
|
}; |
||||||
|
|
||||||
|
export default useActiveFetch; |
Loading…
Reference in new issue