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() => {