import React, { useState, useEffect } from 'react'; import { PlusCircle, MessageSquare, Trash2, Edit2, Save, X, User, LogOut } from 'lucide-react'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { apiRequest } from '@/lib/queryClient'; import { Conversation } from '@/lib/types'; import { useAuth } from '@/hooks/use-auth'; import { useLocation } from 'wouter'; interface ConversationSidebarProps { isOpen: boolean; onClose: () => void; selectedConversationId: string; onSelectConversation: (conversationId: string) => void; onNewConversation: () => void; } const ConversationSidebar: React.FC = ({ isOpen, onClose, selectedConversationId, onSelectConversation, onNewConversation }) => { const [conversations, setConversations] = useState([]); const [isLoading, setIsLoading] = useState(false); const [editingId, setEditingId] = useState(null); const [editingTitle, setEditingTitle] = useState(''); const { user, logoutMutation } = useAuth(); const [, setLocation] = useLocation(); const isSignedIn = !!user; // Fetch conversations useEffect(() => { const fetchConversations = async () => { setIsLoading(true); try { const response = await fetch('/api/conversations'); if (response.ok) { const data = await response.json(); setConversations(data); } else { console.error('Failed to fetch conversations'); } } catch (error) { console.error('Error fetching conversations:', error); } finally { setIsLoading(false); } }; fetchConversations(); // Set up interval to refresh conversations (every 30 seconds) const interval = setInterval(fetchConversations, 30000); return () => clearInterval(interval); }, [isSignedIn]); // Navigate to auth page const handleSignIn = () => { setLocation('/auth'); }; // Sign out const handleSignOut = () => { setLocation('/logout'); }; // Start editing a conversation title const handleEditStart = (conversation: Conversation) => { setEditingId(conversation.id); setEditingTitle(conversation.title); }; // Cancel editing const handleEditCancel = () => { setEditingId(null); setEditingTitle(''); }; // Save edited title const handleEditSave = async (conversationId: string) => { try { const response = await apiRequest('PATCH', `/api/conversations/${conversationId}/title`, { title: editingTitle }); if (response.ok) { const updatedConversation = await response.json(); setConversations(conversations.map(conv => conv.id === conversationId ? updatedConversation : conv )); setEditingId(null); } else { console.error('Failed to update conversation title'); } } catch (error) { console.error('Error updating conversation title:', error); } }; // Delete a conversation const handleDelete = async (conversationId: string) => { // Confirm delete if (!window.confirm('Are you sure you want to delete this conversation?')) { return; } try { const response = await apiRequest('DELETE', `/api/conversations/${conversationId}`); if (response.ok) { setConversations(conversations.filter(conv => conv.id !== conversationId)); // If we deleted the selected conversation, switch to a new one if (conversationId === selectedConversationId) { const nextConv = conversations.find(conv => conv.id !== conversationId); if (nextConv) { onSelectConversation(nextConv.id); } else { onNewConversation(); } } } else { console.error('Failed to delete conversation'); } } catch (error) { console.error('Error deleting conversation:', error); } }; return ( ); }; export default ConversationSidebar;