KnowledgeBase_frontend/src/layouts/HeaderWithNav.jsx

122 lines
5.5 KiB
React
Raw Normal View History

2025-02-27 06:54:19 +08:00
import React from 'react';
2025-03-04 03:38:50 +08:00
import { useDispatch, useSelector } from 'react-redux';
2025-03-05 03:46:45 +08:00
import { Link, useNavigate, useLocation } from 'react-router-dom';
2025-03-04 03:38:50 +08:00
import { logoutThunk } from '../store/auth/auth.thunk';
2025-02-27 06:54:19 +08:00
export default function HeaderWithNav() {
2025-03-04 03:38:50 +08:00
const dispatch = useDispatch();
2025-03-04 07:22:05 +08:00
const navigate = useNavigate();
2025-03-05 03:46:45 +08:00
const location = useLocation();
2025-03-04 03:38:50 +08:00
const { user } = useSelector((state) => state.auth);
2025-03-04 07:22:05 +08:00
const handleLogout = async () => {
try {
await dispatch(logoutThunk()).unwrap();
sessionStorage.removeItem('token');
navigate('/login');
} catch (error) {}
2025-03-04 03:38:50 +08:00
};
2025-03-05 03:46:45 +08:00
// Check if the current path starts with the given path
const isActive = (path) => {
return location.pathname.startsWith(path);
};
2025-02-27 06:54:19 +08:00
return (
2025-03-05 03:46:45 +08:00
<header className=' navbar navbar-expand-lg p-0'>
<nav className='navbar navbar-expand-lg border-bottom p-3 w-100'>
2025-03-01 08:34:56 +08:00
<div className='container-fluid'>
2025-03-04 07:22:05 +08:00
<Link className='navbar-brand' to='/'>
2025-03-01 06:05:36 +08:00
OOIN 智能知识库
2025-03-04 03:38:50 +08:00
</Link>
2025-03-01 06:05:36 +08:00
<button
2025-03-01 08:34:56 +08:00
className='navbar-toggler'
2025-03-01 06:05:36 +08:00
type='button'
data-bs-toggle='collapse'
data-bs-target='#navbarText'
aria-controls='navbarText'
aria-expanded='false'
aria-label='Toggle navigation'
>
2025-03-01 08:34:56 +08:00
<span className='navbar-toggler-icon'></span>
2025-03-01 06:05:36 +08:00
</button>
2025-03-01 08:34:56 +08:00
<div className='collapse navbar-collapse' id='navbarText'>
<ul className='navbar-nav me-auto mb-lg-0'>
<li className='nav-item'>
2025-03-05 03:46:45 +08:00
<Link
className={`nav-link ${isActive('/') && !isActive('/chat') ? 'active' : ''}`}
aria-current='page'
to='/'
>
2025-03-01 06:05:36 +08:00
知识库
2025-03-04 03:38:50 +08:00
</Link>
2025-02-27 06:54:19 +08:00
</li>
2025-03-01 08:34:56 +08:00
<li className='nav-item'>
2025-03-05 03:46:45 +08:00
<Link className={`nav-link ${isActive('/chat') ? 'active' : ''}`} to='/chat'>
2025-03-01 06:05:36 +08:00
Chat
2025-03-04 03:38:50 +08:00
</Link>
2025-02-27 06:54:19 +08:00
</li>
2025-03-01 06:05:36 +08:00
</ul>
2025-03-04 03:38:50 +08:00
{!!user ? (
<div className='flex-shrink-0 dropdown'>
<a
href='#'
className='d-block link-dark text-decoration-none dropdown-toggle'
data-bs-toggle='dropdown'
aria-expanded='false'
>
2025-03-04 07:22:05 +08:00
Hi, {user.username}
2025-03-01 06:05:36 +08:00
</a>
2025-03-04 03:38:50 +08:00
<ul
className='dropdown-menu text-small shadow'
style={{
position: 'absolute',
inset: '0px 0px auto auto',
margin: '0px',
transform: 'translate(0px, 34px)',
}}
>
2025-03-04 07:22:05 +08:00
{/* <li>
2025-03-04 03:38:50 +08:00
<Link className='dropdown-item' to='#'>
Settings
</Link>
2025-03-04 07:22:05 +08:00
</li> */}
{/* <li>
2025-03-04 03:38:50 +08:00
<Link className='dropdown-item' to='#'>
Profile
</Link>
2025-03-04 07:22:05 +08:00
</li> */}
2025-03-04 03:38:50 +08:00
<li>
<hr className='dropdown-divider' />
</li>
<li>
<Link className='dropdown-item' to='#' onClick={handleLogout}>
Sign out
</Link>
</li>
</ul>
</div>
) : (
<>
<hr className='d-lg-none' />
<ul className='navbar-nav mb-2 mb-lg-0'>
<li className='nav-item'>
<Link className='nav-link text-dark' to='/login'>
Log in
</Link>
</li>
<li className='nav-item'>
<Link className='nav-link text-dark' to='/signup'>
Sign up
</Link>
</li>
</ul>
</>
)}
2025-03-01 06:05:36 +08:00
</div>
2025-02-27 06:54:19 +08:00
</div>
2025-03-01 06:05:36 +08:00
</nav>
2025-02-27 06:54:19 +08:00
</header>
);
}