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 simplifiées et des plans. - White-label : un ThemeProvider dynamique lit le thème du tenant depuis
/api/mobile/meaprès la connexion ; le branding pré-connexion provient de l'endpoint public/api/mobile/tenant-branding. - Mises à jour OTA :
expo-updatesavecruntimeVersionliée à la version de l'application ; les changements natifs exigent un nouveau build, tandis que le JavaScript compatible peut être publié sur le même runtime.AppVersionGatepeut forcer la mise à jour lorsque le build installé est en dessous d'un minimum configuré.
Contenu de l'application
| Zone | Écrans |
|---|---|
| Apprentissage | tableau de bord, cours (liste + catalogue + détail), visionneuse 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 | messagerie directe, forums (forum → fil → réponse), annonces, ressources de cours |
| Gamification | XP/niveau/série, 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 une redirection 302 vers studeia://auth/callback#access_token=...&refresh_token=.... Un listener Linking dans le fournisseur d'authentification appelle supabase.auth.setSession(), et l'écran SSO utilise une session de navigateur in-app pour que le focus revienne à l'application.
Modèle de sécurité
Les endpoints mobiles réutilisent les mêmes guards d'autorisation que la version web : guards d'accès aux forums/fils, accès aux leçons (publication + prérequis + inscription), pièces jointes de devoir 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 JavaScript désactivé lorsque c'est 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é.