import { splitProps, For, Show, createSignal, createMemo } from 'solid-js'; import { cn } from '../utils/cn'; import { Collapsible, CollapsibleTrigger, CollapsibleContent } from '../ui/collapsible'; import { Button } from '../ui/button'; import { Badge } from '../ui/badge'; import { ScrollArea } from '../ui/scroll-area'; import { ConversationItem } from './conversation-item'; import type { ConversationSummary, ConversationGroup } from '../types'; export interface ConversationListProps { groups: ConversationGroup[]; conversations: ConversationSummary[]; activeId?: string; onSelect: (id: string) => void; onNewChat: () => void; onToggleSidebar?: () => void; class?: string; } export function ConversationList(props: ConversationListProps) { const [local] = splitProps(props, ['groups', 'conversations', 'activeId', 'onSelect', 'onNewChat', 'onToggleSidebar', 'class']); const [searchQuery, setSearchQuery] = createSignal(''); const filteredConversations = createMemo(() => { const q = searchQuery().toLowerCase(); if (!q) return local.conversations; return local.conversations.filter((c) => c.title.toLowerCase().includes(q)); }); const groupedConversations = createMemo(() => { const grouped = new Map(); for (const conv of filteredConversations()) { const key = conv.groupId; if (!grouped.has(key)) grouped.set(key, []); grouped.get(key)!.push(conv); } return grouped; }); const ungrouped = createMemo(() => groupedConversations().get(undefined) ?? []); return (
Chats
setSearchQuery(e.currentTarget.value)} placeholder="Search chats..." aria-label="Search chats" class="bg-transparent text-[13px] text-foreground placeholder:text-muted-foreground rounded-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring w-full" />
{(group) => { const convs = createMemo(() => groupedConversations().get(group.id) ?? []); return ( 0}> ); }} 0}>
); } function GroupSection(props: { name: string; count: number; conversations: ConversationSummary[]; activeId?: string; onSelect: (id: string) => void }) { const [open, setOpen] = createSignal(true); return ( {props.name} {props.count}
{(conv) => }
); }