import { ChatFolder, Conversation, KeyValuePair } from '@/types'; import { IconCaretDown, IconCaretRight, IconCheck, IconPencil, IconTrash, IconX, } from '@tabler/icons-react'; import { FC, KeyboardEvent, useEffect, useState } from 'react'; import { ConversationComponent } from './Conversation'; interface Props { searchTerm: string; conversations: Conversation[]; currentFolder: ChatFolder; onDeleteFolder: (folder: number) => void; onUpdateFolder: (folder: number, name: string) => void; // conversation props selectedConversation: Conversation; loading: boolean; onSelectConversation: (conversation: Conversation) => void; onDeleteConversation: (conversation: Conversation) => void; onUpdateConversation: ( conversation: Conversation, data: KeyValuePair, ) => void; } export const Folder: FC = ({ searchTerm, conversations, currentFolder, onDeleteFolder, onUpdateFolder, // conversation props selectedConversation, loading, onSelectConversation, onDeleteConversation, onUpdateConversation, }) => { const [isDeleting, setIsDeleting] = useState(false); const [isRenaming, setIsRenaming] = useState(false); const [renameValue, setRenameValue] = useState(''); const [isOpen, setIsOpen] = useState(false); const handleEnterDown = (e: KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault(); handleRename(); } }; const handleRename = () => { onUpdateFolder(currentFolder.id, renameValue); setRenameValue(''); setIsRenaming(false); }; const handleDrop = (e: any, folder: ChatFolder) => { if (e.dataTransfer) { setIsOpen(true); const conversation = JSON.parse(e.dataTransfer.getData('conversation')); onUpdateConversation(conversation, { key: 'folderId', value: folder.id }); 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 (isRenaming) { setIsDeleting(false); } else if (isDeleting) { setIsRenaming(false); } }, [isRenaming, isDeleting]); useEffect(() => { if (searchTerm) { setIsOpen(true); } else { setIsOpen(false); } }, [searchTerm]); return (
setIsOpen(!isOpen)} onDrop={(e) => handleDrop(e, currentFolder)} onDragOver={allowDrop} onDragEnter={highlightDrop} onDragLeave={removeHighlight} > {isOpen ? : } {isRenaming ? ( setRenameValue(e.target.value)} onKeyDown={handleEnterDown} autoFocus /> ) : (
{currentFolder.name}
)} {(isDeleting || isRenaming) && (
{ e.stopPropagation(); if (isDeleting) { onDeleteFolder(currentFolder.id); } else if (isRenaming) { handleRename(); } setIsDeleting(false); setIsRenaming(false); }} /> { e.stopPropagation(); setIsDeleting(false); setIsRenaming(false); }} />
)} {!isDeleting && !isRenaming && (
{ e.stopPropagation(); setIsRenaming(true); setRenameValue(currentFolder.name); }} /> { e.stopPropagation(); setIsDeleting(true); }} />
)}
{isOpen ? conversations.map((conversation, index) => { if (conversation.folderId === currentFolder.id) { return (
); } }) : null}
); };