Documentation Index
Fetch the complete documentation index at: https://wiki.vivla.com/llms.txt
Use this file to discover all available pages before exploring further.
Autenticacion
La app implementa un sistema de autenticacion custom basado en JWT, sin depender de servicios externos como Clerk, Auth0 o Supabase. Toda la logica se concentra en el modulosrc/modules/auth/ y el cliente API en src/shared/services/api/.
Flujo de Autenticacion
- Login
- Registro
- Modo Visitor/Guest
- El usuario ingresa email y contrasena 2. Se llama a
authApi.login(email, password)3. La API devuelve:token,refreshToken,tokenExpiresIn, datos de usuario 4. Se calculatokenExpiry = Date.now() + tokenExpiresIn * 10005. Se almacenan tokens en SecureStore y datos de usuario en SecureStore 6. Se limpia el cache de tokens del API client (clearTokenCache) 7. Se actualiza elauthStoreconisAuthenticated: true8. Se identifica al usuario en PostHog analytics 9. Se inicializa la conexion a Stream Chat (no bloqueante) 10. Se invalidan todas las queries de React Query
Gestion de Tokens
Token Refresh Automatico
Cuando el access token expira, el sistema gestiona la renovacion automaticamente:Las requests que llegan durante el proceso de refresh se encolan en
requestQueue. Una vez
completado el refresh exitosamente, todas las requests encoladas se reintentan con el nuevo token.Token Caching
El API client implementa un cache de token en memoria para evitar lecturas frecuentes a SecureStore:| Parametro | Valor |
|---|---|
| Duracion del cache | 5 segundos |
| Reintentos de lectura de SecureStore | 3 intentos |
| Delay entre reintentos | 500ms (incremental: 500ms, 1000ms, 1500ms) |
API Client
El cliente HTTP (src/shared/services/api/client.ts) esta construido sobre Axios con la siguiente configuracion:
| Configuracion | Valor |
|---|---|
| Timeout | 30 segundos |
| Content-Type | application/json |
| Reintentos de SecureStore | 3 intentos, 500ms delay |
| Token cache | 5 segundos |
Interceptors
Request Interceptor
- Agrega parametro
langa la URL segun idioma actual - Cambia
baseURLa chat backend siuseChatBackend: true - Obtiene token de auth y agrega header
Authorization: Bearer <token> - Respeta
requiresAuth: falseen headers para requests publicos
Response Interceptor
- Verifica el campo
codeen la respuesta de la API - Si
code !== SUCCESS, lanzaApiError - Si
code === UNAUTHENTICATED, inicia flujo de token refresh - Para errores de red (sin response), clasifica el tipo de fallo
Manejo de Errores
El error handler (src/shared/services/api/errorHandler.ts) clasifica los errores de red en categorias:
| Tipo de Fallo | Deteccion | Ejemplo |
|---|---|---|
timeout | ECONNABORTED o mensaje contiene “timeout” | Request excede 30s |
dns_or_connectivity | Mensaje contiene “network error”, “failed to connect”, “dns” | Sin conexion a internet |
tls_or_certificate | Mensaje contiene “ssl”, “tls”, “certificate”, “handshake” | Certificado invalido |
cancelled | ERR_CANCELED o mensaje contiene “canceled” | Request cancelado por el usuario |
unknown | Ninguno de los anteriores | Error no clasificado |
Codigos de API
El sistema maneja los siguientes codigos de respuesta:| Codigo | Mensaje por defecto |
|---|---|
SUCCESS | Processed successfully |
VALIDATION_ERROR | Invalid request data |
UNAUTHENTICATED | Authentication required |
FORBIDDEN | Insufficient permissions |
NOT_FOUND | Resource not found |
SERVER_ERROR | Internal server error |
Almacenamiento Seguro
- SecureStore (expo-secure-store)
- AsyncStorage
Datos cifrados en el dispositivo:
- Access token
- Refresh token
- Token expiry
- Datos de usuario (id, email, displayName, phone)
secureStorage en src/shared/services/storage/secureStorage.ts.Pantallas de Auth
Las pantallas de autenticacion se encuentran en el grupo(auth):
| Ruta | Descripcion |
|---|---|
/login | Inicio de sesion con email y contrasena |
/reset-password | Solicitud de restablecimiento de contrasena |
/resend-password | Reenvio de contrasena |
Inicializacion de Auth
Al iniciar la app,authStore.initializeAuth() ejecuta el siguiente flujo:
- Espera a que el store se hidrate desde almacenamiento persistido
- Verifica si hay tokens en el estado hidratado
- Si hay tokens pero estan expirados, intenta refresh automatico
- Si no hay tokens en estado, busca directamente en SecureStore (fallback)
- Si encuentra tokens validos, marca
isAuthenticated: truee identifica al usuario en analytics - Si no encuentra tokens, establece estado no autenticado
La inicializacion tiene un timeout de 15 segundos. Si se excede, se fuerza el estado a no
autenticado para evitar que la app quede bloqueada.
Logout
El proceso de logout realiza las siguientes operaciones:- Llama a
authApi.logout()para invalidar tokens en el servidor - Limpia la cola de requests pendientes (
clearRequestQueue) - Reset de analytics (
analytics.reset()) - Limpia el estado del store
- Cancela y limpia todas las queries de React Query
- Desconecta y resetea el chat de Stream
- Limpia todos los datos de auth en SecureStore