Frontend: datos e integraciones
Como viajan los datos
El frontend consume principalmente informacion del backend REST y la combina con infraestructura de Firebase.
La secuencia normal es:
- la pantalla dispara una accion
- el hook de feature organiza la peticion
- el service hace la llamada HTTP
apiClientagrega headers e intercepta errores- React Query cachea o invalida segun el caso
apiClient
src/config/apiClient.ts centraliza la capa HTTP.
Sus responsabilidades principales son:
- usar
VITE_BACKEND_URL - enviar
Authorizationcuando hay sesion - inyectar
businessIdsolo cuando la ruta actual pertenece al contexto activo de negocio - mostrar feedback global
- reaccionar a errores
401y403
Contexto en requests
Requests de negocio
Cuando existe membresia activa y la ruta esta dentro del panel del negocio:
- el frontend agrega
businessId - los servicios consultan o mutan informacion de ese tenant
- si la cookie apunta a una membresia que ya no existe, el guard limpia el contexto y devuelve a seleccion
Requests globales
Cuando la persona esta en Panel de control:
- no se inyecta
businessId - la autorizacion depende de la membresia global y sus permisos
GET /auth/meentrega elglobalAccessusado por los guards y menus
Esto es clave porque Cutlyy ahora distingue entre contexto global y contexto multiempresa de negocio.
Hidratacion de sesion
Despues de que Firebase confirma sesion, el frontend llama GET /auth/me.
Esa respuesta llena:
useUserStoreuseSessionAccessStoreuseGlobalAccessStoreuseRoleStoreuseBusinessMembershipStoresi la cookiebusinessMembershipIdtodavia apunta a una membresia valida
useRefreshSessionAccess permite repetir esa hidratacion desde la seleccion de negocio para reflejar membresias recien creadas o reactivadas.
Integraciones del lado cliente
Firebase Auth
Se usa para:
- mantener la sesion primaria
- obtener el token que luego valida el backend
Firestore
Se usa para listeners en tiempo real sobre:
- membresia activa del negocio
- permisos del rol activo
Firebase Storage
Se usa en flujos de carga de imagenes y archivos asociados a perfiles o negocio.
La limpieza de archivos por URL valida el bucket contra VITE_FIREBASE_STORAGE_BUCKET. Si una URL apunta a otro bucket, el frontend evita borrarla para no eliminar recursos de otro ambiente por accidente.
Firebase Messaging
Se usa para push web cuando:
- el navegador lo soporta
- la persona otorga permisos
- la app esta instalada como PWA
- existe configuracion VAPID valida
Google Maps
Se usa sobre todo para formularios y experiencia de sedes:
- autocompletado
- ubicacion
- coordenadas
Variables de entorno esperadas
| Variable | Uso |
|---|---|
VITE_BACKEND_URL | Base URL del backend |
VITE_FIREBASE_API_KEY | Configuracion cliente de Firebase |
VITE_FIREBASE_AUTH_DOMAIN | Auth de Firebase |
VITE_FIREBASE_PROJECT_ID | Proyecto Firebase |
VITE_FIREBASE_STORAGE_BUCKET | Storage |
VITE_FIREBASE_MESSAGING_SENDER_ID | Messaging |
VITE_FIREBASE_APP_ID | App Firebase |
VITE_FIREBASE_VAPID_KEY | Push web |
VITE_GOOGLE_MAPS_API_KEY | Google Maps |
VITE_PUSH_NOTIFICATIONS_ENABLED | Feature flag de push |
Setup local minimo
npm install
npm run dev
Validaciones recomendadas antes de cerrar cambios:
npm run typecheck
npm run lint
npm run build:check
npm run build:check:dev
npm run build:check:prod
Comandos de build y deploy
Segun el package.json actual:
npm run build
npm run build:dev
npm run build:prod
npm run deploy:dev
npm run deploy:prod
deploy:dev construye con modo development y despliega hosting al proyecto barber-app-dev-c7f59. deploy:prod construye con modo prod y despliega hosting a cutlyy-prd.
Puntos de integracion sensibles
- auth y claims del token
- hidratacion de sesion via
GET /auth/me - resolucion de membresia global
- header
businessIden contexto de negocio - listeners de Firestore
- registro y limpieza de suscripciones push
- llaves de Google Maps y VAPID
- bucket correcto en cargas y borrados de Firebase Storage
Riesgos actuales
- si cambia el contrato del backend, muchos hooks dependen de esa compatibilidad
- si falla la resolucion de usuario o membresia, la sesion puede cerrarse
- el frontend hace validaciones utiles, pero la proteccion final sigue del lado del backend