From cecaa174ce9b52006f580e624f4e5fefcfd4370e Mon Sep 17 00:00:00 2001 From: Ravi Kumar L Date: Tue, 9 Jun 2026 16:24:48 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=95=B3=EF=B8=8F=20fix:=20Guard=20Sparse?= =?UTF-8?q?=20Content=20Parts=20in=20Message=20Nav=20Preview=20(#13632)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Chat/Messages/MessageNav.tsx | 4 ++-- .../Messages/__tests__/MessageNav.spec.tsx | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/client/src/components/Chat/Messages/MessageNav.tsx b/client/src/components/Chat/Messages/MessageNav.tsx index 128618b9cd..2a4cd0a57e 100644 --- a/client/src/components/Chat/Messages/MessageNav.tsx +++ b/client/src/components/Chat/Messages/MessageNav.tsx @@ -3,8 +3,8 @@ import { ChevronUp, ChevronDown } from 'lucide-react'; import { ContentTypes } from 'librechat-data-provider'; import { HoverCard, HoverCardTrigger, HoverCardPortal, HoverCardContent } from '@librechat/client'; import type { TMessage, TMessageContentParts } from 'librechat-data-provider'; -import { useGetMessagesByConvoId } from '~/data-provider'; import { useMessagesConversation, useMessagesSubmission } from '~/Providers'; +import { useGetMessagesByConvoId } from '~/data-provider'; import { useLocalize } from '~/hooks'; import { cn } from '~/utils'; @@ -19,7 +19,7 @@ function extractPreviewFromContent(content?: TMessageContentParts[]): string { return ''; } for (const part of content) { - if (part.type !== ContentTypes.TEXT) { + if (part?.type !== ContentTypes.TEXT) { continue; } const textField = part.text; diff --git a/client/src/components/Chat/Messages/__tests__/MessageNav.spec.tsx b/client/src/components/Chat/Messages/__tests__/MessageNav.spec.tsx index 2324c7b0d0..4cc9d4008a 100644 --- a/client/src/components/Chat/Messages/__tests__/MessageNav.spec.tsx +++ b/client/src/components/Chat/Messages/__tests__/MessageNav.spec.tsx @@ -9,6 +9,13 @@ type TestMessage = { conversationId?: string; text?: string; isCreatedByUser?: boolean; + content?: Array< + | { + type?: string; + text?: string | { value?: string }; + } + | undefined + >; }; const mockUseGetMessagesByConvoId = jest.fn(); @@ -294,6 +301,22 @@ describe('MessageNav', () => { expect(text.endsWith('...')).toBe(true); expect(text.length).toBe(83); }); + + it('skips sparse content entries when deriving preview text', () => { + const messages = [ + buildMessage({ + messageId: 'a', + text: '', + isCreatedByUser: true, + content: [undefined, { type: 'text', text: 'content-preview' }], + }), + buildMessage({ messageId: 'b', text: 'bravo' }), + buildMessage({ messageId: 'c', text: 'charlie', isCreatedByUser: true }), + ]; + const { container } = renderNav(messages); + const preview = container.querySelectorAll('[data-testid="hover-card-content"] p')[0]; + expect(preview).toHaveTextContent('content-preview'); + }); }); describe('accessibility', () => {