34 lines
		
	
	
		
			995 B
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			34 lines
		
	
	
		
			995 B
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import { useState, useEffect, useCallback } from 'react'; | ||
|  | import apiClient from '../api/apiClient'; | ||
|  | import { AxiosError } from 'axios'; | ||
|  | 
 | ||
|  | // T es el tipo de dato que esperamos de la API (ej. CotizacionBolsa[])
 | ||
|  | export function useApiData<T>(url: string) { | ||
|  |   const [data, setData] = useState<T | null>(null); | ||
|  |   const [loading, setLoading] = useState<boolean>(true); | ||
|  |   const [error, setError] = useState<string | null>(null); | ||
|  | 
 | ||
|  |   const fetchData = useCallback(async () => { | ||
|  |     setLoading(true); | ||
|  |     setError(null); | ||
|  |     try { | ||
|  |       const response = await apiClient.get<T>(url); | ||
|  |       setData(response.data); | ||
|  |     } catch (err) { | ||
|  |       if (err instanceof AxiosError) { | ||
|  |         setError(`Error al cargar datos: ${err.message}`); | ||
|  |       } else { | ||
|  |         setError('Ocurrió un error inesperado.'); | ||
|  |       } | ||
|  |       console.error(err); | ||
|  |     } finally { | ||
|  |       setLoading(false); | ||
|  |     } | ||
|  |   }, [url]); | ||
|  | 
 | ||
|  |   useEffect(() => { | ||
|  |     fetchData(); | ||
|  |   }, [fetchData]); | ||
|  | 
 | ||
|  |   return { data, loading, error, refetch: fetchData }; | ||
|  | } |