"use client"; import { useState, useRef, useEffect } from "react"; import { useAuth } from "@/features/agent/hooks/useAuth"; import { getAvatarUrl, getAvatarColor, getAvatarInitial } from "@/utils/avatar"; import { Button } from "@/components/ui/button"; import { websiteConfig } from "@/lib/website-config"; export type NavigationPage = "dashboard" | "faqs" | "users" | "settings"; interface NavigationSidebarProps { currentPage?: NavigationPage; onNavigate?: (page: NavigationPage) => void; onProfileClick?: () => void; onLogout?: () => void; avatarUrl?: string | null; } export function NavigationSidebar({ currentPage = "dashboard", onNavigate, onProfileClick, onLogout, avatarUrl, }: NavigationSidebarProps) { const { agent } = useAuth(); const [profileMenuOpen, setProfileMenuOpen] = useState(false); const menuRef = useRef(null); // 检查当前用户是否是管理员 const isAdmin = agent?.role === "admin"; const handleNavigate = (page: NavigationPage) => { if (onNavigate) { onNavigate(page); } }; // 点击外部关闭菜单 useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(event.target as Node)) { setProfileMenuOpen(false); } }; if (profileMenuOpen) { document.addEventListener("mousedown", handleClickOutside); } return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [profileMenuOpen]); // 头像相关 const avatarColor = getAvatarColor(agent?.username || ""); const displayInitial = getAvatarInitial(agent?.username || ""); const fullAvatarUrl = getAvatarUrl(avatarUrl); return (
{isAdmin && ( )} {/* 个人资料按钮和 GitHub 按钮(固定在底部) */}
{/* 个人资料按钮 */}
{/* 下拉菜单 */} {profileMenuOpen && (
{/* 用户信息 */}
{fullAvatarUrl ? ( {agent?.username ) : (
{displayInitial}
)}
{agent?.username || "用户"}
{agent?.role === "admin" ? "管理员" : "客服"}
{/* 菜单项 */}
)}
{/* GitHub 链接按钮(个人资料下方) */}
); }