You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: web/docs/03-labos/13-labo22.md
+28-47Lines changed: 28 additions & 47 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -37,7 +37,7 @@ L'objectif de cette section sera d'afficher les données de l'utilisateur côté
37
37
38
38
### 4 - Modifier la connexion
39
39
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** :
41
41
42
42
* Le pseudonyme de l'utilisateur.
43
43
* 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
46
46
47
47
### 5 - Afficher le profil
48
48
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 :
50
50
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)
52
53
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` ... :
55
55
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}`)
73
58
* Cacher toute la boîte du profil lorsque le pseudo de l'utilisateur est `null`.
74
59
60
+
<center></center>
61
+
75
62
:::note
76
63
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** !
78
65
79
66
:::
80
67
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 :
82
69
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.
87
72
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 !
92
74
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` :
94
76
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.
97
79
98
-
Désormais, le panneau du profil devrait être fonctionnel en tout temps, même si on réactualise la page :
99
-
100
-
<center></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)
108
81
109
82
## 👀 Ce qu'on ne voit pas ne nous fait pas de mal
110
83
111
84
### 6 - Cacher des éléments selon le profil
112
85
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.
114
87
115
88
<center></center>
116
89
117
90
📝 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 !)
118
91
119
92
<center></center>
120
93
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
+
:::
122
103
123
104
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.
0 commit comments