'use client'; import { useStore } from '@/lib/store'; import { api } from '@/lib/api'; function formatDate(iso: string): string { const d = new Date(iso); const now = new Date(); const diff = (now.getTime() - d.getTime()) / 1000; if (diff < 60) return 'just now'; if (diff < 3600) return `${Math.floor(diff / 60)}m ago`; if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`; if (diff < 172800) return 'yesterday'; return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); } function groupConversations(convs: { id: string; title: string; updated_at: string; created_at: string; message_count: number }[]) { const now = new Date(); const groups: Record = { today: [], yesterday: [], week: [], older: [] }; convs.forEach(c => { const diff = (now.getTime() - new Date(c.updated_at).getTime()) / 86400000; if (diff < 1) groups.today.push(c); else if (diff < 2) groups.yesterday.push(c); else if (diff < 7) groups.week.push(c); else groups.older.push(c); }); return groups; } export default function Sidebar({ onClose }: { onClose?: () => void }) { const { conversations, currentId, setCurrentId, setMessages, setConversations, setSidebarOpen } = useStore(); async function newConversation() { const conv = await api.newConversation(); const updated = await api.getConversations(); setConversations(updated); setCurrentId(conv.id); setMessages([]); if (onClose) onClose(); } async function loadConversation(id: string) { setCurrentId(id); setSidebarOpen(false); } async function deleteConv(e: React.MouseEvent, id: string) { e.stopPropagation(); if (!confirm('Delete this conversation?')) return; await api.deleteConversation(id); const updated = await api.getConversations(); setConversations(updated); if (currentId === id) { setCurrentId(null); setMessages([]); } } const groups = groupConversations(conversations); const labels: Record = { today: 'Today', yesterday: 'Yesterday', week: 'This week', older: 'Older' }; return (
{/* Header */}
{/* Conversation list */}
{Object.entries(labels).map(([key, label]) => { const group = groups[key]; if (!group.length) return null; return (
{label}
{group.map(c => (
loadConversation(c.id)} className="flex items-center gap-2 px-2 py-2 rounded-lg cursor-pointer mb-0.5 group" style={{ background: c.id === currentId ? 'var(--bg3)' : 'transparent', }} onMouseEnter={e => { if (c.id !== currentId) (e.currentTarget as HTMLElement).style.background = 'var(--bg3)'; }} onMouseLeave={e => { if (c.id !== currentId) (e.currentTarget as HTMLElement).style.background = 'transparent'; }} >
{c.title}
{formatDate(c.updated_at)}
))}
); })} {conversations.length === 0 && (
No conversations yet
)}
); }