import { Conversation, KeyValuePair } from "@/types"; import { IconArrowBarLeft, IconPlus } from "@tabler/icons-react"; import { FC, useEffect, useState } from "react"; import { Conversations } from "./Conversations"; import { Search } from "./Search"; import { SidebarSettings } from "./SidebarSettings"; interface Props { loading: boolean; conversations: Conversation[]; lightMode: "light" | "dark"; selectedConversation: Conversation; apiKey: string; 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: (conversations: Conversation[]) => void; } export const Sidebar: FC = ({ loading, conversations, lightMode, selectedConversation, apiKey, onNewConversation, onToggleLightMode, onSelectConversation, onDeleteConversation, onToggleSidebar, onUpdateConversation, onApiKeyChange, onClearConversations, onExportConversations, onImportConversations }) => { const [searchTerm, setSearchTerm] = useState(""); const [filteredConversations, setFilteredConversations] = useState(conversations); 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 ( ); };