TelegramPWA/src/hooks/useAsync.ts
2023-02-28 18:43:28 +01:00

28 lines
817 B
TypeScript

import { useEffect, useState } from '../lib/teact/teact';
const useAsync = <T>(fn: () => Promise<T>, deps: any[], defaultValue?: T) => {
const [isLoading, setIsLoading] = useState<boolean>(false);
const [error, setError] = useState<Error | undefined>();
const [result, setResult] = useState<T | undefined>(defaultValue);
useEffect(() => {
setIsLoading(true);
let wasCancelled = false;
fn().then((res) => {
if (wasCancelled) return;
setIsLoading(false);
setResult(res);
}, (err) => {
if (wasCancelled) return;
setIsLoading(false);
setError(err);
});
return () => {
wasCancelled = true;
};
// eslint-disable-next-line react-hooks-static-deps/exhaustive-deps
}, deps);
return { isLoading, error, result };
};
export default useAsync;