import { Check, ChevronDown, Edit, Plus, Trash, X } from 'lucide-react' import { useState } from 'react' import { Button, cn, Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, Input, Popover, PopoverContent, PopoverTrigger, ScrollArea, } from 'ui' import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' interface AIAssistantChatSelectorProps { disabled?: boolean } export const AIAssistantChatSelector = ({ disabled = false }: AIAssistantChatSelectorProps) => { const snap = useAiAssistantStateSnapshot() const currentChat = snap.activeChat?.name const [chatSelectorOpen, setChatSelectorOpen] = useState(false) const [editingChatId, setEditingChatId] = useState(null) const [editingChatName, setEditingChatName] = useState('') const chats = Object.entries(snap.chats) const handleSelectChat = (id: string) => { snap.selectChat(id) setChatSelectorOpen(false) } const handleDeleteChat = (id: string, e?: React.MouseEvent) => { if (e) { e.stopPropagation() } snap.deleteChat(id) } const handleStartEditChat = (id: string, name: string, e?: React.MouseEvent) => { if (e) { e.stopPropagation() } setEditingChatId(id) setEditingChatName(name) } const handleSaveEditChat = (e?: React.MouseEvent) => { if (e) { e.stopPropagation() } if (editingChatId && editingChatName.trim()) { snap.renameChat(editingChatId, editingChatName.trim()) setEditingChatId(null) setEditingChatName('') } } const handleCancelEditChat = (e?: React.MouseEvent | React.FocusEvent) => { if (e) { e.stopPropagation() } setEditingChatId(null) setEditingChatName('') } const handleInputBlur = (e: React.FocusEvent) => { e.stopPropagation() const relatedTarget = e.relatedTarget as HTMLElement | null const isSaveOrCancelButton = relatedTarget?.closest('button') if (!isSaveOrCancelButton && editingChatId && editingChatName.trim()) { handleSaveEditChat() } else if (!isSaveOrCancelButton) { handleCancelEditChat(e) } } return ( No chats found. 4 ? 'h-40' : ''}> {/* @ts-ignore */} {chats.map(([id, chat]) => ( handleSelectChat(id)} className="flex items-center justify-between gap-2 py-1 w-full overflow-hidden group" keywords={!!chat.name ? [chat.name] : undefined} disabled={disabled} >
{editingChatId === id ? (
setEditingChatName(e.target.value)} autoFocus size="tiny" className="flex-1 w-full" onClick={(e) => e.stopPropagation()} onBlur={handleInputBlur} onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault() e.stopPropagation() handleSaveEditChat() } else if (e.key === 'Escape') { e.preventDefault() e.stopPropagation() handleCancelEditChat() } }} />
) : ( <> {chat.name} )}
{editingChatId !== id && (
)}
))}
{ snap.newChat() setChatSelectorOpen(false) }} onClick={() => { snap.newChat() setChatSelectorOpen(false) }} disabled={disabled} > Start a new chat
) }