From 86a0ac7beb0bf983ede2631ebfebd5b2f075597d Mon Sep 17 00:00:00 2001 From: Jack Kingsman Date: Wed, 15 Apr 2026 19:13:29 -0700 Subject: [PATCH] Don't strip outgoing colons on DMs or room servers. Closes #198. --- frontend/src/components/MessageList.tsx | 12 +++++++----- frontend/src/test/messageList.test.tsx | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/MessageList.tsx b/frontend/src/components/MessageList.tsx index bc8f811..479d083 100644 --- a/frontend/src/components/MessageList.tsx +++ b/frontend/src/components/MessageList.tsx @@ -9,7 +9,7 @@ import { type ReactNode, } from 'react'; import type { Channel, Contact, Message, MessagePath, RadioConfig, RawPacket } from '../types'; -import { CONTACT_TYPE_REPEATER, CONTACT_TYPE_ROOM } from '../types'; +import { CONTACT_TYPE_ROOM } from '../types'; import { api } from '../api'; import { findLinkedChannelReferences, @@ -808,12 +808,13 @@ export function MessageList({ {sortedMessages.map((msg, index) => { // For DMs, look up contact; for channel messages, use parsed sender const contact = msg.type === 'PRIV' ? getContact(msg.conversation_key) : null; - const isRepeater = contact?.type === CONTACT_TYPE_REPEATER; const isRoomServer = contact?.type === CONTACT_TYPE_ROOM; - // Skip sender parsing for repeater messages (CLI responses often have colons) + // Only parse "sender: text" prefix for channel messages — DMs never carry + // an in-text sender prefix, so parsing them would incorrectly strip + // user text that happens to contain a colon (e.g. "TEST1: TEST2"). const { sender, content } = - isRepeater || (isRoomServer && msg.type === 'PRIV') + msg.type === 'PRIV' ? { sender: null, content: msg.text } : parseSenderFromText(msg.text); const directSenderName = @@ -845,7 +846,8 @@ export function MessageList({ isCorruptChannelMessage ); const prevMsg = sortedMessages[index - 1]; - const prevParsedSender = prevMsg ? parseSenderFromText(prevMsg.text).sender : null; + const prevParsedSender = + prevMsg && prevMsg.type === 'CHAN' ? parseSenderFromText(prevMsg.text).sender : null; const prevSenderKey = prevMsg ? getSenderKey( prevMsg, diff --git a/frontend/src/test/messageList.test.tsx b/frontend/src/test/messageList.test.tsx index dc3e266..d469d27 100644 --- a/frontend/src/test/messageList.test.tsx +++ b/frontend/src/test/messageList.test.tsx @@ -220,6 +220,24 @@ describe('MessageList channel sender rendering', () => { expect(onChannelReferenceClick).toHaveBeenCalledWith('#ops-room'); }); + it('does not strip colon-prefixed text in direct messages (issue #198)', () => { + render( + + ); + + expect(screen.getByText('TEST1: TEST2')).toBeInTheDocument(); + }); + it('renders and dismisses an unread marker at the first unread message boundary', async () => { const user = userEvent.setup(); const messages = [