2 import { Pin } from '@lucide/svelte';
3 import { buildConversationTree } from '$lib/stores/conversations.svelte';
4 import SidebarNavigationConversationItem from './SidebarNavigationConversationItem.svelte';
5 import SidebarNavigationSearchResults from './SidebarNavigationSearchResults.svelte';
9 filteredConversations: DatabaseConversation[];
10 currentChatId: string | undefined;
11 isSearchModeActive: boolean;
13 onSelect: (id: string) => void;
14 onEdit: (id: string) => void;
15 onDelete: (id: string) => void;
16 onStop: (id: string) => void;
21 filteredConversations,
31 let conversationTree = $derived(buildConversationTree(filteredConversations));
33 let pinnedConversations = $derived(
34 conversationTree.filter(({ conversation }) => conversation.pinned)
37 let unpinnedConversations = $derived(
38 conversationTree.filter(({ conversation }) => !conversation.pinned)
41 const recentEmptyMessage = $derived(
42 searchQuery.length > 0 ? 'No results found' : 'No conversations yet'
46 {#if isSearchModeActive}
47 <SidebarNavigationSearchResults
50 {filteredConversations}
58 {#if pinnedConversations.length > 0}
59 <div class="py-2 flex whitespace-nowrap {className}">
61 class="text-muted-foreground inline-flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium gap-1"
63 <Pin class="h-3.5 w-3.5" />
69 <ul class="flex w-full min-w-0 flex-col gap-4 md:gap-1 {className}">
70 {#each pinnedConversations as { conversation, depth } (conversation.id)}
71 <li class="group/item relative mb-1 p-0">
72 <SidebarNavigationConversationItem
75 name: conversation.name,
76 lastModified: conversation.lastModified,
77 currNode: conversation.currNode,
78 forkedFromConversationId: conversation.forkedFromConversationId,
79 pinned: conversation.pinned
82 isActive={currentChatId === conversation.id}
93 <div class="mt-2 flex min-h-0 flex-1 flex-col gap-4 md:gap-2 whitespace-nowrap {className}">
94 {#if filteredConversations.length > 0}
96 class="text-muted-foreground flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium"
102 <div class="min-h-0 flex-1 md:overflow-y-auto">
103 <ul class="flex w-full min-w-0 flex-col gap-4 md:gap-1">
104 {#each unpinnedConversations as { conversation, depth } (conversation.id)}
105 <li class="group/item relative mb-1 p-0">
106 <SidebarNavigationConversationItem
109 name: conversation.name,
110 lastModified: conversation.lastModified,
111 currNode: conversation.currNode,
112 forkedFromConversationId: conversation.forkedFromConversationId,
113 pinned: conversation.pinned
116 isActive={currentChatId === conversation.id}
125 {#if unpinnedConversations.length === 0}
126 <li class="px-2 py-4 text-center">
127 <p class="mb-4 p-4 text-sm text-muted-foreground">