import { ChatFolder, Conversation, KeyValuePair } from '@/types'; import { IconArrowBarLeft, IconFolderPlus, IconPlus, } from '@tabler/icons-react'; import { FC, useEffect, useState } from 'react'; import { useTranslation } from 'next-i18next'; 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 { t } = useTranslation('sidebar'); 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 ( ); };