Files
xiaoxia-saas/apps/web/src/components/layout/Header.tsx
T
Xiaoxia AI 2cda8dec39
Deploy / Deploy Staging (push) Failing after 9s
Deploy / Deploy Production (push) Has been skipped
Tests / test (push) Failing after 14s
Tests / lint (push) Failing after 15s
fix: connect API to tracker.db via SQLite repository
2026-06-17 13:21:38 +08:00

81 lines
2.1 KiB
TypeScript

/**
* 顶部导航栏
*/
import React from 'react';
import { Layout, Button, Dropdown, Avatar, Space } from 'antd';
import {
MenuFoldOutlined,
MenuUnfoldOutlined,
UserOutlined,
LogoutOutlined,
SettingOutlined,
} from '@ant-design/icons';
import { useNavigate } from 'react-router-dom';
import { useUIStore } from '@/store/uiStore';
import { useAuthStore } from '@/store/authStore';
import { useLogout } from '@/hooks/useAuth';
import type { MenuProps } from 'antd';
const { Header: AntHeader } = Layout;
const Header: React.FC = () => {
const navigate = useNavigate();
const sidebarCollapsed = useUIStore((state) => state.sidebarCollapsed);
const toggleSidebar = useUIStore((state) => state.toggleSidebar);
const user = useAuthStore((state) => state.user);
const logoutMutation = useLogout();
const menuItems: MenuProps['items'] = [
{
key: 'profile',
icon: <UserOutlined />,
label: '个人设置',
onClick: () => navigate('/profile'),
},
{
key: 'settings',
icon: <SettingOutlined />,
label: '账号设置',
onClick: () => navigate('/profile/settings'),
},
{
type: 'divider',
},
{
key: 'logout',
icon: <LogoutOutlined />,
label: '退出登录',
onClick: () => logoutMutation.mutate(),
},
];
return (
<AntHeader
style={{
padding: '0 24px',
background: '#fff',
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
borderBottom: '1px solid #f0f0f0',
}}
>
<Button
type="text"
icon={sidebarCollapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
onClick={toggleSidebar}
style={{ fontSize: '16px', width: 64, height: 64 }}
/>
<Dropdown menu={{ items: menuItems }} placement="bottomRight">
<Space style={{ cursor: 'pointer' }}>
<Avatar icon={<UserOutlined />} />
<span>{user?.display_name || user?.username}</span>
</Space>
</Dropdown>
</AntHeader>
);
};
export default Header;