1
+ import React , { useEffect , useState } from "react" ;
2
+ import { useNavigate } from "react-router-dom" ;
3
+ import { Dropdown , ButtonGroup } from "react-bootstrap" ;
4
+ import { jwtDecode } from "jwt-decode" ;
5
+ import userService from "../../services/users" ;
6
+
7
+
8
+ async function getUserFromToken ( ) {
9
+ const jwtToken = sessionStorage . getItem ( 'jwt_token' ) ;
10
+ if ( jwtToken ) {
11
+ const decodedToken = jwtDecode ( jwtToken ) ;
12
+ try {
13
+ // decodedToken has an id field in auth-controller.js
14
+ // user fetched by id has a username field in user-model.js
15
+ const id = decodedToken . id ;
16
+ const user = await userService . getUser (
17
+ decodedToken . id , { headers : { Authorization : `Bearer ${ jwtToken } ` } } )
18
+ // getUser return an Object with data, message, and type
19
+ // The user data is nested in Object.data and hence we need a double .data to access it
20
+ return { id : id , username : user . data . data . username } ;
21
+ } catch ( error ) {
22
+ console . error ( error ) ;
23
+ return "No User" ;
24
+ }
25
+ }
26
+ return "No User" ;
27
+ }
28
+
29
+ function UserAvatarBox ( ) {
30
+ const navigate = useNavigate ( ) ;
31
+ const [ username , setUsername ] = useState ( "No User" ) ;
32
+
33
+ const handleLogout = ( ) => {
34
+ sessionStorage . removeItem ( 'jwt_token' ) ;
35
+ navigate ( '/login' ) ;
36
+ } ;
37
+
38
+ useEffect ( ( ) => {
39
+ async function fetchData ( ) {
40
+ const user = await getUserFromToken ( ) ;
41
+ console . log ( "User: " , user ) ;
42
+ if ( user ) {
43
+ setUsername ( user . username ) ;
44
+ console . log ( username ) ;
45
+ }
46
+ }
47
+ fetchData ( ) ;
48
+ } , [ ] ) ;
49
+
50
+ return (
51
+ < Dropdown as = { ButtonGroup } className = "m-2" >
52
+ { /* Nice to have image in the future*/ }
53
+ < Dropdown . Toggle id = "dropdown-custom-1" >
54
+ { username }
55
+ </ Dropdown . Toggle >
56
+ < Dropdown . Menu className = "super-colors" >
57
+ < Dropdown . Item eventKey = "1" onClick = { handleLogout } > Logout</ Dropdown . Item >
58
+ < Dropdown . Item eventKey = "2" onClick = { ( ) => navigate ( '/profile' ) } > Profile</ Dropdown . Item >
59
+ </ Dropdown . Menu >
60
+ </ Dropdown >
61
+ ) ;
62
+ }
63
+
64
+ export default UserAvatarBox ;
0 commit comments