import { useState } from "react"; import { Search, Folder, FolderPlus, MessageSquare, MoreVertical, Trash2, Edit, FolderInput, ChevronLeft, ChevronRight, Plus } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; interface Conversation { id: string; title: string; lastMessage: string; timestamp: string; folderId?: string; } interface ChatFolder { id: string; name: string; } interface ChatSidebarProps { isCollapsed: boolean; onToggleCollapse: () => void; } export const ChatSidebar = ({ isCollapsed, onToggleCollapse }: ChatSidebarProps) => { const [searchQuery, setSearchQuery] = useState(""); const [isCreateFolderOpen, setIsCreateFolderOpen] = useState(false); const [isEditFolderOpen, setIsEditFolderOpen] = useState(false); const [isDeleteFolderOpen, setIsDeleteFolderOpen] = useState(false); const [newFolderName, setNewFolderName] = useState(""); const [editingFolder, setEditingFolder] = useState(null); const [deletingFolder, setDeletingFolder] = useState(null); const [selectedConversation, setSelectedConversation] = useState("1"); const [folders, setFolders] = useState([ { id: "work", name: "Trabalho" }, { id: "personal", name: "Pessoal" }, ]); const [conversations, setConversations] = useState([ { id: "1", title: "Conversa sobre IA", lastMessage: "Como funciona o machine learning?", timestamp: "Há 5 min", }, { id: "2", title: "Projeto HGTX", lastMessage: "Discutindo arquitetura do sistema", timestamp: "Há 1 hora", folderId: "work", }, { id: "3", title: "Ideias criativas", lastMessage: "Brainstorm para novo produto", timestamp: "Ontem", folderId: "personal", }, ]); const [expandedFolders, setExpandedFolders] = useState>(new Set(["work", "personal"])); const handleCreateFolder = () => { if (newFolderName.trim()) { const newFolder: ChatFolder = { id: Date.now().toString(), name: newFolderName, }; setFolders([...folders, newFolder]); setNewFolderName(""); setIsCreateFolderOpen(false); } }; const handleEditFolder = () => { if (editingFolder && newFolderName.trim()) { setFolders( folders.map((f) => f.id === editingFolder.id ? { ...f, name: newFolderName } : f ) ); setNewFolderName(""); setEditingFolder(null); setIsEditFolderOpen(false); } }; const handleDeleteFolder = () => { if (deletingFolder) { // Remove folder and move conversations back to "no folder" setConversations( conversations.map((conv) => conv.folderId === deletingFolder.id ? { ...conv, folderId: undefined } : conv ) ); setFolders(folders.filter((f) => f.id !== deletingFolder.id)); setDeletingFolder(null); setIsDeleteFolderOpen(false); } }; const openEditFolder = (folder: ChatFolder) => { setEditingFolder(folder); setNewFolderName(folder.name); setIsEditFolderOpen(true); }; const openDeleteFolder = (folder: ChatFolder) => { setDeletingFolder(folder); setIsDeleteFolderOpen(true); }; const toggleFolder = (folderId: string) => { const newExpanded = new Set(expandedFolders); if (newExpanded.has(folderId)) { newExpanded.delete(folderId); } else { newExpanded.add(folderId); } setExpandedFolders(newExpanded); }; const moveToFolder = (conversationId: string, folderId: string) => { setConversations( conversations.map((conv) => conv.id === conversationId ? { ...conv, folderId } : conv ) ); }; const removeFromFolder = (conversationId: string) => { setConversations( conversations.map((conv) => conv.id === conversationId ? { ...conv, folderId: undefined } : conv ) ); }; const filteredConversations = conversations.filter( (conv) => conv.title.toLowerCase().includes(searchQuery.toLowerCase()) || conv.lastMessage.toLowerCase().includes(searchQuery.toLowerCase()) ); const conversationsWithoutFolder = filteredConversations.filter((c) => !c.folderId); const conversationsByFolder = folders.reduce((acc, folder) => { acc[folder.id] = filteredConversations.filter((c) => c.folderId === folder.id); return acc; }, {} as Record); if (isCollapsed) { return (
); } return (
{/* Header with collapse button */}

Conversas

{/* Search */}
setSearchQuery(e.target.value)} placeholder="Pesquisar conversas..." className="pl-9 bg-muted/50" />
Criar Nova Pasta Organize suas conversas em pastas personalizadas.
setNewFolderName(e.target.value)} placeholder="Ex: Projetos, Estudos..." onKeyDown={(e) => e.key === "Enter" && handleCreateFolder()} />
{/* Edit Folder Dialog */} Editar Pasta Renomeie sua pasta de conversas.
setNewFolderName(e.target.value)} placeholder="Digite o novo nome..." onKeyDown={(e) => e.key === "Enter" && handleEditFolder()} />
{/* Delete Folder Alert */} Excluir Pasta? Esta ação não pode ser desfeita. As conversas dentro da pasta serão movidas para "Sem Pasta". Cancelar Excluir
{/* Conversations List */}
{/* Folders */} {folders.map((folder) => (
openEditFolder(folder)} > Editar Nome openDeleteFolder(folder)} > Excluir Pasta
{expandedFolders.has(folder.id) && conversationsByFolder[folder.id]?.length > 0 && (
{conversationsByFolder[folder.id].map((conv) => ( setSelectedConversation(conv.id)} folders={folders} onMoveToFolder={moveToFolder} onRemoveFromFolder={removeFromFolder} /> ))}
)}
))} {/* Conversations without folder */} {conversationsWithoutFolder.length > 0 && (
Sem Pasta
{conversationsWithoutFolder.map((conv) => ( setSelectedConversation(conv.id)} folders={folders} onMoveToFolder={moveToFolder} onRemoveFromFolder={removeFromFolder} /> ))}
)}
); }; interface ConversationItemProps { conversation: Conversation; isSelected: boolean; onSelect: () => void; folders: ChatFolder[]; onMoveToFolder: (conversationId: string, folderId: string) => void; onRemoveFromFolder: (conversationId: string) => void; } const ConversationItem = ({ conversation, isSelected, onSelect, folders, onMoveToFolder, onRemoveFromFolder, }: ConversationItemProps) => { return (

{conversation.title}

{conversation.lastMessage}

{conversation.timestamp}

e.stopPropagation()}> Renomear {conversation.folderId && ( onRemoveFromFolder(conversation.id)} > Remover da Pasta )} {folders.map((folder) => ( onMoveToFolder(conversation.id, folder.id)} > Mover para {folder.name} ))} Excluir
); };