"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 { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { LanguageSwitcher } from "@/components/i18n/LanguageSwitcher"; import { useI18n } from "@/lib/i18n/provider"; import { AGENT_PAGES, type AgentPageItem, 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; /** 顶部/左侧“对话”图标角标展示用:总未读消息数 */ unreadChatCount?: number; } export function NavigationSidebar({ currentPage = "dashboard", onNavigate, onProfileClick, onLogout, avatarUrl, unreadChatCount = 0, }: NavigationSidebarProps) { const { agent } = useAuth(); const { t } = useI18n(); const [profileMenuOpen, setProfileMenuOpen] = useState(false); const menuRef = useRef(null); const isAdmin = agent?.role === "admin"; const permissions = agent?.permissions ?? []; 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) => { if (isAdmin) return true; const need = p.requiredPermission; if (!need) return true; return permissions.includes(need); }) as unknown as AgentPageItem[]; return (
{visiblePages.map((page) => { const isActive = currentPage === page.id; const Icon = page.Icon; const showUnread = page.id === "dashboard" && unreadChatCount > 0; const pageTitle = page.titleKey ? t(page.titleKey) : page.title; return ( {pageTitle} ); })}
{/* 个人资料按钮和 GitHub 按钮(固定在底部) */}
{t("agent.profile")} {profileMenuOpen && (
{fullAvatarUrl ? ( {agent?.username ) : (
{displayInitial}
)}
{agent?.username || "用户"}
{agent?.role === "admin" ? "管理员" : "客服"}
)}
GitHub
); }