Architecture
- Stack : React Native + Expo Router v4 (file-based), NativeWind v4, TanStack Query, Zustand, expo-secure-store. Monorepo via pnpm (
node-linker=hoisted). - Auth : Supabase avec AsyncStorage ; l'application envoie un Bearer JWT vers une surface dédiée
/api/mobile/*(~47 endpoints) qui retourne des structures et des plans simplifiés. - White-label : un ThemeProvider dynamique lit le thème du tenant sur
/api/mobile/meaprès la connexion ; le branding avant connexion provient de l'endpoint public/api/mobile/tenant-branding. - Mises à jour OTA :
expo-updatesavecruntimeVersionfixé à la version du SDK ; unAppVersionGatepeut forcer la mise à jour lorsque le build installé est en dessous d'un minimum configuré.
Contenu de l'application
| Domaine | Écrans |
|---|---|
| Apprentissage | tableau de bord, cours (liste + catalogue + détail), lecteur de leçon, progression |
| Évaluation | quiz player natif, envoi de devoir |
| Tuteur | chat du tuteur IA (SSE), avatar parlant (WebView), avertissements de quarantaine/sécurité |
| Social | messages directs, forums (forum → fil → réponse), annonces, supports de cours |
| Gamification | XP/niveau/streak, badges, classement, concours, boutique de récompenses |
| Relevés | notes, certificats, notifications (liste + marquer comme lu) |
| En direct | cours en direct (WebView), calendrier |
SSO sur mobile
La route /api/auth/sso/[tenantSlug] accepte un deep link redirect=studeia://... ; le callback émet un 302 vers studeia://auth/callback#access_token=...&refresh_token=.... Un listener Linking dans le fournisseur d'auth appelle supabase.auth.setSession(), et l'écran SSO utilise une session de navigateur in-app pour que le focus retourne à l'application.
Modèle de sécurité
Les endpoints mobiles réutilisent les mêmes guards d'autorisation que le web : guards d'accès aux forums/fils, accès aux leçons (publication + prérequis + inscription), pièces jointes de devoirs dans un bucket privé avec préfixe validé, et assainissement du HTML côté serveur avant tout rendu dans une WebView (les WebViews s'exécutent avec une liste blanche d'origines stricte et le JS désactivé dans la mesure du possible).
Avatar sur mobile
L'avatar parlant s'exécute dans une WebView qui charge la même page /avatar-embed utilisée sur le web (sans modules WebRTC natifs dans Expo) ; un bridge React Native transmet les messages de contrôle.
Roadmap
iOS n'a pas encore été publié — cela nécessite un compte Apple Developer et un build EAS dédié.