# Documentación del Frontend Este documento describe la arquitectura, las rutas, los estados, los hooks y los componentes principales del frontend React + TypeScript ubicado en `frontend/`. --- ## 1. Visión general El frontend está construido con: - React 19 - TypeScript - Vite - React Router DOM - Zustand para estado global - @tanstack/react-query para consultas asíncronas - Tailwind CSS para estilos - Arquitectura basada en características (`features`) La carpeta principal de la aplicación es `frontend/src`. --- ## 2. Estructura de carpetas clave - `src/main.tsx` - punto de entrada, configuración de router y React Query - `src/App.tsx` - rutas principales de la aplicación - `src/store` - estado global con Zustand - `src/api` - cliente y funciones de API centralizadas - `src/hooks` - hooks reutilizables del frontend - `src/features` - features organizadas por dominio - `src/utils` - utilidades compartidas - `src/types.ts` - tipos globales de la aplicación --- ## 3. Rutas principales `src/App.tsx` define las rutas: - `/` → `RoomSetup` - `/visualizer` → `RoomVisualizer` - `/settings` → `SettingsPage` - `*` → redirección a `/` --- ## 4. Estado global (Zustand) `src/store/useAppStore.ts` almacena: - `previewImage` - URL de la imagen cargada - `uploadMessage` - estado de mensaje de subida - `openProductId` - producto seleccionado en `RoomVisualizer` - `viewMode` - vista actual de productos en el visualizador (`grid` o `list`) Funciones disponibles: - `setPreviewImage` - `setUploadMessage` - `setOpenProductId` - `setViewMode` - `reset` --- ## 5. Cliente API centralizado `src/api/client.ts` incluye: - `DEV_API_BASE` y `API_BASE` para la URL del backend - `getApiBase` / `buildApiUrl` para construir endpoints - `fetchClientConfig` para obtener configuración de cliente - `uploadRoomImage` para subir imágenes al servidor - `startSession` para iniciar una sesión remota Esta capa permite mantener la URL del backend en un solo lugar y soportar un token de desarrollo automático. --- ## 6. Hooks compartidos ### `src/hooks/useUploadImage.ts` - Maneja la subida de imágenes al backend - Controla `isUploading` y `uploadError` - Envuelve `uploadRoomImage` del cliente API --- ## 7. Tipos globales `src/types.ts` declara tipos comunes como: - `ClientData` - `RouteItem` - `Product` El tipo `Product` se usa en el visualizador para productos de catálogo. --- ## 8. Feature: Room Setup ### Archivos - `src/features/roomSetup/RoomSetup.tsx` - `src/features/roomSetup/roomSetupHooks.ts` - `src/features/roomSetup/RoomSetupComponents.tsx` - `src/data/roomSetupData.ts` ### Comportamiento `RoomSetup` es la página principal donde el usuario puede: - subir una imagen arrastrando o seleccionando archivo - ver una vista previa de la imagen - iniciar la navegación hacia el visualizador - ver habitaciones de demostración filtrables ### `useRoomSetup` Este hook abstrae toda la lógica de: - drag & drop - selección de archivos - subida de imagen - gestión de estados de carga - navegación con `useNavigate` ### Componentes auxiliares - `FilterButton` - botón de filtrado por categoría - `RoomCard` - tarjeta de habitación de demostración --- ## 9. Feature: Room Visualizer ### Archivos - `src/features/roomVisualizer/RoomVisualizer.tsx` - `src/features/roomVisualizer/roomVisualizerHooks.ts` - `src/features/roomVisualizer/roomVisualizerData.ts` - `src/features/roomVisualizer/ProductCards.tsx` ### Comportamiento `RoomVisualizer` muestra: - la imagen subida por el usuario - controles de zoom y arrastre de la imagen - lista / grid de productos para aplicar en la habitación - selección de producto y detalles asociados ### `useRoomVisualizer` Extrae la lógica de visualización de productos: - modo de vista (`grid` / `list`) - búsqueda y filtros básicos - producto seleccionado - manejo de selección de producto - agrupación en chunks para renderizar grillas ### Datos de productos - `roomVisualizerData.ts` contiene el catálogo de productos estáticos usados en la vista. ### Componentes - `ProductGroupCard` - renderiza un grupo de 3 productos en grid - `IndividualProductCard` - renderiza un producto en modo lista --- ## 10. Feature: Settings ### Archivo - `src/features/settings/SettingsPage.tsx` ### Comportamiento La página de configuración permite al usuario: - definir la URL base de la API - activar / desactivar la lista de rutas en el viewer - definir token de desarrollo automático ### Soporte de almacenamiento `src/utils/settings.ts` gestiona: - carga de `localStorage` - guardado de configuración - valores por defecto --- ## 11. Componentes comunes - `src/components/ui/LoadingScreen.tsx` - pantalla de carga reutilizable --- ## 12. Flujo principal de la app 1. Usuario entra en `/` 2. Sube una imagen en `RoomSetup` 3. Se crea una vista previa y se almacena en Zustand 4. Se navega a `/visualizer` 5. `RoomVisualizer` usa la imagen y muestra productos 6. El usuario filtra, busca y selecciona productos 7. `SettingsPage` permite ajustar la API y opciones de la app --- ## 13. Cómo ejecutar el frontend Desde `frontend/`: ```bash npm install npm run dev ``` Construcción de producción: ```bash npm run build ``` --- ## 14. Posibles mejoras futuras - mover `roomVisualizerProducts` a una API real o servicio de datos - extraer más componentes presentacionales del visualizador - usar React Query para cargar configuración del cliente en lugar de gestión manual - añadir tests unitarios para hooks y componentes - normalizar rutas y nombres de features --- ## 15. Observaciones adicionales - La base API se controla desde `VITE_API_BASE_URL` o `DEV_API_BASE` en desarrollo. - La aplicación usa `queryClient` de React Query, aunque hoy solo se usa para potenciales fetches futuros. - El estado global es ligero y se usa principalmente para compartir imagen previa, modo de vista y selección de producto.