({ chat, isActive, onDelete, onStar, onRename })
| 10 | import { cn } from '../utils.js'; |
| 11 | |
| 12 | export function SidebarHistoryItem({ chat, isActive, onDelete, onStar, onRename }) { |
| 13 | const { navigateToChat } = useChatNav(); |
| 14 | const { setOpenMobile } = useSidebar(); |
| 15 | const [hovered, setHovered] = useState(false); |
| 16 | const [dropdownOpen, setDropdownOpen] = useState(false); |
| 17 | const [confirmDelete, setConfirmDelete] = useState(false); |
| 18 | const [renameDialogOpen, setRenameDialogOpen] = useState(false); |
| 19 | |
| 20 | const showMenu = hovered || dropdownOpen; |
| 21 | |
| 22 | return ( |
| 23 | <SidebarMenuItem> |
| 24 | <div |
| 25 | className="relative group" |
| 26 | onMouseEnter={() => setHovered(true)} |
| 27 | onMouseLeave={() => setHovered(false)} |
| 28 | > |
| 29 | <SidebarMenuButton |
| 30 | href={chat.codeWorkspaceId && chat.containerName ? `/code/${chat.codeWorkspaceId}` : `/chat/${chat.id}`} |
| 31 | className="pr-8" |
| 32 | isActive={isActive} |
| 33 | onClick={(e) => { |
| 34 | e.preventDefault(); |
| 35 | if (chat.codeWorkspaceId && chat.containerName) { |
| 36 | window.location.href = `/code/${chat.codeWorkspaceId}`; |
| 37 | } else { |
| 38 | navigateToChat(chat.id); |
| 39 | } |
| 40 | setOpenMobile(false); |
| 41 | }} |
| 42 | > |
| 43 | <span className="relative"> |
| 44 | {chat.chatMode === 'code' ? <CodeIcon size={14} /> : <AgentIcon size={14} />} |
| 45 | {chat.hasChanges ? <span className="absolute -bottom-0.5 -right-0.5 w-2 h-2 rounded-full bg-destructive" /> : null} |
| 46 | </span> |
| 47 | <span className="truncate flex-1"> |
| 48 | {chat.title} |
| 49 | </span> |
| 50 | </SidebarMenuButton> |
| 51 | |
| 52 | <div className={cn( |
| 53 | 'absolute right-1 top-1/2 -translate-y-1/2 z-10', |
| 54 | showMenu ? 'opacity-100' : 'opacity-100 md:opacity-0 md:pointer-events-none' |
| 55 | )}> |
| 56 | <DropdownMenu open={dropdownOpen} onOpenChange={setDropdownOpen}> |
| 57 | <DropdownMenuTrigger asChild> |
| 58 | <button |
| 59 | className={cn( |
| 60 | 'rounded-md p-1', |
| 61 | 'text-muted-foreground hover:text-foreground', |
| 62 | 'bg-foreground/10 hover:bg-foreground/15' |
| 63 | )} |
| 64 | aria-label="Chat options" |
| 65 | > |
| 66 | <MoreHorizontalIcon size={16} /> |
| 67 | </button> |
| 68 | </DropdownMenuTrigger> |
| 69 | <DropdownMenuContent align="end" side="bottom"> |
nothing calls this directly
no test coverage detected