import { useState } from "react" import { CircleUserRoundIcon, CloudIcon, CrownIcon, DatabaseIcon, EllipsisIcon, ImageIcon, LayoutIcon, MoonIcon, PanelLeftCloseIcon, PuzzleIcon, SettingsIcon, SunIcon, } from "lucide-react" import { useMatchRoute, useNavigate } from "@tanstack/react-router" import { useTranslation } from "react-i18next" import pkg from 'root/package.json' import { Button } from "@/components/ui/button" import { Card, CardContent } from "@/components/ui/card" import { ScrollArea } from "@/components/ui/scroll-area" import { Sidebar } from "@/components/ui/sidebar" import { useSidebar } from "@/components/ui/sidebar-context" import { cn } from "@/lib/utils" import { usePicGoCloudUserInfo } from "@/queries/picgo-cloud" import { usePicGoCloudBillingQuery } from "@/queries/picgo-cloud-billing" import { resolvePlanLabel } from "@/utils/plan" import { SidebarNavButton } from "./sidebar-nav-button" import { MainMoreDialog } from "./main-more-dialog" const SIDEBAR_ICON_CLASSNAME = "size-[18px]" export function PicGoAppSidebar({ isDark, onToggleTheme, }: { isDark: boolean onToggleTheme: () => void }) { const { t } = useTranslation() const navigate = useNavigate() const matchRoute = useMatchRoute() const { state, setOpen } = useSidebar() const { userInfo: cloudUserInfo, isPaid: cloudIsPaid } = usePicGoCloudUserInfo() const { data: cloudBilling } = usePicGoCloudBillingQuery() const cloudPhase = cloudBilling?.lifecycle?.phase const cloudNeedsRenew = cloudPhase === "grace" || cloudPhase === "frozen" || cloudPhase === "pending_cleanup" // 已登录但 free,或付费用户进入 grace/frozen/pending_cleanup 时显示皇冠提示升级 / 续费 const showCloudCrown = !!cloudUserInfo && (!cloudIsPaid || cloudNeedsRenew) const collapsed = state === "collapsed" const [avatarError, setAvatarError] = useState(false) const [moreOpen, setMoreOpen] = useState(false) const matchActive = (to: string) => !!matchRoute({ to, fuzzy: true, pending: false }) const isDashboardActive = matchActive("/main/dashboard") const isAlbumActive = matchActive("/main/album") const isProviderActive = matchActive("/main/providers") const isCloudActive = matchActive("/main/cloud") const isPluginsActive = matchActive("/main/plugins") const isSettingsActive = matchActive("/main/settings/settings") || matchActive("/main/settings/shortcuts") || matchActive("/main/settings/url-rewrite") return (
collapsed && setOpen(true)} title={collapsed ? t("SIDEBAR_EXPAND") : undefined} role={collapsed ? "button" : undefined} > PicGo Logo PicGo v{pkg.version}
{!collapsed ? ( ) : null}
{!collapsed ? (

{t("SIDEBAR_SYSTEM")}

) : (
)}
navigate({ to: "/main/cloud" })} className={cn( "bg-muted/30 hover:bg-muted/50 group/user-card cursor-pointer overflow-hidden border border-border shadow-none transition-colors", collapsed ? "border-none bg-transparent py-0" : "py-0" )} >
{cloudUserInfo?.avatar && !avatarError ? setAvatarError(true)} /> : }
{!collapsed ? ( <>

{cloudUserInfo?.user || t("PICGO_CLOUD_LOGIN")}

{cloudUserInfo ? resolvePlanLabel(cloudUserInfo.plan) : t("PICGO_CLOUD_BRAND_NAME")}

) : null}
) }