File size: 777 Bytes
611bfd9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import { useEffect, useState } from 'react';
export function useAsync<T>(factory: () => Promise<T>, deps: unknown[]) {
const [data, setData] = useState<T | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
let active = true;
setLoading(true);
setError(null);
factory()
.then((result) => {
if (active) {
setData(result);
}
})
.catch((caught: Error) => {
if (active) {
setError(caught.message);
}
})
.finally(() => {
if (active) {
setLoading(false);
}
});
return () => {
active = false;
};
}, deps);
return { data, loading, error };
}
|