[f5b256e] | 1 | import React, {useEffect, useState} from 'react';
|
---|
[8ca35dc] | 2 | import { Link, useNavigate } from 'react-router-dom';
|
---|
[f5b256e] | 3 | import {jwtDecode} from "jwt-decode";
|
---|
| 4 | import axios from "axios";
|
---|
[d24f17c] | 5 |
|
---|
| 6 | const Header = () => {
|
---|
[8ca35dc] | 7 | const navigate = useNavigate();
|
---|
[f5b256e] | 8 | const [user, setUser] = useState({});
|
---|
[8ca35dc] | 9 | const isLoggedIn = localStorage.getItem('token');
|
---|
| 10 |
|
---|
| 11 | const handleLogout = () => {
|
---|
[f5b256e] | 12 | localStorage.removeItem("token");
|
---|
| 13 | localStorage.removeItem("user");
|
---|
| 14 | setUser(null);
|
---|
| 15 | navigate("/login");
|
---|
| 16 |
|
---|
[8ca35dc] | 17 | };
|
---|
| 18 |
|
---|
[f5b256e] | 19 | useEffect(() => {
|
---|
| 20 | const fetchUser = async () => {
|
---|
| 21 | try {
|
---|
| 22 | const token = localStorage.getItem("token");
|
---|
| 23 | if (!token) return;
|
---|
| 24 |
|
---|
| 25 | const storedUser = localStorage.getItem("user");
|
---|
| 26 | if (storedUser) {
|
---|
| 27 | setUser(JSON.parse(storedUser));
|
---|
| 28 | return;
|
---|
| 29 | }
|
---|
| 30 |
|
---|
| 31 | const decodedToken = jwtDecode(token);
|
---|
| 32 | const userId = decodedToken.iss;
|
---|
| 33 |
|
---|
| 34 | const { data } = await axios.get(`http://localhost:8081/api/user/${userId}`);
|
---|
| 35 | setUser(data);
|
---|
| 36 | localStorage.setItem("user", JSON.stringify(data));
|
---|
| 37 | } catch (error) {
|
---|
| 38 | console.error("Error fetching user:", error);
|
---|
| 39 | }
|
---|
| 40 | };
|
---|
| 41 | fetchUser();
|
---|
| 42 | }, [isLoggedIn]);
|
---|
| 43 |
|
---|
[d24f17c] | 44 | return (
|
---|
| 45 | <header className="header navbar navbar-expand-lg navbar-light bg-light">
|
---|
| 46 | <div className="container">
|
---|
| 47 | <button className="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
---|
| 48 | <span className="navbar-toggler-icon"></span>
|
---|
| 49 | </button>
|
---|
| 50 | <div className="collapse navbar-collapse" id="navbarNav">
|
---|
| 51 | <ul className="navbar-nav ml-auto">
|
---|
| 52 | <li className="nav-item">
|
---|
| 53 | <Link className="nav-link" to="/">Home</Link>
|
---|
| 54 | </li>
|
---|
| 55 | <li className="nav-item">
|
---|
| 56 | <Link className="nav-link" to="/restaurants">Restaurants</Link>
|
---|
| 57 | </li>
|
---|
| 58 | <li className="nav-item">
|
---|
| 59 | <Link className="nav-link" to="/reservations">Reservations</Link>
|
---|
| 60 | </li>
|
---|
[8ca35dc] | 61 | <li className="nav-item">
|
---|
| 62 | <Link className="nav-link" to="/reservations-past">Reservation history</Link>
|
---|
| 63 | </li>
|
---|
[a3d63eb] | 64 | <form className="form-inline mt-2 mt-md-0 ml-3">
|
---|
[8ca35dc] | 65 | {isLoggedIn ? (
|
---|
[f5b256e] | 66 | <button className="btn btn-outline-danger ml-3" onClick={handleLogout}>
|
---|
| 67 | Logout {user?.firstName}
|
---|
| 68 | </button>
|
---|
[8ca35dc] | 69 | ) : (
|
---|
[f5b256e] | 70 | <Link className="btn btn-outline-info ml-3" to="/login">Login</Link>
|
---|
[8ca35dc] | 71 | )}
|
---|
[a3d63eb] | 72 | </form>
|
---|
[d24f17c] | 73 | </ul>
|
---|
| 74 | </div>
|
---|
| 75 | </div>
|
---|
| 76 | </header>
|
---|
| 77 | );
|
---|
| 78 | }
|
---|
| 79 |
|
---|
[f5b256e] | 80 | export default Header; |
---|