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 (