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-03-13 10:24:05 +08:00
|
|
|
|
// 检查用户是否有管理权限(leader 或 admin)
|
|
|
|
|
const hasManagePermission = user && (user.role === 'leader' || user.role === 'admin');
|
|
|
|
|
|
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
|
2025-03-13 10:24:05 +08:00
|
|
|
|
className={`nav-link ${
|
|
|
|
|
isActive('/') && !isActive('/chat') && !isActive('/permissions') ? 'active' : ''
|
|
|
|
|
}`}
|
2025-03-05 03:46:45 +08:00
|
|
|
|
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-13 10:24:05 +08:00
|
|
|
|
{hasManagePermission && (
|
|
|
|
|
<li className='nav-item'>
|
|
|
|
|
<Link
|
|
|
|
|
className={`nav-link ${isActive('/permissions') ? 'active' : ''}`}
|
|
|
|
|
to='/permissions'
|
|
|
|
|
>
|
|
|
|
|
权限管理
|
|
|
|
|
</Link>
|
|
|
|
|
</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>
|
|
|
|
|
);
|
|
|
|
|
}
|