import { useCallback, useState } from "react"; import { useDidUpdate, UseAsyncOptions } from "hooks"; /** * * @kind 07-Misc */ // eslint-disable-next-line @typescript-eslint/no-explicit-any export const useAsync = Promise>(fn: T, options?: UseAsyncOptions) => { const [status, setStatus] = useState("idle"); const [value, setValue] = useState> | null>(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(false); const execute = useCallback(() => { setStatus("pending"); setValue(null); setError(null); setLoading(true); return fn() .then((response) => { setValue(response); setStatus("success"); }) .catch((err) => { setError(err); setStatus("error"); }) .finally(() => { setLoading(false); }); }, [fn]); useDidUpdate( () => { execute(); }, [execute], !!options?.immediate, ); return { execute, status, value, error, loading }; };