import type { ChatSession, SessionStatus } from '@/lib/types/chat'; import { cn } from '@/lib/utils'; import { useI18n } from '@/lib/hooks/use-i18n'; import { ChevronDown, Circle, CheckCircle, Clock } from 'lucide-react'; import { motion, AnimatePresence } from 'motion/react'; import { ChatSessionComponent } from './chat-session'; interface SessionListProps { sessions: ChatSession[]; expandedSessionIds: Set; isStreaming: boolean; activeBubbleId?: string | null; onToggleExpand: (sessionId: string) => void; onEndSession: (sessionId: string) => Promise; } const sessionBadgeStyles = { qa: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300', discussion: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300', lecture: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300', }; // Labels are provided via i18n in the component function getStatusIcon(status: SessionStatus) { switch (status) { case 'active': return ; case 'interrupted': return ; case 'completed': return ; case 'idle': default: return ; } } export function SessionList({ sessions, expandedSessionIds, isStreaming, activeBubbleId, onToggleExpand, onEndSession, }: SessionListProps) { const { t } = useI18n(); return ( <> {sessions.map((session) => { const isExpanded = expandedSessionIds.has(session.id); const isActive = session.status === 'active'; const dotColor = session.type === 'lecture' ? 'bg-purple-500' : session.type === 'qa' ? 'bg-blue-500' : 'bg-amber-500'; return (
{/* Session Header */} {/* Messages */} {isExpanded && (
)}
); })} ); }