Skip to content

IronPTSolutions/react-context-and-msw-lab

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

React Context & MSW Lab

En este laboratorio construirás un mini-clon de Twitter que funciona completamente en local: no hay backend real. El servidor está simulado con Mock Service Worker (MSW) directamente en el navegador.

Al terminar tendrás:

  • Un mock de API para mensajes funcionando en el navegador.
  • Un contexto de React que centraliza el estado y las operaciones de mensajes.
  • Un listado y un formulario de creación que consumen ese contexto.

Estructura objetivo

src/
  contexts/
    messages-context.jsx
  mock/
    index.js
  pages/
    home-page.jsx
  components/
    messages-list.jsx
    message-item.jsx
    message-form.jsx
  services/
    messages-service.js
  App.jsx
  main.jsx

Iteración 1 — Integrar MSW

MSW intercepta peticiones HTTP desde un Service Worker registrado en el navegador. Para ello necesita un fichero estático accesible en la raíz del dominio.

Pasos:

  1. Instala la librería. Recuerda que MSW va en dependencies (no devDependencies) porque el worker corre en el navegador.

  2. Inicializa el Service Worker en la carpeta public/:

    npx msw init public/ --save

    Esto genera public/mockServiceWorker.js. No lo modifiques.

  3. Crea src/mock/index.js. Usa setupWorker de msw/browser para crear el worker. De momento puedes inicializarlo sin handlers.

  4. En src/main.jsx, llama a worker.start() antes de montar React. worker.start() devuelve una promesa; monta la app en el .then().

    Tip: usa la opción { onUnhandledRequest: 'warn' } para que MSW avise en consola cuando reciba una petición sin handler.

Verificación: al arrancar con npm run dev deberías ver en la consola del navegador:

[MSW] Mocking enabled.

Iteración 2 — Configurar React Router

  1. Instala react-router.

  2. Envuelve la app con BrowserRouter en main.jsx.

  3. Crea src/pages/home-page.jsx que renderice un <h1>Hello world</h1>.

  4. Configura App.jsx para usar Routes y Route apuntando / a HomePage.

Verificación: navega a http://localhost:5173 y comprueba que ves el Hello world.


Iteración 3 — Servicio de mensajes

  1. Instala axios.

  2. Crea src/services/messages-service.js con una instancia de axios. La baseURL debe ser https://api.messages.org — el mismo dominio que configuraremos en MSW.

  3. Expón dos funciones: una para obtener todos los mensajes (GET /messages) y otra para crear uno nuevo (POST /messages).

Tip: usa axios.create({ baseURL: '...' }) para que todas las peticiones del servicio compartan la URL base.


Iteración 4 — Mock de GET /messages y contexto

Mock

En src/mock/index.js añade un handler para GET /messages:

  • Mantén un array messages en memoria (fuera del handler) que actúe como base de datos.
  • Inicialízalo con al menos un mensaje de ejemplo: { id: '<uuid>', text: 'Hello world' }.
  • Usa crypto.randomUUID() para generar ids.
  • El handler debe devolver ese array como JSON.

Tip: importa http y HttpResponse desde msw. Un handler de GET tiene la forma http.get(url, () => HttpResponse.json(...)).

Contexto

Aquí es donde vive el estado de los mensajes. Crea src/contexts/messages-context.jsx con un MessagesContextProvider que:

  • Guarde el array de mensajes en estado con useState.
  • Al montarse, llame al servicio para cargar los mensajes del mock usando useEffect.
  • Exponga a sus hijos, a través del valor del contexto, los mensajes y todo lo necesario para operarlos.

Añade el provider en main.jsx envolviendo la app.

Tip: crea un hook useMessages que encapsule el useContext para que los componentes no necesiten importar el contexto directamente.

Componentes

  • message-item.jsx: recibe un message por props y pinta su texto.
  • messages-list.jsx: consume el contexto con useMessages para obtener los mensajes y renderiza un MessageItem por cada uno.

Añade MessagesList a HomePage.

Verificación: recarga y comprueba que aparece el mensaje "Hello world" en la lista.


Iteración 5 — Mock de POST /messages y formulario

Mock

Añade un handler para POST /messages en src/mock/index.js:

  • Lee el cuerpo de la petición con await request.json().
  • Asigna un id con crypto.randomUUID().
  • Añade el mensaje al array messages (el mismo del GET, ya que vive en el mismo módulo).
  • Devuelve el nuevo mensaje con status 201.

Contexto

El formulario no debe llamar al servicio directamente. En su lugar, el contexto debe exponer una función createMessage que:

  • Llame al servicio.
  • Actualice el estado interno con el mensaje devuelto por el mock.

De esta forma los componentes solo hablan con el contexto, nunca con el servicio.

Componente

  1. Instala react-hook-form.

  2. Crea src/components/message-form.jsx con un input de texto y un botón de envío.

  3. Al hacer submit, usa la función createMessage del contexto (vía useMessages) para crear el mensaje.

Tip: al recibir la respuesta del mock ya no necesitas volver a llamar al GET: añade directamente el mensaje devuelto al array en el estado del contexto.

Verificación: escribe un mensaje, envíalo y comprueba que aparece en la lista al instante sin recargar la página.


Flujo completo esperado

  1. La app carga y el contexto llama al mock para obtener los mensajes iniciales.
  2. MessagesList los pinta leyendo el contexto.
  3. MessageForm llama a createMessage del contexto al enviar el formulario.
  4. El contexto llama al servicio, recibe el mensaje creado y actualiza el estado.
  5. MessagesList se re-renderiza automáticamente con el nuevo mensaje.

Bonus

  • Persiste los mensajes en localStorage dentro del mock para que sobrevivan a recargas de página.
  • Añade una función deleteMessage en el contexto y un botón de borrado en MessageItem. Implementa el mock de DELETE /messages/:id.
  • Muestra un indicador de carga (isLoading) mientras el contexto espera la respuesta del mock.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors