From 7270872ef086e9be2f3db9986ef4c50d8c65b28e Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Tue, 25 Nov 2025 14:46:46 +0900 Subject: [PATCH 1/2] Fix a bug where mentionedMessageTemplate is being set even when the message is not a mentioned message --- src/modules/Message/components/TextFragment/index.tsx | 2 ++ src/ui/MessageInput/index.tsx | 3 ++- src/ui/MessageInput/utils.ts | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/modules/Message/components/TextFragment/index.tsx b/src/modules/Message/components/TextFragment/index.tsx index b32997d93..bd7777fa1 100644 --- a/src/modules/Message/components/TextFragment/index.tsx +++ b/src/modules/Message/components/TextFragment/index.tsx @@ -50,6 +50,8 @@ export default function TextFragment({ : 'sendbird-label--color-onbackground-1' } href={asSafeURL(groups[2])} + target="_blank" + rel="noopener noreferrer" > diff --git a/src/ui/MessageInput/index.tsx b/src/ui/MessageInput/index.tsx index 3d9441f02..54ab2aa95 100644 --- a/src/ui/MessageInput/index.tsx +++ b/src/ui/MessageInput/index.tsx @@ -349,8 +349,9 @@ const MessageInput = React.forwardRef((prop try { const textField = internalRef?.current; if (!isEdit && textField?.textContent) { - const { messageText, mentionTemplate } = extractTextAndMentions(textField.childNodes); + const { messageText, mentionTemplate, isMentionedMessage } = extractTextAndMentions(textField.childNodes); const params = { message: messageText, mentionTemplate }; + if (!isMentionedMessage) params.mentionTemplate = ''; onSendMessage(params); resetInput(internalRef); /** diff --git a/src/ui/MessageInput/utils.ts b/src/ui/MessageInput/utils.ts index 2d241cb37..13929f094 100644 --- a/src/ui/MessageInput/utils.ts +++ b/src/ui/MessageInput/utils.ts @@ -34,10 +34,12 @@ function isHTMLElement(node: ChildNode): node is HTMLElement { export function extractTextAndMentions(childNodes: NodeListOf) { let messageText = ''; let mentionTemplate = ''; + let isMentionedMessage = false; childNodes.forEach((node) => { if (isHTMLElement(node) && node.nodeName === NodeNames.Span) { const { innerText, dataset = {} } = node; const { userid = '' } = dataset; + if (userid) isMentionedMessage = true; messageText += innerText; mentionTemplate += `${USER_MENTION_TEMP_CHAR}{${userid}}`; } else if (isHTMLElement(node) && node.nodeName === NodeNames.Br) { @@ -53,5 +55,5 @@ export function extractTextAndMentions(childNodes: NodeListOf) { mentionTemplate += textContent; } }); - return { messageText, mentionTemplate }; + return { messageText, mentionTemplate, isMentionedMessage }; } From c00f1bb42a9238915ab97cb4f85b134e0c054faa Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Tue, 25 Nov 2025 15:10:52 +0900 Subject: [PATCH 2/2] fixed test --- src/ui/MessageInput/__tests__/MessageInput.spec.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ui/MessageInput/__tests__/MessageInput.spec.js b/src/ui/MessageInput/__tests__/MessageInput.spec.js index 3f99de316..5fb340219 100644 --- a/src/ui/MessageInput/__tests__/MessageInput.spec.js +++ b/src/ui/MessageInput/__tests__/MessageInput.spec.js @@ -172,7 +172,7 @@ describe('ui/MessageInput', () => { expect(input.textContent).toBe(mockText); fireEvent.keyDown(input, { key: 'Enter' }); - expect(onSendMessage).toHaveBeenCalledWith({ mentionTemplate: mockText, message: mockText }); + expect(onSendMessage).toHaveBeenCalledWith({ mentionTemplate: '', message: mockText }); }); it('should call sendMessage with valid string; new lines included', async () => { @@ -187,7 +187,7 @@ describe('ui/MessageInput', () => { expect(input.textContent).toBe(mockText); fireEvent.keyDown(input, { key: 'Enter' }); - expect(onSendMessage).toHaveBeenCalledWith({ mentionTemplate: mockText, message: mockText }); + expect(onSendMessage).toHaveBeenCalledWith({ mentionTemplate: '', message: mockText }); }); it('should not call sendMessage with invalid string; only white spaces', async() => { @@ -202,7 +202,7 @@ describe('ui/MessageInput', () => { expect(input.textContent).toBe(mockText); fireEvent.keyDown(input, { key: 'Enter' }); - expect(onSendMessage).not.toHaveBeenCalledWith({ mentionTemplate: mockText, message: mockText }); + expect(onSendMessage).not.toHaveBeenCalledWith({ mentionTemplate: '', message: mockText }); }); it('should render send icon if text is present', async() => {