From bf2d00a9362f60d876d5676db6a6e5628a4fbf7b Mon Sep 17 00:00:00 2001 From: Enrico Ros Date: Sat, 2 May 2026 17:34:28 -0700 Subject: [PATCH] AppChat: filter by open beams --- .../components/layout-drawer/ChatDrawer.tsx | 14 ++++++++---- .../useChatDrawerRenderItems.tsx | 22 +++++++++++-------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/apps/chat/components/layout-drawer/ChatDrawer.tsx b/src/apps/chat/components/layout-drawer/ChatDrawer.tsx index 910ef741b..97f8034f8 100644 --- a/src/apps/chat/components/layout-drawer/ChatDrawer.tsx +++ b/src/apps/chat/components/layout-drawer/ChatDrawer.tsx @@ -16,6 +16,7 @@ import MoreVertIcon from '@mui/icons-material/MoreVert'; import StarOutlineRoundedIcon from '@mui/icons-material/StarOutlineRounded'; import type { DConversationId } from '~/common/stores/chat/chat.conversation'; +import { ChatBeamIcon } from '~/common/components/icons/ChatBeamIcon'; import { CloseablePopup } from '~/common/components/CloseablePopup'; import { DFolder, useFolderStore } from '~/common/stores/folders/store-chat-folders'; import { DebouncedInputMemo } from '~/common/components/DebouncedInput'; @@ -89,6 +90,7 @@ function ChatDrawer(props: { // external state const { clearFilters, + filterHasBeamOpen, toggleFilterHasBeamOpen, filterHasDocFragments, toggleFilterHasDocFragments, filterHasImageAssets, toggleFilterHasImageAssets, filterHasStars, toggleFilterHasStars, @@ -98,7 +100,7 @@ function ChatDrawer(props: { } = useChatDrawerFilters(); const { activeFolder, allFolders, enableFolders, toggleEnableFolders } = useFolders(props.activeFolderId); const { filteredChatsCount, filteredChatIDs, filteredChatsAreEmpty, filteredChatsBarBasis, filteredChatsIncludeActive, renderNavItems } = useChatDrawerRenderItems( - props.activeConversationId, props.chatPanesConversationIds, debouncedSearchQuery, activeFolder, allFolders, filterHasStars, filterHasImageAssets, filterHasDocFragments, filterIsArchived, navGrouping, searchSorting, showRelativeSize, searchDepth, + props.activeConversationId, props.chatPanesConversationIds, debouncedSearchQuery, activeFolder, allFolders, filterHasBeamOpen, filterHasStars, filterHasImageAssets, filterHasDocFragments, filterIsArchived, navGrouping, searchSorting, showRelativeSize, searchDepth, ); const [uiComplexityMode, contentScaling] = useUIPreferencesStore(useShallow((state) => [state.complexityMode, state.contentScaling])); const zenMode = uiComplexityMode === 'minimal'; @@ -240,6 +242,10 @@ function ChatDrawer(props: { {filterHasDocFragments && } Has Attachments + + {filterHasBeamOpen && } + Beam Open + @@ -288,8 +294,8 @@ function ChatDrawer(props: { )} ), [ - filterHasDocFragments, filterHasImageAssets, filterHasStars, isSearching, navGrouping, searchSorting, searchDepth, filterIsArchived, showPersonaIcons, showRelativeSize, - toggleFilterHasDocFragments, toggleFilterHasImageAssets, toggleFilterHasStars, toggleFilterIsArchived, toggleShowPersonaIcons, toggleShowRelativeSize, + filterHasBeamOpen, filterHasDocFragments, filterHasImageAssets, filterHasStars, isSearching, navGrouping, searchSorting, searchDepth, filterIsArchived, showPersonaIcons, showRelativeSize, + toggleFilterHasBeamOpen, toggleFilterHasDocFragments, toggleFilterHasImageAssets, toggleFilterHasStars, toggleFilterIsArchived, toggleShowPersonaIcons, toggleShowRelativeSize, ]); const displayNavItems = React.useMemo(() => { @@ -422,7 +428,7 @@ function ChatDrawer(props: { {filterHasStars && } {item.message} - {(filterHasStars || filterHasImageAssets || filterHasDocFragments || filterIsArchived) && ( + {(filterHasBeamOpen || filterHasStars || filterHasImageAssets || filterHasDocFragments || filterIsArchived) && ( diff --git a/src/apps/chat/components/layout-drawer/useChatDrawerRenderItems.tsx b/src/apps/chat/components/layout-drawer/useChatDrawerRenderItems.tsx index 519cc0f5e..00d835750 100644 --- a/src/apps/chat/components/layout-drawer/useChatDrawerRenderItems.tsx +++ b/src/apps/chat/components/layout-drawer/useChatDrawerRenderItems.tsx @@ -86,6 +86,7 @@ export function useChatDrawerRenderItems( filterByQuery: string, activeFolder: DFolder | null, allFolders: DFolder[], + filterHasBeamOpen: boolean, filterHasStars: boolean, filterHasImageAssets: boolean, filterHasDocFragments: boolean, @@ -146,7 +147,8 @@ export function useChatDrawerRenderItems( } // filter for required attributes - if ((filterHasStars && !hasStars) || (filterHasImageAssets && !hasImages) || (filterHasDocFragments && !hasDocs)) + const hasBeamOpen = openBeamConversationIds[_c.id]; + if ((filterHasBeamOpen && !hasBeamOpen) || (filterHasStars && !hasStars) || (filterHasImageAssets && !hasImages) || (filterHasDocFragments && !hasDocs)) return null; // rich properties @@ -186,7 +188,7 @@ export function useChatDrawerRenderItems( ? allFolders.find(folder => folder.conversationIds.includes(_c.id)) ?? null : null, updatedAt: _c.updated || _c.created || 0, - hasBeamOpen: !!openBeamConversationIds?.[_c.id], + hasBeamOpen, messageCount, beingGenerated: !!_c._abortController, // FIXME: when the AbortController is moved at the message level, derive the state in the conv systemPurposeId: _c.systemPurposeId, @@ -287,19 +289,21 @@ export function useChatDrawerRenderItems( renderNavItems.push({ type: 'nav-item-info-message', message: (filterHasStars && (filterHasImageAssets || filterHasDocFragments)) ? 'No results' - : filterHasDocFragments ? 'No attachment results' - : filterHasImageAssets ? 'No image results' - : filterHasStars ? 'No starred results' - : filterIsArchived ? 'No archived conversations' - : isSearching ? 'Text not found' - : 'No conversations in folder', + : filterHasBeamOpen ? 'No beam conversations' + : filterHasDocFragments ? 'No attachment results' + : filterHasImageAssets ? 'No image results' + : filterHasStars ? 'No starred results' + : filterIsArchived ? 'No archived conversations' + : isSearching ? 'Text not found' + : 'No conversations in folder', }); } else { // filtering reminder (will be rendered with a clear button too) - if (filterHasStars || filterHasImageAssets || filterHasDocFragments || filterIsArchived) { + if (filterHasBeamOpen || filterHasStars || filterHasImageAssets || filterHasDocFragments || filterIsArchived) { renderNavItems.unshift({ type: 'nav-item-info-message', message: `${filterIsArchived ? 'Showing' : 'Filtering by'} ${[ + filterHasBeamOpen && 'beam', filterHasStars && 'stars', filterHasImageAssets && 'images', filterHasDocFragments && 'attachments',