import { useClickOutside } from "@web/src/hooks/useClickOutside"; import { useAuth } from "@web/src/providers/auth-provider"; import { motion, AnimatePresence } from "framer-motion"; import { useState, useRef, useCallback, useMemo } from "react"; import { Avatar } from "../../common/element/Avatar"; import { UserOutlined, SettingOutlined, QuestionCircleOutlined, LogoutOutlined } from "@ant-design/icons"; import type { MenuItemType } from "./types"; import { Spin } from "antd"; // USAF Theme Constants const USAF_THEME = { colors: { primary: '#00538E', // Air Force Blue secondary: '#003F6A', // Darker Blue accent: '#B22234', // Air Force Red background: '#F6F9FC', // Light Blue tint hover: '#E6EEF5', // Lighter hover state border: '#E5EDF5', // Light Border text: { primary: '#00538E', secondary: '#4A5568', light: '#718096', danger: '#B22234' } }, shadows: { sm: '0 2px 4px 0 rgba(0, 83, 142, 0.08)', md: '0 4px 8px -1px rgba(0, 83, 142, 0.15), 0 2px 4px -1px rgba(0, 83, 142, 0.08)', lg: '0 12px 20px -3px rgba(0, 83, 142, 0.15), 0 4px 8px -2px rgba(0, 83, 142, 0.1)', hover: '0 6px 12px -2px rgba(0, 83, 142, 0.12), 0 3px 6px -1px rgba(0, 83, 142, 0.07)' } } as const; const menuVariants = { hidden: { opacity: 0, scale: 0.95, y: -10 }, visible: { opacity: 1, scale: 1, y: 0, transition: { type: "spring", stiffness: 300, damping: 30 } }, exit: { opacity: 0, scale: 0.95, y: -10, transition: { duration: 0.2 } } }; export function UserMenu() { const [showMenu, setShowMenu] = useState(false); const menuRef = useRef(null); const { user, logout, isLoading } = useAuth(); useClickOutside(menuRef, () => setShowMenu(false)); const toggleMenu = useCallback(() => { setShowMenu(prev => !prev); }, []); const menuItems: MenuItemType[] = useMemo(() => [ { icon: , label: '个人信息', action: () => { }, }, { icon: , label: '设置', action: () => { }, }, { icon: , label: '帮助', action: () => { }, }, { icon: , label: '注销', action: () => logout(), }, ], [logout]); const handleMenuItemClick = useCallback((action: () => void) => { action(); setShowMenu(false); }, []); if (isLoading) { return (
); } return (
{showMenu && ( {/* User Profile Section */}
{user?.showname || user?.username} 在线
{/* Menu Items */}
{menuItems.map((item, index) => ( ))}
)}
); }