Skip to content

Commit 3ece31f

Browse files
committed
Add User Dropdown
Contains: - Username - route to Profile (not implemented) - logout (again)
1 parent d779f5c commit 3ece31f

File tree

5 files changed

+71
-2
lines changed

5 files changed

+71
-2
lines changed

Frontend/src/components/NavigationBar.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,22 @@ import Container from 'react-bootstrap/Container';
22
import Navbar from 'react-bootstrap/Navbar';
33
import Button from 'react-bootstrap/esm/Button';
44
import { useNavigate } from 'react-router-dom';
5+
import UserAvatarBox from "./user/userAvatarBox";
56

67
function NavigationBar() {
78
const navigate = useNavigate();
89

910
// Add log out functionality
1011
const handleLogout = () => {
12+
sessionStorage.removeItem("jwt_token");
1113
navigate("/login");
1214
}
1315

1416
return (
1517
<Navbar className='bg-light' sticky="top">
1618
<Container>
1719
<Navbar.Brand>PeerPrep</Navbar.Brand>
20+
<UserAvatarBox />
1821
<Button className="ms-auto" variant="danger" onClick={handleLogout}>
1922
Logout
2023
</Button>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// Page where users can change their profile information, including their username, email, and password.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// Profile Page that can list user accomplishments and other information
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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;

Frontend/src/services/users.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ const createUser = async (newUser) => {
99
return response;
1010
};
1111

12-
const getUser = async (id) => {
13-
const response = await axios.get(`${baseUrl}/${user}/${id}`);
12+
const getUser = async (id, jwt_token) => {
13+
const response = await axios.get(`${baseUrl}/${user}/${id}`, jwt_token);
1414
return response;
1515
};
1616

0 commit comments

Comments
 (0)