"use client"; import { Popover } from "@base-ui/react/popover"; import Link from "next/link"; import { ChevronRight, Gift, KeyRound, LogOut, MessageSquareText, Plus, UserRound, } from "lucide-react"; import { useEffect, useRef } from "react"; import type { Ref } from "react"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarRail, useSidebar, } from "@/components/ui/sidebar"; import { SidebarSessionRow, type SidebarSession, type SidebarSessionControls, } from "@/components/sidebar-session-row"; export type SidebarAccount = { name: string; email: string; credits: number; isAdmin: boolean; adminUrl: string | null; initial: string; }; export type AppSidebarProps = { sessions: readonly SidebarSession[]; activeSessionId: string | null; account: SidebarAccount; accountMenuOpen: boolean; accountTriggerRef: Ref; newChatDisabled: boolean; creatingSession: boolean; sessionControls: SidebarSessionControls; onAccountMenuOpenChange: (open: boolean) => void; onNewChat: () => void; onSelectSession: (sessionId: string) => void; onOpenProfile: () => void; onOpenRedeem: () => void; onOpenLogout: () => void; }; export function AppSidebar({ sessions, activeSessionId, account, accountMenuOpen, accountTriggerRef, newChatDisabled, creatingSession, sessionControls, onAccountMenuOpenChange, onNewChat, onSelectSession, onOpenProfile, onOpenRedeem, onOpenLogout, }: AppSidebarProps) { const { isMobile, setOpen, setOpenMobile, state, viewport } = useSidebar(); const firstSessionRef = useRef(null); const historyHeadingRef = useRef(null); const isCollapsedDesktop = state === "collapsed" && !isMobile; const showExpandedContent = !isCollapsedDesktop; const popoverPlacement = `${viewport}:${state}`; const previousPopoverPlacement = useRef(popoverPlacement); useEffect(() => { if (previousPopoverPlacement.current !== popoverPlacement && accountMenuOpen) { onAccountMenuOpenChange(false); } previousPopoverPlacement.current = popoverPlacement; }, [accountMenuOpen, onAccountMenuOpenChange, popoverPlacement]); function handleNewChat() { onNewChat(); if (isMobile) setOpenMobile(false); } function handleExpandHistory() { setOpen(true); window.requestAnimationFrame(() => { (firstSessionRef.current ?? historyHeadingRef.current)?.focus(); }); } function handleAccountAction(action: () => void) { onAccountMenuOpenChange(false); action(); } return (
{showExpandedContent ? (
{sessionControls.showingArchived ? "归档记录" : "聊天记录"}
{sessions.length === 0 ?

暂无对话

: ( {sessions.map((session, index) => ( sessionControls.onMenuSessionChange(open ? session.id : null)} onSelect={() => { onSelectSession(session.id); if (isMobile) setOpenMobile(false); }} onTogglePinned={() => sessionControls.onTogglePinned(session.id)} onRename={() => sessionControls.onRename(session.id)} onShare={() => sessionControls.onShare(session.id)} onToggleArchived={() => sessionControls.onToggleArchived(session.id)} onDelete={() => sessionControls.onDelete(session.id)} /> ))} )}
) : ( )}
{showExpandedContent ? {account.name} : null} {showExpandedContent ?
{account.name}{account.email}
{account.isAdmin && account.adminUrl && onAccountMenuOpenChange(false)}>