import { useState, useEffect, useCallback } from 'react'; type AsyncFunction = () => Promise; interface UseAsyncReturn { execute: () => Promise; data: T | null; isLoading: boolean; error: Error | null; } function useAsync(asyncFunction: AsyncFunction, immediate = true): UseAsyncReturn { const [data, setData] = useState(null); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const execute = useCallback(async () => { setIsLoading(true); setData(null); setError(null); try { const response = await asyncFunction(); setData(response); } catch (error) { if (error instanceof Error) { setError(error); } else { setError(new Error('An unknown error occurred')); } } finally { setIsLoading(false); } }, [asyncFunction]); useEffect(() => { if (immediate) { execute(); } }, [execute, immediate]); return { execute, data, isLoading, error }; } export { useAsync };