# Arquitectura — CLUB-002 · PWA Club ## Objetivo Construir la primera experiencia frontend del Club sobre el backend ya entregado en CLUB-001: - alta/join del Club - tarjeta digital móvil - shell instalable tipo PWA ## Análisis del frontend actual - La tienda usa Next App Router en `project/frontend/src/app`. - No existe manifiesto PWA ni rutas `/club/*` todavía. - Los flujos autenticados usan proxies Next.js (`/api/auth/*`) para preservar cookies same-origin. - CLUB-001 ya expone backend suficiente para esta fase: - `GET /club/config` - `POST /club/join` - `GET /club/me` - `GET /club/movements` ## Diseño propuesto ### 1) Proxy Next dedicado para Club Añadir `project/frontend/src/app/api/club/[...path]/route.ts`. Motivo: - preservar la cookie `mdv_club` como same-origin - reenviar `set-cookie` del backend en `POST /club/join` - evitar que componentes cliente hablen directo con `NEXT_PUBLIC_API_URL` ### 2) Rutas frontend Club Crear páginas: - `/club` → landing/resumen del Club - `/club/join` → alta anónima o acceso al card si ya existe identidad Club - `/club/card` → tarjeta digital con member code, saldo y últimos movimientos ### 3) Shell móvil instalable Añadir: - `app/manifest.ts` - iconos PWA a partir del branding existente - metadatos PWA en `app/layout.tsx` (`themeColor`, `appleWebApp`, manifest) - CTA de instalación desde cliente (`beforeinstallprompt`) en la superficie Club ### 4) Estado de Club en cliente No crear aún un provider global complejo. En CLUB-002 basta con fetch puntual desde páginas/componentes Club: - `GET /api/club/config` - `POST /api/club/join` - `GET /api/club/me` - `GET /api/club/movements` Esto minimiza acoplamiento y deja abierta una futura extracción a `ClubContext` si la PWA crece. ### 5) Tarjeta digital La card mostrará: - member code - saldo actual - estado del Club - últimos movimientos - superficie visual tipo credencial móvil ### 6) Código visual de identificación CLUB-002 mostrará un identificador visual en la tarjeta usando datos ya emitidos por CLUB-001. Nota de alcance: - CLUB-003 es la fase de integración TPV/identificación en caja. - Por tanto, CLUB-002 prioriza la UX de tarjeta digital e instalación móvil. - La semántica exacta de escaneo en TPV se cerrará en CLUB-003 para no fijar prematuramente un contrato visual incompatible con caja. ## Alcance ### Sí entra - proxy Next para Club - landing/join/card frontend - manifiesto e iconos PWA - CTA de instalación - movimientos recientes y saldo en tarjeta ### No entra - earn/redeem en TPV - linking con usuario registrado - recovery codes - admin UI del Club - contrato final de lectura en caja ## Validación prevista - `cd project/frontend && npm run build` - `cd project && npm run build` - `cd project && npm run typecheck` - `./scripts/verify.sh`