import { useCallback } from 'react'; import { Box, List, ListItem, IconButton, Typography, Button, CircularProgress, } from '@mui/material'; import DeleteIcon from '@mui/icons-material/Delete'; import { useSessionStore } from '@/store/sessionStore'; import { useAgentStore } from '@/store/agentStore'; interface SessionSidebarProps { onClose?: () => void; } export default function SessionSidebar({ onClose }: SessionSidebarProps) { const { sessions, activeSessionId, isLoading, createSession, selectSession, deleteSession, } = useSessionStore(); const { setPlan, setPanelContent, clearMessages } = useAgentStore(); const handleNewSession = useCallback(async () => { const sessionId = await createSession(); if (sessionId) { clearMessages(); setPlan([]); setPanelContent(null); onClose?.(); } }, [createSession, clearMessages, setPlan, setPanelContent, onClose]); const handleSelectSession = useCallback( async (sessionId: string) => { await selectSession(sessionId); setPlan([]); setPanelContent(null); onClose?.(); }, [selectSession, setPlan, setPanelContent, onClose] ); const handleDeleteSession = useCallback( async (sessionId: string, e: React.MouseEvent) => { e.stopPropagation(); await deleteSession(sessionId); }, [deleteSession] ); const formatTime = (dateString: string) => { const date = new Date(dateString); const now = new Date(); const isToday = date.toDateString() === now.toDateString(); if (isToday) { return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); } return date.toLocaleDateString([], { month: 'short', day: 'numeric' }); }; return ( {/* Header */} HF Agent {/* Content */} {/* Session List */} {isLoading && ( )} {[...sessions].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()).map((session) => { const isSelected = session.id === activeSessionId; return ( handleSelectSession(session.id)} sx={{ display: 'flex', alignItems: 'center', gap: '12px', padding: '10px', borderRadius: 'var(--radius-md)', bgcolor: isSelected ? 'rgba(255,255,255,0.05)' : 'transparent', cursor: 'pointer', transition: 'background 0.18s ease, transform 0.08s ease', '&:hover': { bgcolor: 'rgba(255,255,255,0.02)', transform: 'translateY(-1px)', }, '& .delete-btn': { opacity: 0, transition: 'opacity 0.2s', }, '&:hover .delete-btn': { opacity: 1, } }} > {session.title} {formatTime(session.createdAt)} handleDeleteSession(session.id, e)} sx={{ color: 'var(--muted-text)', '&:hover': { color: 'var(--accent-red)' } }} > ); })} {/* Footer */} {sessions.length} sessions ); }