Skip to content

Commit a287675

Browse files
Laboratoire 22
1 parent ab63787 commit a287675

File tree

2 files changed

+28
-47
lines changed

2 files changed

+28
-47
lines changed

web/docs/03-labos/13-labo22.md

Lines changed: 28 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ L'objectif de cette section sera d'afficher les données de l'utilisateur côté
3737

3838
### 4 - Modifier la connexion
3939

40-
Côté serveur, dans l'action `Login`, ajoutez deux choses dans **l'objet JSON qui contient le token** :
40+
[💡](/notes/rencontre11.2#-données-de-connexion) Côté serveur, dans l'action `Login`, ajoutez deux choses dans **l'objet JSON qui contient le token** :
4141

4242
* Le pseudonyme de l'utilisateur.
4343
* La liste de strings avec tous les rôles de l'utilisateur.
@@ -46,79 +46,60 @@ Ces deux informations ne sont pas censées être difficiles à trouver dans le c
4646

4747
### 5 - Afficher le profil
4848

49-
Côté Angular, dans le `ReviewService`, sous la requête `Login`, on va maintenant attraper ces deux nouvelles informations. Avant de faire ça, nous allons préparer des variables dans le `ReviewService` pour **stocker le pseudo et le(s) rôle(s)** de l'utilisateur présentement connecté.
49+
[💡](/notes/rencontre11.2#-données-de-connexion) Côté client, dans le **hook** `useReviewAPI`, remarquez que la requête `Login` retourne `x.data`, qui contient maintenant deux informations supplémentaires. Trouvez où la fonction `login()` est appelée dans le composant `Home`, et stockez le **pseudo** et les **rôles** à deux endroits :
5050

51-
[💡](/cours/rencontre11.1#-signal-pour-plusieurs-composants) Créez deux paires de signaux (la version composée d'un signal modifiable **privé** + un signal non-modifiable) :
51+
1. Dans les états `username` et `roles`. (Serviront pour des **affichages conditionnels**)
52+
2. Dans le stockage de session. (Permettra de faire perdurer les données si on réactualise la page)
5253

53-
* Un signal privé de type `string|null` initialisé avec la valeur `null`.
54-
* Un signal privé de type `string[]` initialisé avec un tableau vide `[]`.
54+
✍ Modifiez le HTML de `Home` ... :
5555

56-
N'oubliez pas de créer les signaux non-modifiables associés ! (Comme ça on pourra accéder à ces valeurs en dehors du service)
57-
58-
💾 Toujours dans le `ReviewService`, dans la fonction `Login()`, en plus du **token** qui est déjà stocké dans le stockage local :
59-
60-
* Stockez le pseudo de l'utilisateur **dans le stockage local** ET **dans le signal de type `string|null`**.
61-
* Stockez les rôles de l'utilisateur **dans le stockage local** ET **dans le signal de type `string[]`**.
62-
63-
:::warning
64-
65-
[💡](/cours/rencontre4.1#-sauvegarder-une-donnée-dun-autre-type-que-string) Comme la liste des rôles **n'est pas un `string`**, N'oubliez pas d'utiliser `JSON.parse(...)`.
66-
67-
:::
68-
69-
✍ Modifiez le HTML de `AppComponent` ... :
70-
71-
* Affichez le pseudo de l'utilisateur connecté à l'aide du bon signal.
72-
* Affichez les rôles de l'utilisateur connecté à l'aide du bon signal. (Pas besoin de `*ngFor`)
56+
* Affichez le pseudo de l'utilisateur connecté.
57+
* Affichez les rôles de l'utilisateur connecté. (Pas besoin de `.map()`, juste `{roles}`)
7358
* Cacher toute la boîte du profil lorsque le pseudo de l'utilisateur est `null`.
7459

60+
<center>![Profil de l'utilisateur](../../static/img/labo21/profile.png)</center>
61+
7562
:::note
7663

77-
Hélas, ce fonctionnement est brisé si on réactualise la page. Pas de panique : c'est pour ça qu'on a stocké le pseudo et les rôles dans le **stockage local** !
64+
Hélas, ce fonctionnement est brisé si on réactualise la page. Pas de panique : c'est pour ça qu'on a stocké le pseudo et les rôles dans le **stockage de session** !
7865

7966
:::
8067

81-
Ajoutez les deux fonctions suivantes dans votre `ReviewService`. Elles permettront au `AppComponent` de modifier les valeurs des signaux :
68+
Ajoutez un `useEffect()` dans `Home` pour :
8269

83-
```ts showLineNumbers
84-
setUsername(username : string | null){
85-
this.SIGNAL_DU_PSEUDO.set(username);
86-
}
70+
* Récupérer le pseudo et les rôles, qui sont dans le **stockage de session**.
71+
* Modifier les deux états appropriés pour restaurer les données identitaires.
8772

88-
setRoles(roles : string[]){
89-
this.SIGNAL_DES_ROLES.set(roles);
90-
}
91-
```
73+
Désormais, le panneau du profil devrait être fonctionnel en tout temps, même si on réactualise la page !
9274

93-
⏰ Finalement, modifiez la fonction `ngOnInit()` dans le `AppComponent` pour qu'elle :
75+
🔌 Un dernier détail important : la déconnexion ! Modifiez la fonction `logoff()` dans `Home` :
9476

95-
* Récupère le pseudo et les rôles, qui sont dans le **stockage local**.
96-
* Modifie les signaux pour indiquer le pseudo et les rôles à l'aide des deux fonctions qu'on vient d'ajouter.
77+
* Elle doit supprimer le **token**, le **pseudo** et les **rôles** du stockage de sessuib.
78+
* Elle doit réinitialiser les deux états appropriés.
9779

98-
Désormais, le panneau du profil devrait être fonctionnel en tout temps, même si on réactualise la page :
99-
100-
<center>![Profil de l'utilisateur](../../static/img/labo21/profile.png)</center>
101-
102-
🔌 Un dernier détail important : la déconnexion ! Modifiez la fonction `logout()` dans le `ReviewService` :
103-
104-
* Elle doit supprimer le **token**, le **pseudo** et les **rôles** du stockage local.
105-
* Elle doit réinitialiser les signaux avec les valeurs `null` et `[]`.
106-
107-
Assurez-vous qu'en vous déconnectant, le panneau du profil devienne invisible.
80+
Assurez-vous qu'en vous déconnectant, le panneau du profil devienne invisible. (Et qu'il le reste lorsqu'on réactualise la page)
10881

10982
## 👀 Ce qu'on ne voit pas ne nous fait pas de mal
11083

11184
### 6 - Cacher des éléments selon le profil
11285

113-
À l'aide de `*ngIf` et des **signaux** qu'on a créés, vous devrez cacher certains éléments dans la page Web.
86+
À l'aide de la forme `{ condition && élément HTML }` et des **états** qu'on a remplis, vous devrez cacher certains éléments dans la page Web.
11487

11588
<center>![Créer un review](../../static/img/labo21/studentOnly.png)</center>
11689

11790
📝 La zone pour créer un `Review` doit seulement être visible pour les utilisateurs avec le rôle `student`. (L'instruction en JavaScript `monTableau.includes(valeur)`, qui retourne un booléen, sera utile !)
11891

11992
<center>![Supprimer un review](../../static/img/labo21/authorOnly.png)</center>
12093

121-
❌ Le bouton pour supprimer un `Review` doit seulement être visible pour l'auteur du `Review` ET pour tous les `corruptedTeacher`. (Comparez le pseudo dans le signal avec le nom de l'auteur du `Review`...)
94+
❌ Le bouton pour supprimer un `Review` doit seulement être visible pour l'auteur du `Review` ET pour tous les `corruptedTeacher`. (Comparez le pseudo dans l'état avec le nom de l'auteur du `Review`...)
95+
96+
:::tip
97+
98+
> Un instant ! L'affichage des `Reviews` est dans un autre composant.
99+
100+
Ce n'est pas un problème : il y a un **Context** qui permet de partager les valeurs des états `username` et `roles` au composant `Post`.
101+
102+
:::
122103

123104
Testez avec les quatre types d'utilisateurs (aucun rôle, corruptedTeacher, student auteur et student pas auteur) si tous les éléments graphiques sont bien cachés au bon moment.
124105

web/static/files/labo22.zip

-58.3 KB
Binary file not shown.

0 commit comments

Comments
 (0)