Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

💡 [Feat: Idée] Ajout d'un support pour le "multi-service" #564

Open
wants to merge 116 commits into
base: main
Choose a base branch
from

Conversation

camarm-dev
Copy link
Member

@camarm-dev camarm-dev commented Jan 3, 2025

🚀 Nouvelle Pull Request

Dans cette PR, je propose une nouvelle fonctionnalité avancée pour Papillon , qui est de rassembler plusieurs services scolaires connectés en "espaces / environnements", où chaque fonctionnalité utilise un service précis...

Mais à quoi ça sert ?

Pour ceux qui se posent la question, cela permet de rassembler les différents services que peuvent utiliser les universités ou établissement, en un espace unifié. Par exemple, dans mon cas, la gestion des notes, devoirs, edt, ect passe par pronote, tandis que les actualités et la messagerie ne sont disponibles que sur skolengo. Ainsi, en me créant un espace je pourrai rassembler toute ma vie scolaire dans un seul environnement Papillon.

Comment ça fonctionne ?

Cf, screen

Un "espace" donc, est géré comme un compte principal (PrimaryAccount) par Papillon. Il dispose de ses propres paramètres, de son propre profil utilisateur ect... Sa particularitée est la nouvelle clé associatedAccountsLocalIDs, qui contient les identifiants locaux des comptes liés à cet espace. Aussi, j'ai créé un nouveau store (useMultiService) pour y stocker les espaces créé, et pour chaque fonctionnalité d'un espace, l'identifiant du compte à utiliser.

Ensuite, pour chaque fonctionnalité dans le dossier services, on ajoute un cas pour le compte MultiService, et on redirige vers le compte à utiliser:

case AccountService.PapillonMultiService: {
  const service = getFeatureAccount(MultiServiceFeature.Grades, account.localID);
  if (!service) {
    throw new Error("No service set in multi-service space");
  }
  return await updateGradesAndAveragesInCache(service, periodName);
}

Et donc on a la possibilité de créer le nombre d'espaces que l'on souhaite (cf screens)

Informations importantes

Si vous trouvez cette fonctionnalité intéressante, il faudrait m'aider à réorganiser l'interface (nottament la sélection des services, qui est un peu moche), donc il faudra voir avec les designers.

J'ai aussi du créé une image par défaut pour les espaces (pour ne pas les confondre avec des comptes classiques, et aussi pour qu'ils possèdent une icone propre au lancement de l'app: cf screen)

N'hésitez pas à me demander du contexte supplémentaire (sur discord ce serait plus pratique) ! Merci !

Screenshots / assets

Image Description
Default img Image du compte par défaut (c'est juste une icon lucide avec les même couleurs que l'image de profil...)
image Paramètres: nouveau bouton pour les paramètres du multi-service
image Paramètres du multi-service: activer / nouvel espace / espaces existants
image Paramètre d'un espace (1)
image Paramètre d'un espace (2)
image Paramètre d'un espace (3)
image Page de sélection des comptes

Checklist d'avant pull request

Veuillez cocher toutes les cases applicables en remplaçant [ ] par [x].

  • Vous avez testé de build le projet avec vos modifications et ce build a réussi
  • Vous respectez les conventions de codage et de nommage du projet
  • Vous utilisez la tabulation pour l'indentation afin de maintenir un code lisible
  • Cette pull request n'est pas un duplicata d'une autre
  • Cette pull request est prête à être revue (review) et fusionnée (merge)
  • Il n'y a pas de TODO (aka des annotations pour du code manquant) dans vos modifications
  • Il n'y a pas d'erreurs de langue dans votre code (grammaire, vocabulaire, conjugaison, orthographe)
  • Les détails des changements ont été décrits ci-dessous
  • Cette pull-request n'est pas une "breaking-change" (des modifications qui vont entraîner la modification du fonctionnement de certaines fonctionnalités déjà existantes)

Changelogs proposés

  • Ajout d'un nouveau type de compte (src/stores/account/types.ts)
    • Ajout d'un comportement particulier pour les espaces dans la fonction switchTo (src/stores/account/types.ts)
    • Modifications dans src/views/settings/SettingsExternalServices.tsx pour résoudre les erreurs dues au nouveau type
  • Ajout d'un nouveau store pour les espaces (src/stores/multiService)
  • Création d'utilitaires pour le multi-service: src/utils/multiservice
  • Ajout de la photo par défaut des comptes multiservices: src/utils/ui/default-profile-picture.ts (& assets/images/multiservice.png)
  • Ajout de deux pages de paramètres pour les espaces (src/views/settings/SettingsMultiService.tsx & src/views/settings/SettingsMultiServiceSpace.tsx)
    • Ajout des routes & de leur types: src/router/screens/settings/index.ts src/router/helpers/types.ts
    • Ajout / modification de composants: src/components/Settings/MultiServiceContainerCard.tsx, src/components/News/Beta.tsx & src/components/Global/AccountItem.tsx
    • Modification de src/view/settings/Settings.tsx pour ajouter l'onglet dans les paramètres
  • Implémentation des espaces multi services pour les différentes fonctionnalités: src/services
  • Modification de l'affichage des comptes, pour afficher le nom de l'espace (src/components/Home/AccountSwitcherContextMenu.tsx)

Ce qu'il reste à faire

  • Support dans reload-account.ts
    • C'est inutile car le reload est appelé que pendant le switchTo, et un cas spécial a été créé dans le switchTo
  • Résoudre le problème de key dans SettingsMultiServiceSpace.tsx
  • Supprimer le compte de l'espace quand un compte lié est déconnecté
    • Supprimer l'espace si il est le seul compte restant (c'est une sorte de groupe de compte, donc il ne sert plus à rien)

Informations supplémentaires

Chaque espace, possède un identifiant unique, qui est l'identifiant du compte de cet espace, et que l'on retrouve aussi dans l'objet qui réprésente l'envrionnement (stocké dans useMultiService).

J'ai du modifier la fonction switchTo pour ajouter un cas particulier pour les espace (comptes AccountService.PapillonMultiService):

  • Cela permet de recharger les comptes liés à cet espace (associatedAccountsLocalIDs)
  • Cela défini aussi "en dur" la valeur de instance du compte; par défaut instance est null (et jamais modifié, puisque ce n'est pas réellement un service) mais cette valeur sert à déterminer à plusieurs endroits si le compte a terminé son chargement: switchTo défini donc instance à une chaine de caractères non-nulle pour éviter les icones de chargement infini.

@Gabriel29306
Copy link
Contributor

Salut,
tu penses que tu en ai où sur l'implémentation ?
Il te reste beaucoup à faire ?

(PS: ajoute ma mention quand tu réponds, sinon je ne verrais pas)

@camarm-dev
Copy link
Member Author

@Gabriel29306

Salut, tu penses que tu en ai où sur l'implémentation ? Il te reste beaucoup à faire ?

Hey, je suis désolé j'ai pas donné beaucoup de news, les semaines s'enchainent vite en ce moment... J'ai justement pull les derniers changements de main en milieu de semaine, et j'ai résolu le typecheck hier soir (j'ai pas encore push). Je compte reprendre le travail ce soir. J'espère ne pas rencontrer trop de problèmes...

Pour ce qu'il me reste à faire, à part un peu d'UI, c'est de régler et comprendre un peu mieux le soucis des instances, pour être sur de ne pas les casser...

Quand tout sera prêt je demanderai les reviews de toute manière 👍🏻

@camarm-dev
Copy link
Member Author

Bon ducoup j'ai réussi à me remettre dedans et à tester les changements que j'ai fait il y a quelque temps déjà... Pour régler les erreurs d'instance, j'ai juste pris soin de sauvegarder l'objet authentication à chaque fois qu'il est modifié et ça semble avoir résolu les problèmes... (c'est une modification que j'ai faite y'a 3 semaines mais que je n'avais pas pu tester)

Au passage, j'ai fix le ts comme à mon habitude ! J'ai aussi passer le workflow du typecheck sur npm (il utilisait pnpm)

Si vous voulez retester allez-y !

@camarm-dev camarm-dev marked this pull request as ready for review February 2, 2025 18:18
@Kgeek33
Copy link
Contributor

Kgeek33 commented Feb 2, 2025

tu peux redemander ma review stp avant que j'oublie stp ? 😂

@codeuriii
Copy link
Contributor

J'ai hate que ce soit dans une version apk de papillon !!

Copy link
Contributor

@Kgeek33 Kgeek33 left a comment

Choose a reason for hiding this comment

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

Alors, c'est parfait et je ne rencontre plus aucun problème !! Bravo pour cette intégration, peut-être 2 points à souligner mais peu dérangeant :

  1. Il serait intéressant d'indiquer à l'utilisateur quand il n'a pas défini un compte sur une page plutôt qu'un chargement infini
  2. J'ai remarqué que la photo de profil et la couleur de l'app se réinitialisait

Copy link
Contributor

@Kgeek33 Kgeek33 left a comment

Choose a reason for hiding this comment

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

Mince, je voulais approuver, déso 😅

@codeuriii
Copy link
Contributor

Est ce que on peut mettre la connection automatique sur tel ou tel "truc comme Éclat" je sais pas comment ça s'appelle

@TinAD17tin
Copy link
Contributor

Est ce que on peut mettre la connection automatique sur tel ou tel "truc comme Éclat" je sais pas comment ça s'appelle

#454

@codeuriii
Copy link
Contributor

Et ? C'est pas une pr c'est une issue et j'ai vu (j'ai commenté)

@Kgeek33
Copy link
Contributor

Kgeek33 commented Feb 4, 2025

j'pense qu'il serait mieux de faire la connexion automatique dans une autre pr pask celle là est déjà assez complète et complexe à review

@camarm-dev
Copy link
Member Author

1. Il serait intéressant d'indiquer à l'utilisateur quand il n'a pas défini un compte sur une page plutôt qu'un chargement infini

Why not faudrait que je regarde, normalement c'est pas sensé charger dans le vide mais juste charger et rien afficher (c'est un bug inhérent à certaines implem de feature je pense).

2. J'ai remarqué que la photo de profil et la couleur de l'app se réinitialisait

Ça m'est arrivé aussi je sais pas pourquoi... J'ai rien trouvé de concret pour l'instant, mais c'est pas un bug qui avait été remonté (la pdp qui se réinitialise sur l'icone du service par défaut) ?

Merci d'avoir testé et review en tout cas 👍🏻

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.

9 participants