Spaces:
Running
Running
Create src/hooks/useGetProducts.ts
Browse files- src/hooks/useGetProducts.ts +36 -0
src/hooks/useGetProducts.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// src/hooks/useGetProducts.ts
|
| 2 |
+
import { useQuery } from '@tanstack/react-query';
|
| 3 |
+
import { ProductListSchema, Product } from '@/lib/schemas'; // Importamos o nosso contrato Zod
|
| 4 |
+
import axios from 'axios';
|
| 5 |
+
|
| 6 |
+
// 🎯 [DECISÃO ARQUITETURAL]: O TanStack Query exige uma chave única para o cache.
|
| 7 |
+
// ['products'] é a nossa chave.
|
| 8 |
+
const PRODUCT_QUERY_KEY = ['products'];
|
| 9 |
+
|
| 10 |
+
/**
|
| 11 |
+
* Custom hook para buscar todos os produtos da Fake Store API.
|
| 12 |
+
* Gerencia o cache, loading e erros automaticamente.
|
| 13 |
+
*/
|
| 14 |
+
export const useGetProducts = () => {
|
| 15 |
+
return useQuery({
|
| 16 |
+
queryKey: PRODUCT_QUERY_KEY,
|
| 17 |
+
queryFn: async () => {
|
| 18 |
+
// 1. Fetching dos dados da API externa
|
| 19 |
+
const response = await axios.get('https://fakestoreapi.com/products');
|
| 20 |
+
|
| 21 |
+
// 2. 🔐 [SECURITY/TYPESAFE]: Validação com Zod (Parse, Don't Validate)
|
| 22 |
+
// Se a resposta da API não corresponder ao nosso ProductListSchema, o Zod
|
| 23 |
+
// lança um erro antes que os dados cheguem na UI.
|
| 24 |
+
// Isso impede que a aplicação quebre em produção com dados inválidos.
|
| 25 |
+
const parsedData = ProductListSchema.parse(response.data);
|
| 26 |
+
|
| 27 |
+
return parsedData; // Dados validados e tipados
|
| 28 |
+
},
|
| 29 |
+
// ⚡ [PERFORMANCE]: Configurações de cache do TanStack Query
|
| 30 |
+
// Stale time: O dado é considerado 'fresco' por 5 minutos (300.000ms).
|
| 31 |
+
// Enquanto for fresco, ele não busca na API de novo ao re-renderizar o componente.
|
| 32 |
+
staleTime: 1000 * 60 * 5,
|
| 33 |
+
// Cache time: O dado fica na memória por 30 minutos.
|
| 34 |
+
cacheTime: 1000 * 60 * 30,
|
| 35 |
+
});
|
| 36 |
+
};
|