import { useClickOutside } from "@web/src/hooks/useClickOutside"; import { useAuth } from "@web/src/providers/auth-provider"; import { motion, AnimatePresence } from "framer-motion"; import React, { useState, useRef, useCallback, useMemo, createContext, } from "react"; import { Avatar } from "../../../common/element/Avatar"; import { UserOutlined, SettingOutlined, LogoutOutlined, } from "@ant-design/icons"; import { FormInstance, Spin } from "antd"; import { useNavigate } from "react-router-dom"; import { MenuItemType } from "../types"; import { RolePerms } from "@nice/common"; import { useForm } from "antd/es/form/Form"; import UserEditModal from "./user-edit-modal"; 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 const UserEditorContext = createContext<{ domainId: string; setDomainId: React.Dispatch>; modalOpen: boolean; setModalOpen: React.Dispatch>; form: FormInstance; formLoading: boolean; setFormLoading: React.Dispatch>; }>({ modalOpen: false, domainId: undefined, setDomainId: undefined, setModalOpen: undefined, form: undefined, formLoading: undefined, setFormLoading: undefined, }); export function UserMenu() { const [form] = useForm(); const [formLoading, setFormLoading] = useState(); const [showMenu, setShowMenu] = useState(false); const menuRef = useRef(null); const { user, logout, isLoading, hasSomePermissions } = useAuth(); const navigate = useNavigate(); useClickOutside(menuRef, () => setShowMenu(false)); const [modalOpen, setModalOpen] = useState(false); const [domainId, setDomainId] = useState(); const toggleMenu = useCallback(() => { setShowMenu((prev) => !prev); }, []); const canManageAnyStaff = useMemo(() => { return hasSomePermissions(RolePerms.MANAGE_ANY_STAFF); }, [user]); const menuItems: MenuItemType[] = useMemo( () => [ { icon: , label: "个人信息", action: () => { setModalOpen(true); }, }, canManageAnyStaff && { icon: , label: "设置", action: () => { navigate("/admin/staff"); }, }, // { // icon: , // label: '帮助', // action: () => { }, // }, { icon: , label: "注销", action: () => logout(), }, ].filter(Boolean), [logout] ); const handleMenuItemClick = useCallback((action: () => void) => { action(); setShowMenu(false); }, []); if (isLoading) { return (
); } return (
{/* Avatar 容器,相对定位 */}
{/* 小绿点 */}
{/* 用户信息,显示在 Avatar 右侧 */}
{user?.showname || user?.username} {user?.department?.name}
{showMenu && ( {/* User Profile Section */}
{user?.showname || user?.username} 在线
{/* Menu Items */}
{menuItems.map((item, index) => ( ))}
)}
); }