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 devuelve 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 previo al login proviene del endpoint público/api/mobile/tenant-branding. - OTA updates:
expo-updatesconruntimeVersionfijado en la versión del SDK; unAppVersionGatepuede 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 clase, progreso |
| Evaluación | quiz player nativo, envío de assignment |
| 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 clase (publicación + prerrequisito + matrícula), adjuntos de assignment en bucket privado con prefijo validado, y sanitización de HTML server-side antes de cualquier renderizado en WebView (las WebViews se ejecutan con origin whitelist estricta y JS deshabilitado cuando es posible).
Avatar en móvil
El avatar parlante corre en una WebView que carga la misma página /avatar-embed usada 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 cuenta Apple Developer y un build EAS dedicado.