import React from 'react'; const load = ( fn: () => Promise, setResult: React.Dispatch>, setError: React.Dispatch>, setLoading: React.Dispatch>, ) => async () => { try { setError(undefined); setLoading(true); const result = await fn(); setResult(result); } catch (error) { setError(error); } setLoading(false); } export const useAsync = ( fn: () => Promise, deps: React.DependencyList = [], initialValue?: any, ) => { const [result, setResult] = React.useState(initialValue); const [error, setError] = React.useState(); const [loading, setLoading] = React.useState(false); const call = load(fn, setResult, setError, setLoading); React.useEffect(() => { call(); }, deps); return { loading, result, call, error, setResult } }