import { useState } from 'react'; import { useChatStore } from '../../store/chatStore'; import { Button } from '../ui'; import { MessageSquare, Plus, Search, MoreVertical, Trash2, Edit3, Calendar } from 'lucide-react'; import { formatDate, truncateText } from '../../utils'; import toast from 'react-hot-toast'; export function ChatSidebar() { const { conversations, activeConversationId, setActiveConversation, createNewConversation, deleteConversation, updateConversation } = useChatStore(); const [searchQuery, setSearchQuery] = useState(''); const [editingId, setEditingId] = useState(null); const [editTitle, setEditTitle] = useState(''); const handleNewChat = () => { const conversationId = createNewConversation(); setActiveConversation(conversationId); toast.success('New conversation created'); }; const handleDeleteConversation = (id: string, e: React.MouseEvent) => { e.stopPropagation(); if (window.confirm('Are you sure you want to delete this conversation?')) { deleteConversation(id); toast.success('Conversation deleted'); } }; const handleEditStart = (id: string, currentTitle: string, e: React.MouseEvent) => { e.stopPropagation(); setEditingId(id); setEditTitle(currentTitle); }; const handleEditSave = (id: string) => { if (editTitle.trim()) { updateConversation(id, { title: editTitle.trim() }); toast.success('Title updated'); } setEditingId(null); setEditTitle(''); }; const handleEditCancel = () => { setEditingId(null); setEditTitle(''); }; const filteredConversations = conversations.filter(conv => conv.title.toLowerCase().includes(searchQuery.toLowerCase()) || conv.messages.some(msg => msg.content.toLowerCase().includes(searchQuery.toLowerCase()) ) ); // Group conversations by date const groupedConversations = filteredConversations.reduce((groups, conv) => { const date = new Date(conv.updatedAt); const today = new Date(); const yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1); const weekAgo = new Date(today); weekAgo.setDate(weekAgo.getDate() - 7); let group: string; if (date.toDateString() === today.toDateString()) { group = 'Today'; } else if (date.toDateString() === yesterday.toDateString()) { group = 'Yesterday'; } else if (date > weekAgo) { group = 'This Week'; } else { group = 'Older'; } if (!groups[group]) { groups[group] = []; } groups[group].push(conv); return groups; }, {} as Record); return (
{/* Header */}
{/* Search */}
setSearchQuery(e.target.value)} className="w-full pl-10 pr-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent" />
{/* Conversations List */}
{Object.keys(groupedConversations).length === 0 ? (

{searchQuery ? 'No conversations found' : 'No conversations yet'}

) : (
{Object.entries(groupedConversations).map(([group, convs]) => (

{group}

{convs.map((conversation) => (
setActiveConversation(conversation.id)} > {editingId === conversation.id ? (
e.stopPropagation()}> setEditTitle(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') handleEditSave(conversation.id); if (e.key === 'Escape') handleEditCancel(); }} onBlur={() => handleEditSave(conversation.id)} className="flex-1 text-sm bg-transparent border-b border-primary-500 focus:outline-none" autoFocus />
) : ( <>

{conversation.title}

{conversation.messages.length > 0 && (

{truncateText( conversation.messages[conversation.messages.length - 1]?.content || '', 60 )}

)}
{formatDate(conversation.updatedAt)} {conversation.messages.length} messages
)}
))}
))}
)}
); }