import { ChatFolder, Conversation, KeyValuePair } from "@/types"; import { IconArrowBarLeft, IconFolderPlus, IconPlus } from "@tabler/icons-react"; import { FC, useEffect, useState } from "react"; import { Conversations } from "./Conversations"; import { Folders } from "./Folders"; import { Search } from "./Search"; import { SidebarSettings } from "./SidebarSettings"; interface Props { loading: boolean; conversations: Conversation[]; lightMode: "light" | "dark"; selectedConversation: Conversation; apiKey: string; folders: ChatFolder[]; onCreateFolder: (name: string) => void; onDeleteFolder: (folderId: number) => void; onUpdateFolder: (folderId: number, name: string) => void; onNewConversation: () => void; onToggleLightMode: (mode: "light" | "dark") => void; onSelectConversation: (conversation: Conversation) => void; onDeleteConversation: (conversation: Conversation) => void; onToggleSidebar: () => void; onUpdateConversation: (conversation: Conversation, data: KeyValuePair) => void; onApiKeyChange: (apiKey: string) => void; onClearConversations: () => void; onExportConversations: () => void; onImportConversations: (data: { conversations: Conversation[]; folders: ChatFolder[] }) => void; } export const Sidebar: FC = ({ loading, conversations, lightMode, selectedConversation, apiKey, folders, onCreateFolder, onDeleteFolder, onUpdateFolder, onNewConversation, onToggleLightMode, onSelectConversation, onDeleteConversation, onToggleSidebar, onUpdateConversation, onApiKeyChange, onClearConversations, onExportConversations, onImportConversations }) => { const [searchTerm, setSearchTerm] = useState(""); const [filteredConversations, setFilteredConversations] = useState(conversations); const handleUpdateConversation = (conversation: Conversation, data: KeyValuePair) => { onUpdateConversation(conversation, data); setSearchTerm(""); }; const handleDeleteConversation = (conversation: Conversation) => { onDeleteConversation(conversation); setSearchTerm(""); }; const handleDrop = (e: any) => { if (e.dataTransfer) { const conversation = JSON.parse(e.dataTransfer.getData("conversation")); onUpdateConversation(conversation, { key: "folderId", value: 0 }); e.target.style.background = "none"; } }; const allowDrop = (e: any) => { e.preventDefault(); }; const highlightDrop = (e: any) => { e.target.style.background = "#343541"; }; const removeHighlight = (e: any) => { e.target.style.background = "none"; }; useEffect(() => { if (searchTerm) { setFilteredConversations( conversations.filter((conversation) => { const searchable = conversation.name.toLocaleLowerCase() + " " + conversation.messages.map((message) => message.content).join(" "); return searchable.toLowerCase().includes(searchTerm.toLowerCase()); }) ); } else { setFilteredConversations(conversations); } }, [searchTerm, conversations]); return ( ); };