-
Notifications
You must be signed in to change notification settings - Fork 332
/
Copy pathHeader.jsx
92 lines (85 loc) · 3.11 KB
/
Header.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { Navbar, Nav, Container, NavDropdown, Badge } from 'react-bootstrap';
import { FaShoppingCart, FaUser } from 'react-icons/fa';
import { useSelector, useDispatch } from 'react-redux';
import { useNavigate, Link } from 'react-router-dom';
import { useLogoutMutation } from '../slices/usersApiSlice';
import { logout } from '../slices/authSlice';
import SearchBox from './SearchBox';
import logo from '../assets/logo.png';
import { resetCart } from '../slices/cartSlice';
const Header = () => {
const { cartItems } = useSelector((state) => state.cart);
const { userInfo } = useSelector((state) => state.auth);
const dispatch = useDispatch();
const navigate = useNavigate();
const [logoutApiCall] = useLogoutMutation();
const logoutHandler = async () => {
try {
await logoutApiCall().unwrap();
dispatch(logout());
// NOTE: here we need to reset cart state for when a user logs out so the next
// user doesn't inherit the previous users cart and shipping
dispatch(resetCart());
navigate('/login');
} catch (err) {
console.error(err);
}
};
return (
<header>
<Navbar bg='primary' variant='dark' expand='lg' collapseOnSelect>
<Container>
<Navbar.Brand as={Link} to='/'>
<img src={logo} alt='ProShop' />
ProShop
</Navbar.Brand>
<Navbar.Toggle aria-controls='basic-navbar-nav' />
<Navbar.Collapse id='basic-navbar-nav'>
<Nav className='ms-auto'>
<SearchBox />
<Nav.Link as={Link} to='/cart'>
<FaShoppingCart /> Cart
{cartItems.length > 0 && (
<Badge pill bg='success' style={{ marginLeft: '5px' }}>
{cartItems.reduce((a, c) => a + c.qty, 0)}
</Badge>
)}
</Nav.Link>
{userInfo ? (
<>
<NavDropdown title={userInfo.name} id='username'>
<NavDropdown.Item as={Link} to='/profile'>
Profile
</NavDropdown.Item>
<NavDropdown.Item onClick={logoutHandler}>
Logout
</NavDropdown.Item>
</NavDropdown>
</>
) : (
<Nav.Link as={Link} to='/login'>
<FaUser /> Sign In
</Nav.Link>
)}
{/* Admin Links */}
{userInfo && userInfo.isAdmin && (
<NavDropdown title='Admin' id='adminmenu'>
<NavDropdown.Item as={Link} to='/admin/productlist'>
Products
</NavDropdown.Item>
<NavDropdown.Item as={Link} to='/admin/orderlist'>
Orders
</NavDropdown.Item>
<NavDropdown.Item as={Link} to='/admin/userlist'>
Users
</NavDropdown.Item>
</NavDropdown>
)}
</Nav>
</Navbar.Collapse>
</Container>
</Navbar>
</header>
);
};
export default Header;