import { App, Popover } from "antd"; import { Switch } from "@/components/ui/base/switch"; import { ChevronRight, LogIn, LogOut, Moon, ShieldCheck, Sun } from "lucide-react"; import { useState, type ReactNode } from "react"; import { Link, useNavigate } from "react-router"; import { AppChangelogButton } from "@/components/layout/app-changelog-modal"; import { IdentityProviderBadge } from "@/components/layout/identity-provider-badge"; import { UserAvatar } from "@/components/layout/user-avatar"; import { SystemAnnouncementCenter } from "@/components/layout/system-announcement-center"; import { useWalletBalance } from "@/hooks/use-wallet-balance"; import { applyUserSession } from "@/lib/user-session"; import { cn } from "@/lib/utils"; import { logout } from "@/services/api/auth"; import { useThemeStore } from "@/stores/use-theme-store"; import { useUserStore, type LocalUser } from "@/stores/use-user-store"; type WorkspaceSidebarFooterProps = { expandedClassName: string; collapsedClassName: string; accountClassName: string; showAnnouncement?: boolean; }; export function WorkspaceSidebarFooter({ expandedClassName, collapsedClassName, accountClassName, showAnnouncement = true }: WorkspaceSidebarFooterProps) { const theme = useThemeStore((state) => state.theme); const setTheme = useThemeStore((state) => state.setTheme); const user = useUserStore((state) => state.user); const hydrated = useUserStore((state) => state.hydrated); const creditsEnabled = useUserStore((state) => state.features.creditsEnabled); const navigate = useNavigate(); const { message } = App.useApp(); const [menuOpen, setMenuOpen] = useState(false); const { availableMicrocredits } = useWalletBalance(user?.id, creditsEnabled); const balance = availableMicrocredits === null ? "--" : (availableMicrocredits / 1_000_000).toLocaleString("zh-CN", { maximumFractionDigits: 2 }); const handleLogout = async () => { try { await logout(); await applyUserSession({ user: null }); setMenuOpen(false); message.success("已退出登录"); navigate("/login", { replace: true }); } catch (error) { message.error(error instanceof Error ? error.message : "退出失败"); } }; if (!hydrated) return
; return (
{user && showAnnouncement ? ( ) : null} {user ? (
{user.displayName || user.username}
{creditsEnabled ?
可用 {balance} 积分
: null}
{user.role === "admin" ? ( ) : null}
{theme === "dark" ? : } 深色模式 setTheme(checked ? "dark" : "light")} aria-label="深色模式" />
)} > ) : ( 登录 )}
); } function MenuLink({ to, icon, label, onNavigate }: { to: string; icon: ReactNode; label: string; onNavigate: () => void }) { return {icon}{label}; } function SidebarUserAvatar({ user, className }: { user: LocalUser; className: string }) { return ( ); }