Skip to content

feat: Ajout de 28 nouvelles écoles des groupes Igensia et C&D via le service Wigor#775

Open
kaelianbaudelet wants to merge 16 commits into
PapillonApp:devfrom
studentsphere-app:feat/wigor
Open

feat: Ajout de 28 nouvelles écoles des groupes Igensia et C&D via le service Wigor#775
kaelianbaudelet wants to merge 16 commits into
PapillonApp:devfrom
studentsphere-app:feat/wigor

Conversation

@kaelianbaudelet
Copy link
Copy Markdown

Contribution

Cette PR introduit le support du provider Wigor, permettant d'intégrer d'un coup 28 nouvelles écoles du supérieur issues des réseaux Igensia Éducation et Compétences & Développement sur 🦋 Papillion.

Wigor Services est un réseau d'applications développé en interne par les groupes Igensia Éducation et Compétences & Développement. Il centralise l'ensemble des ressources pédagogiques et de gestion de la vie scolaire des étudiants (emplois du temps, notes, absences, etc.) au sein d'un écosystème logiciel et accessible via un système d'authentification unique (CAS).

Règles de contribution

Caution

Afin de garantir une application stable et pérenne dans le temps, nous t'invitons à vérifier que tu as bien respecté les règles de contribution. Sans cela, ta Pull Request ne pourra pas être examinée.

  • Cette Pull Request porte sur une seule fonctionnalité ou un seul correctif.
  • Cette Pull Request n'est pas faite essentiellement avec de l'IA.
  • Pour tout changement majeur, j’ai créé une issue afin d’échanger avec les mainteneurs de Papillon sur la meilleure façon de l’intégrer.
  • Ma Pull Request respecte les conventions Conventional Commits et Conventional Branch ainsi que les conventions de codage de l'application.
  • J’ai testé mes modifications sur iOS et Android, et l’application fonctionne correctement.
  • J’emploie un langage informel, clair et concis dans mes messages.
  • J’ai documenté mes changements de manière appropriée, soit dans la description de la Pull Request, soit dans le GitBook.
  • J’ai ajouté les traductions nécessaires dans au moins un fichier de langue.

Captures d'écran

Émulateur IOS (iPhone 17 Pro Max, iOS 26.4)

Onboarding Etudiant sur IOS Onboarding Etudiant avec Wigor sur IOS Écran de sélection d'école du groupe Igensia et C&D via Wigor sur IOS Écran d'authentification pour l'école EPSI via Wigor sur IOS Écran d’accueil sur IOS Écran d'emploi du temps sur IOS Écran Comptes liés sur IOS

Émulateur Android (Google Pixel 9 Pro XL, Android 17)

Onboarding Etudiant sur Android Onboarding Etudiant avec Wigor sur Android Écran de sélection d'école du groupe Igensia et C&D via Wigor sur Android Écran d'authentification pour l'école EPSI via Wigor sur Android Écran d’accueil sur Android Écran d'emploi du temps sur Android Écran Comptes liés sur Android

Résumé des changements

Note

Cette Pull Request introduit l'intégration complète du service Wigor pour les groupes d'écoles Igensia et Compétences et Développement. Cela permet aux étudiants de 28 établissements d'accéder directement à leur emploi du temps via l'application Papillon.

Voici la liste des composants ajoutés et modifiés :

Nouveaux fichiers de service (Wigor)

  • services/wigor/refresh.ts

J'ai créé le renouvellement de session pour éviter les déconnexions en m'inspirant de services/appscho/refresh.ts

  • services/wigor/timetable.ts

J'ai codé la récupération et le parsing de l'emploi du temps en m'inspirant de services/appscho/timetable.ts

  • services/wigor/index.tsx

J'ai créé le point d'entrée principal du service Wigor en m'inspirant de services/appscho/index.ts

Flux d'onboarding spécifique

  • app/(onboarding)/services/wigor/_layout.tsx

J'ai structuré la navigation propre à Wigor en m'inspirant de app/(onboarding)/services/appscho/_layout.tsx

  • app/(onboarding)/services/wigor/list.tsx

J'ai fait l'interface pour lister les écoles de l'instance en m'inspirant de app/(onboarding)/services/appscho/list.tsx

  • app/(onboarding)/services/wigor/credentials.tsx

J'ai créé l'écran de saisie des identifiants en m'inspirant de app/(onboarding)/services/appscho/credentials.tsx

Modifications des fichiers existants (Intégration)

  • package.json

J'ai ajouté mon wrapper pour Wigor @studentsphere/linkgor comme dépendance du projet.

  • package-lock.json

  • services/shared/index.ts

J'ai enregistré le service Wigor pour l'initialiser dans le manager

  • services/shared/types.ts

J'ai rajouté Wigor aux types des plugins de services scolaires

  • stores/account/types.ts

J'ai intégré Wigor à l'énumération globale des services

  • utils/services/helper.ts

J'ai configuré l'affichage du nom de la couleur et du logo pour Wigor

  • locales/en.json

J'ai rajouté les traductions en anglais pour l'onboarding de Wigor

  • locales/fr.json

J'ai rajouté les traductions en français pour l'onboarding de Wigor

  • app/(onboarding)/_layout.tsx

J'ai configuré les chemins de navigation pour les écrans Wigor

  • app/(onboarding)/utils/constants.tsx

J'ai listé "Groupes d'écoles Igensia / C&D" dans les choix d'universités au démarrage (CF: Informations supplémentaires pour plus d'info sur la non fusion avec "Autres Universités")

Ressources graphiques


Liste complète des établissements ajoutés

L'intégration de Wigor apporte le support pour les 28 écoles du groupe Igensia et C&D.

Logo Nom de l'établissement Identifiant de l'école Fichier logo associé
École 3A 3a 3a.webp
American Business School Paris american-business-college abcp.webp
Business Science Institute business-science-institute bsi.webp
CNVA cnva cnva.webp
ECM ecm ecm.webp
EMI emi emi.webp
EPSI epsi epsi.webp
ESA esa esa.webp
ESAIL esail esail.webp
ESAM esam esam.webp
ICD Business School icd-business-school icd.webp
ICL icl icl.webp
IDRAC Business School idrac-business-school idrac.webp
IEFT ieft ieft.webp
IET iet iet.webp
IFAG ifag ifag.webp
IGEFI igefi igefi.webp
IGENSIA RH igensia-rh igensiarh.webp
IHEDREA ihedrea ihedrea.webp
ILERI ileri ileri.webp
IMIS imis imis.webp
IMSI imsi imsi.webp
IPI ipi ipi.webp
ISCPA iscpa iscpa.webp
ISMM ismm ismm.webp
SUP DE COM sup-de-com supdecom.webp
VIVA MUNDI viva-mundi vivamundi.webp
WIS wis wis.webp

Chacune de ces écoles est déclarée dans le module @studentsphere/linkgor via constants.ts.

Comment se connecter

  • Chercher son établissement scolaire
  • Rentrer ses identifiants

Capacités du service

  • Emploi du temps

Note

💡 Note d'évolution future :

L'API Wigor pour le groupe Compétences et Développement (C&D) est actuellement assez limitée en termes de fonctionnalités. Pour pallier cela à l'avenir, je réfléchis à implémenter d'autres services complémentaires (comme Edusign pour récupérer la liste des absences/présences, ou un service dédié pour les Actualités).
À l'inverse, "l'herbe est plus verte" du côté d'Igensia où le portail Wigor est plus exhaustif et propose déjà des modules comme les notes. Tout cela est encore à l'étude et fera l'objet d'évolutions futures une fois cette base solide mergée...

Informations supplémentaires

Cette PR fait suite à l'issue de feature request #774.


J'ai dû attribuer temporairement l'ID 999 à Wigor dans stores/account/types.ts au lieu de l'ID 9 initialement prévu.

Pourquoi ce changement ?
L'ID 9 est actuellement utilisé en dur dans le hook useHomeData.ts pour identifier et déconnecter automatiquement les anciens comptes qui utilisaient le service IUT de Lannion.

Si on laisse Wigor sur l'ID 9 :

  • L'application croit qu'il s'agit d'un ancien compte obsolète de IUT de Lannion.
  • Elle déclenche une déconnexion automatique systématique.
  • L'utilisateur est renvoyé de force vers l'écran principal, ce qui rend le service Wigor inutilisable pour le moment.

Solution à terme :
C'est un workaround temporaire pour permettre de tester et d'utiliser Wigor sans casser l'expérience utilisateur. J'ai ouvert une issue GitHub (#773) pour signaler ce problème. À terme, il faudra refactoriser la gestion des déconnexions pour ne plus dépendre d'IDs magiques codés en dur.

Le problème mentionné relatif à la suppression du service IUT de Lannion est décrit dans l'issue #773.


Vous remarquerez que j'ai créé un onglet séparé pour Wigor appeler "Groupes d'écoles Igensia / C&D" au lieu de le fusionner dans "Autres Universités".

En réalité, l'onglet "Autres Universités" est techniquement lié à Appscho. Pour éviter de casser l'existant avec un changement d'envergure trop risqué, j'ai préféré dupliquer temporairement la logique pour lister les 28 nouvelles écoles proprement de mon côté.

Comme discuté avec @raphckrman sur Discord via 1511873274668122142, le but à terme est d'unifier tout ça sous une vue globale avec des filtres (Universités, Écoles, IUT...). Deux options s'offrent à nous :

  • Option A : On garde ça séparé pour cette PR pour la merger rapidement, et je m'occupe du gros refactoring d'unification dans une PR de suivi juste après.
  • Option B : Si vous préférez qu'on unifie dès maintenant, dites-le moi et on planifie l'architecture ici (notamment sur la gestion du multi-service dans une seule liste).

Ressources

Cette intégration du service Wigor s’appuie sur Linkgor

IGENSIA Education
Compétences & Développement


De mon côté, j'ai essayé de faire ça le plus proprement possible ! 🫡
Pour éviter de réinventer la roue (et surtout pour éviter de faire n'importe quoi 😅), j'ai gardé le nez dans le code d'Appscho pour m'en servir de modèle pour Wigor et pour le wrapper Linkgor.

Vive Papillon ! 🦋

Copy link
Copy Markdown
Author

@kaelianbaudelet kaelianbaudelet left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai laissé plusieurs commentaires directement dans les fichiers modifiés pour justifier mes choix sur certains éléments de code un peu spécifiques. Merci d'y jeter un coup d'œil pendant votre review, cela vous permettra de mieux comprendre la logique derrière certaines implémentations ! 🙏

redirect({ pathname: './services/multi/credentials', options: { color: "#008DB0", university: "UPHF", url: "https://appmob.uphf.fr/backend" } });
},
},
{
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CF: Informations supplémentaires pour comprendre pourquoi j'ai séparé les écoles des groupes C&D et Igensia dans un onglet distinct au lieu de réunir dans "Autres Universités"

name="services/appscho"
options={{ headerShown: false, title: "" }}
/>
<Stack.Screen
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CF: Informations supplémentaires pour comprendre pourquoi j'ai séparé les écoles des groupes C&D et Igensia dans un onglet distinct au lieu de réunir dans "Autres Universités"

Comment thread locales/en.json
"ONBOARDING_REQUIRED_FIELDS": "Required fields",
"ONBOARDING_FILL_ALL_FIELDS": "Please fill in all fields",
"ONBOARDING_APPSCHO_INSTANCE_NOT_FOUND": "Instance not found",
"ONBOARDING_WIGOR_INSTANCE_NOT_FOUND": "Instance not found",
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Traduction temporaire avant fusion avec "Autres universités".
CF: Informations supplémentaires

Comment thread locales/en.json
"ONBOARDING_SERVICE_ARD": "ARD",
"ONBOARDING_SERVICE_IZLY": "Izly",
"ONBOARDING_SERVICE_ALISE": "Alise",
"ONBOARDING_SERVICE_WIGOR": "Igensia / C&D school groups",
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Traduction temporaire avant fusion avec "Autres universités".
CF: Informations supplémentaires

Comment thread locales/fr.json
"ONBOARDING_REQUIRED_FIELDS": "Champs requis",
"ONBOARDING_FILL_ALL_FIELDS": "Veuillez remplir tous les champs",
"ONBOARDING_APPSCHO_INSTANCE_NOT_FOUND": "Instance non trouvée",
"ONBOARDING_WIGOR_INSTANCE_NOT_FOUND": "Instance non trouvée",
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Traduction temporaire avant fusion avec "Autres universités".
CF: Informations supplémentaires

Comment thread stores/account/types.ts
MULTI,
ALISE,
APPSCHO,
WIGOR = 999 // TODO: supprimer le "= 999" une fois qu'une solution a été trouvée pour éviter le conflit avec l'ID 9 (LANNION) qui provoque une déconnexion automatique dans useHomeData.ts
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CF: Informations supplémentaires pour comprendre pourquoi j'ai fait cà avec l'identifiant vis à vis du problème de l'issue #773.

Comment thread utils/services/helper.ts
return require("@/assets/images/ecoledirecte.png")
case Services.ALISE:
return require("@/assets/images/alise.jpg")
case Services.WIGOR:
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ici je défini Wigor comme service pour qu'on vois bien Wigor dans l’écran "Services et cartes",

Hors-sujet PR :
J'ai constaté une petite anomalie d'affichage pour les comptes AppScho en travaillant sur Wigor. Dans la section "Services et cartes", ces comptes héritent du nom "Pronote" par défaut, le provider manquant actuellement dans le helper dédié.
Rien de bloquant pour cette PR : je formaliserai ça dans une issue GitHub distincte une fois le chantier Wigor terminé ! ^^

Comment thread utils/services/helper.ts
case Services.ALISE:
return "#108ED1"
case Services.WIGOR:
return "#1E3035"
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mis pour la forme, mais cette couleur ne sera jamais visible à l'écran

Comment thread package.json
"@sbaiahmed1/react-native-blur": "^4.2.1",
"@shopify/flash-list": "2.0.2",
"@shopify/react-native-skia": "2.4.18",
"@studentsphere/linkgor": "^1.0.3",
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

L'intégration du provider Wigor s'appuie sur le wrapper léger @studentsphere/linkgor développé pour l'occasion.

let planningPromiseCache: Promise<Lesson[]> | null = null;
let cachedPlanning: Lesson[] | null = null;
let lastFetchTime = 0;
const CACHE_TTL = 5 * 60 * 1000;
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

L'API Wigor (backend .NET/C# ws-edt-cd.wigorservices.net/Home/Get) étant particulièrement lente, avec 3 à 4 secondes de temps de réponse systématiques, les requêtes brutes à la volée ne sont pas viables. Sans mécanisme de cache, la navigation ou le simple scroll sur l'emploi du temps relançait des appels réseau toutes les secondes. En plus de surcharger leur serveur, cela provoquait de grosses "race conditions" côté interface, où les cours apparaissaient et disparaissaient de façon très instable selon l'ordre d'arrivée des requêtes en retard.

Pour résoudre ce problème, j'ai mis en place un cache en mémoire de 5 minutes couplé à un système de déduplication des promises. Du coup... Si plusieurs requêtes sont déclenchées en même temps par l'application, une seule requête réseau est réellement envoyée.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant