import { useState, useEffect, useCallback } from 'react'; import { type ApiResponse } from '@/types/apiResponse'; // Define options for the hook interface UseApiOptions { // If true, the API call will be executed immediately on mount immediate?: boolean; } export function useApi( apiFunction: (...args: P) => Promise<{ data: T }>, options: UseApiOptions = {}, ) { const [data, setData] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const execute = useCallback( async (...args: P) => { setLoading(true); setError(null); try { const response = await apiFunction(...args); setData(response.data); } catch (err) { // TODO: can handle some common errors here, 400 and 500 errors setError(err); } finally { setLoading(false); } }, [apiFunction], ); // If the 'immediate' option is true, execute the function on mount useEffect(() => { if (options.immediate) { // We pass undefined as params for the initial call. execute(...(undefined as unknown as P)); } }, [execute, options.immediate]); return { data, loading, error, execute }; }