blob: 99765e62e4e539eee7acce33e6f10ccf789e5703 [file] [log] [blame]
import { Outlet, useLocation, useNavigate } from 'react-router';
import { Layout, Menu, Dropdown, Button, Flex } from 'antd';
import { HomeOutlined, AppstoreOutlined, DownOutlined } from '@ant-design/icons';
import { useEffect, useMemo } from 'react';
import logo from "./assets/logo.png";
import { useAppDispatch, useAppSelector } from './store/hooks';
import { getUserInfo } from './feature/user/userSlice';
import { logout } from './feature/auth/authSlice';
const { Header } = Layout;
const AppLayout = () => {
const location = useLocation();
const navigate = useNavigate();
const userState = useAppSelector(state => state.user);
const dispatch = useAppDispatch();
useEffect(() => {
dispatch(getUserInfo())
}, [dispatch])
// 判断是否在登录、注册或找回密码页面
const isAuthPage = useMemo(() => {
return ['/login', '/register', '/forget'].includes(location.pathname);
}, [location.pathname]);
// 导航项配置
const menuItems = [
{
key: 'home',
label: '主页',
icon: <HomeOutlined />,
path: '/',
},
{
key: 'tasks',
label: '任务清单',
icon: <AppstoreOutlined />,
path: '/tasks',
},
];
// 处理登出逻辑
const handleLogout = () => {
dispatch(logout())
navigate('/login'); // 重定向到登录页
};
// 下拉菜单内容
const dropdownMenuItems = [
{
key: 'profile',
label: '个人中心',
onClick: () => navigate('/profile'),
},
{
key: 'logout',
label: '登出',
onClick: handleLogout,
},
];
return (
<Layout style={{ minHeight: '100vh', width: '100%' }}>
<Header className="header" style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
{/* logo */}
<Flex justify='center' align='center'>
<img src={logo} alt="Logo" height='48px' />
<div style={{ color: 'white', marginLeft: '10px' }}>
创驿
</div>
</Flex>
<div style={{
height: '30px',
width: '1px',
backgroundColor: 'white',
margin: '0 20px',
}}></div>
{/* 中间导航菜单 */}
<Menu
mode="horizontal"
theme="dark"
selectedKeys={[location.pathname === '/' ? 'home' : location.pathname.slice(1)]}
items={menuItems.map(item => ({
...item,
onClick: () => navigate(item.path),
}))}
style={{ flex: 1 }}
/>
{/* 右侧用户名和下拉菜单 */}
{!isAuthPage && (
<div style={{ display: 'flex', alignItems: 'center', color: 'white' }}>
<span>{userState.username}</span>
<Dropdown
trigger={['click']}
menu={{ items: dropdownMenuItems }}
>
<Button type="text" icon={<DownOutlined />} style={{ marginLeft: '10px', color: 'white' }} />
</Dropdown>
</div>
)}
</Header>
<Layout.Content style={{ padding: '24px' }}>
<Outlet />
</Layout.Content>
<Layout.Footer style={{ textAlign: 'center' }}>
© 2025 创驿 - 愿做你创作路上的同行者
</Layout.Footer>
</Layout>
);
};
export default AppLayout;