Arquitectura
- Stack: React Native + Expo Router v4 (file-based), NativeWind v4, TanStack Query, Zustand, expo-secure-store. Monorepo vía pnpm (
node-linker=hoisted). - Auth: Supabase con AsyncStorage; la app envía Bearer JWT a una superficie dedicada
/api/mobile/*(~47 endpoints) que retorna shapes simplificados y planos. - White-label: un ThemeProvider dinámico lee el tema del tenant en
/api/mobile/metras el inicio de sesión; el branding pre-login viene del endpoint público/api/mobile/tenant-branding. - OTA updates:
expo-updatesconruntimeVersionvinculada a la versión de la aplicación; los cambios nativos requieren un nuevo build, mientras que el JavaScript compatible puede publicarse en el mismo runtime.AppVersionGatepuede forzar la actualización cuando el build instalado está por debajo de un mínimo configurado.
Qué incluye la app
| Área | Pantallas |
|---|---|
| Aprendizaje | dashboard, cursos (lista + catálogo + detalle), visor de lecciones, progreso |
| Evaluación | quiz player nativo, envío de assignments |
| Tutor | chat del tutor IA (SSE), avatar parlante (WebView), avisos de cuarentena/safety |
| Social | mensajes directos, foros (foro → hilo → respuesta), anuncios, materiales del curso |
| Gamificación | XP/nivel/racha, badges, leaderboard, contests, rewards shop |
| Registros | calificaciones, certificados, notificaciones (lista + marcar como leídas) |
| En vivo | clases en vivo (WebView), calendario |
SSO en móvil
La ruta /api/auth/sso/[tenantSlug] acepta un deep link redirect=studeia://...; el callback emite un 302 hacia studeia://auth/callback#access_token=...&refresh_token=.... Un listener Linking en el auth provider llama a supabase.auth.setSession(), y la pantalla de SSO usa una sesión de browser in-app para que el foco regrese a la app.
Modelo de seguridad
Los endpoints móviles reutilizan los mismos guards de autorización de la web: guards de acceso a foro/hilo, acceso a lección (publicación + prerequisito + matrícula), adjuntos de assignments en bucket privado con prefijo validado, y sanitización de HTML del lado del servidor antes de cualquier render en WebView (las WebViews se ejecutan con lista blanca de origen estricta y JS deshabilitado cuando es posible).
Avatar en móvil
El avatar parlante se ejecuta en una WebView que carga la misma página /avatar-embed utilizada en la web (sin módulos WebRTC nativos en Expo); un bridge React Native reenvía los mensajes de control.
Roadmap
iOS aún no ha sido publicado — requiere una cuenta Apple Developer y un build EAS dedicado.