Basado en el cliente HTML/JS del repo de referencia, este laboratorio moderniza el frontend con React + Vite, Redux Toolkit, Axios (con interceptores y JWT), React Router y pruebas con Vitest + Testing Library.
- Diseñar una SPA en React aplicando componetización y Redux (reducers/slices).
- Consumir APIs REST de Blueprints con Axios y manejar estados de carga/errores.
- Integrar autenticación JWT con interceptores y rutas protegidas.
- Aplicar buenas prácticas: estructura de carpetas,
.env, linters, testing, CI.
- Tener corriendo el backend de Blueprints de los Labs 3 y 4 (APIs + seguridad).
- Node.js 18+ y npm.
Ver la especificación de glosario clave, consulta las Definiciones del laboratorio.
GET /api/blueprints→ lista general o catálogo para derivar autores.GET /api/blueprints/{author}GET /api/blueprints/{author}/{name}POST /api/blueprints(requiere JWT)POST /api/auth/login→{ token }
Configura la URL base en .env.
npm install
cp .env.example .env
# edita .env con la URL del backend
npm run devAbre http://localhost:5173
Crea un archivo .env en la raíz:
VITE_API_BASE_URL=http://localhost:8080/api
Tip: en producción usa variables seguras o un reverse proxy.
blueprints-react-lab/
├─ src/
│ ├─ components/
│ ├─ features/blueprints/blueprintsSlice.js
│ ├─ pages/
│ ├─ services/apiClient.js # axios + interceptores JWT
│ ├─ store/index.js # Redux Toolkit
│ ├─ App.jsx, main.jsx, styles.css
├─ tests/
├─ .github/workflows/ci.yml
├─ index.html, package.json, vite.config.js, README.md
- Agregar un lienzo (Canvas) a la página.
- Incluir un componente
BlueprintCanvascon un identificador propio. - Definir dimensiones adecuadas (ej.
520×360) para que no ocupe toda la pantalla pero permita dibujar los planos.
- Permitir ingresar el nombre de un autor y consultar sus planos desde el backend (o mock).
- Mostrar los resultados en una tabla con las siguientes columnas:
- Nombre del plano
- Número de puntos
- Botón
Openpara abrirlo
Al hacer clic en el botón Open, debe:
- Actualizar un campo de texto con el nombre del plano actual.
- Obtener los puntos del plano correspondiente.
- Dibujar consecutivamente los segmentos de recta en el canvas y marcar cada punto.
- Implementar dos servicios con la misma interfaz:
apimock: retorna datos de prueba desde memoria.apiclient: consume el API REST real con Axios.
- La interfaz de ambos debe incluir los métodos:
getAllgetByAuthorgetByAuthorAndNamecreate
- Habilitar el cambio entre
apimockyapiclientcon una sola línea de código:- Definir un módulo
blueprintsService.jsque importe uno u otro según una variable en.env. - Ejemplo en
.env(Vite):
- Definir un módulo
VITE_USE_MOCK=trueVITE_USE_MOCK=trueusa el mock.VITE_USE_MOCK=falseusa el API real.
- El nombre del plano actual debe mostrarse en el DOM como parte del estado global (Redux).
- Evitar manipular directamente el DOM; usar componentes y props/estado.
- Agregar estilos para mejorar la presentación.
- Se puede usar Bootstrap u otro framework CSS.
- Ajustar la tabla, botones y tarjetas para acercarse al mock de referencia.
- Agregar pruebas con Vitest + Testing Library para validar:
- Render del canvas.
- Envío de formularios.
- Interacciones básicas con Redux (por ejemplo: dispatch de
fetchByAuthor).
- Para el canvas en tests con jsdom: agregar un mock de
HTMLCanvasElement.prototype.getContextentests/setup.js. - Para usar
@testing-library/jest-domcon Vitest: entests/setup.jsimportarimport '@testing-library/jest-dom'y asegurarse de que Vitest provea el globalexpect(configurarvitest.config.jscon la opcióntest: { globals: true, setupFiles: './tests/setup.js' }). - Para la conmutación de servicios en Vite, usar
import.meta.env.VITE_USE_MOCKpara leer la variable en tiempo de ejecución.
- Redux avanzado
- Agrega estados
loading/errorpor thunk y muéstralos en la UI. - Implementa memo selectors para derivar el top-5 de blueprints por cantidad de puntos.
- Agrega estados
- Rutas protegidas
- Crea un componente
<PrivateRoute>y protege la creación/edición.
- Crea un componente
- CRUD completo
- Implementa
PUT /api/blueprints/{author}/{name}yDELETE ...en el slice y en la UI. - Optimistic updates (revertir si falla).
- Implementa
- Dibujo interactivo
- Reemplaza el
svgpor un lienzo donde el usuario haga click para agregar puntos. - Botón “Guardar” que envíe el blueprint.
- Reemplaza el
- Errores y Retry
- Si
GETfalla, muestra un banner y un botón Reintentar que dispare el thunk.
- Si
- Testing
- Pruebas de
blueprintsSlice(reducers puros). - Pruebas de componentes con Testing Library (render, interacción).
- Pruebas de
- CI/Lint/Format
- Activa GitHub Actions (workflow incluido) → lint + test + build.
- Docker (opcional)
- Crea
Dockerfile(+compose) para front + backend.
- Crea
- Funcionalidad y cobertura de casos (30%)
- Calidad de código y arquitectura (Redux, componentes, servicios) (25%)
- Manejo de estado, errores, UX (15%)
- Pruebas automatizadas (15%)
- Seguridad (JWT/Interceptores/Rutas protegidas) (10%)
- CI/Lint/Format (5%)
npm run dev– servidor de desarrollo Vitenpm run build– build de producciónnpm run preview– previsualizar buildnpm run lint– ESLintnpm run format– Prettiernpm test– Vitest
- Redux Toolkit Query para caching de requests.
- MSW para mocks sin backend.
- Dark mode y diseño responsive.
Este proyecto es un punto de partida para que tus estudiantes evolucionen el cliente clásico de Blueprints a una SPA moderna con prácticas de la industria.