"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"; import { AGENT_PAGES, type NavigationPage, } from "@/lib/constants/agent-pages"; export type { NavigationPage }; 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) => { 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); const visiblePages = AGENT_PAGES.filter( (p) => !p.adminOnly || (p.adminOnly && isAdmin) ); return (
{visiblePages.map((page) => { const isActive = currentPage === page.id; const Icon = page.Icon; return ( ); })} {/* 个人资料按钮和 GitHub 按钮(固定在底部) */}
{profileMenuOpen && (
{fullAvatarUrl ? ( {agent?.username ) : (
{displayInitial}
)}
{agent?.username || "用户"}
{agent?.role === "admin" ? "管理员" : "客服"}
)}
); }