Mini aplicación SPA para la compra de dispositivos móviles desarrollada con React + Vite.
npm installnpm run startAbrir en el navegador:
http://localhost:5173
npm run buildnpm run previewnpm run testnpm run lintEsta aplicación implementa una SPA con dos vistas principales:
- Listado de productos obtenidos desde la API
- Filtrado en tiempo real por marca y modelo
- Navegación a detalle de producto
- Grid responsive
- Información detallada del producto
- Selección de:
- Color
- Almacenamiento
- Añadir producto al carrito
- Navegación de vuelta al listado
Base URL:
https://itx-frontend-test.onrender.com/api
Endpoints utilizados:
GET /product→ listado de productosGET /product/:productId→ detalle del productoPOST /cart→ añadir al carrito
Para garantizar la integridad de los datos provenientes de la API, se utiliza la librería Zod para validar y transformar las respuestas.
Se define un esquema base para cada producto:
const productSchema = z.object({
id: z.string(),
brand: z.string(),
model: z.string(),
price: z.string(),
imgUrl: z.string(),
});Posteriormente, se valida el array completo de productos:
export const productsSchema = z.array(z.any()).transform((items) =>
items.flatMap((item) => {
const parsed = productSchema.safeParse(item);
return parsed.success ? [parsed.data] : [];
})
);- Se utiliza
safeParsepara evitar que la app falle si un elemento es inválido - Se filtran automáticamente los productos que no cumplen el esquema
- Se evita mostrar productos corruptos o incompletos en la UI
El detalle del producto es más complejo y presenta inconsistencias en la API.
La API devuelve algunos campos como:
string→ "Yes"array→ ["Yes", "No"]
Esto obliga a normalizar los datos.
Se crea un helper reutilizable:
const toArray = z
.union([z.string(), z.array(z.string())])
.transform((val) => (Array.isArray(val) ? val : [val]));- Todos los campos se transforman a array
- Se elimina lógica condicional en la UI
- Se simplifica el renderizado de datos
Ejemplo:
"Yes" → ["Yes"]
["Yes", "No"] → ["Yes", "No"]
Se valida el body enviado al endpoint /api/cart:
export const productCartBodySchema = z.object({
id: z.string(),
colorCode: z.number(),
storageCode: z.number(),
});- Garantiza que los datos enviados al backend son correctos
- Evita errores en la petición
- Facilita el debugging
El uso de Zod permite:
- Validar datos de forma segura
- Prevenir errores en runtime
- Normalizar inconsistencias de la API
- Simplificar la lógica de la UI
Dani Velasco