import { Conversation } from '@/types/chat'; import { KeyValuePair } from '@/types/data'; import { SupportedExportFormats } from '@/types/export'; import { Folder } from '@/types/folder'; import { IconArrowBarLeft, IconFolderPlus, IconMessagesOff, IconPlus, } from '@tabler/icons-react'; import { useTranslation } from 'next-i18next'; import { FC, useEffect, useState } from 'react'; import { ChatFolders } from '../Folders/Chat/ChatFolders'; import { Search } from '../Sidebar/Search'; import { ChatbarSettings } from './ChatbarSettings'; import { Conversations } from './Conversations'; interface Props { loading: boolean; conversations: Conversation[]; lightMode: 'light' | 'dark'; selectedConversation: Conversation; apiKey: string; folders: Folder[]; onCreateFolder: (name: string) => void; onDeleteFolder: (folderId: string) => void; onUpdateFolder: (folderId: string, 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: SupportedExportFormats) => void; } export const Chatbar: 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 (
{conversations.length > 1 && ( )}
{folders.length > 0 && (
conversation.folderId, )} folders={folders.filter((folder) => folder.type === 'chat')} onDeleteFolder={onDeleteFolder} onUpdateFolder={onUpdateFolder} selectedConversation={selectedConversation} loading={loading} onSelectConversation={onSelectConversation} onDeleteConversation={handleDeleteConversation} onUpdateConversation={handleUpdateConversation} />
)} {conversations.length > 0 ? (
handleDrop(e)} onDragOver={allowDrop} onDragEnter={highlightDrop} onDragLeave={removeHighlight} > !conversation.folderId, )} selectedConversation={selectedConversation} onSelectConversation={onSelectConversation} onDeleteConversation={handleDeleteConversation} onUpdateConversation={handleUpdateConversation} />
) : (
{t('No conversations.')}
)}
); };