From 81588b9b01fde7abf5fb9713ac0c189580fcdb18 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 17 Nov 2025 16:12:03 +0530 Subject: [PATCH 1/8] Markdown composer improved --- .../MessageComposer/components/ComposerInput.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/containers/MessageComposer/components/ComposerInput.tsx b/app/containers/MessageComposer/components/ComposerInput.tsx index 178ca3b58b1..d0cdee6ecae 100644 --- a/app/containers/MessageComposer/components/ComposerInput.tsx +++ b/app/containers/MessageComposer/components/ComposerInput.tsx @@ -129,10 +129,15 @@ export const ComposerInput = memo( const { start, end } = selectionRef.current; const text = textRef.current; const markdown = MARKDOWN_STYLES[style]; - const newText = `${text.substr(0, start)}${markdown}${text.substr(start, end - start)}${markdown}${text.substr(end)}`; + const isCodeBlock = style === 'code-block'; + const startingText = text.substr(0, start); + + const newText = `${startingText}${startingText.length > 0 ? isCodeBlock ? '\n' : ' ' : ''}${markdown}${isCodeBlock ? '\n\n' : ''}${text.substr(start, end - start)}${markdown}${text.substr(end)}`; + const length = isCodeBlock ? (startingText.length > 0 ? 1 : 0) + markdown.length + (isCodeBlock ? 1 : 0) : markdown.length + (startingText.length > 0 && !isCodeBlock ? 1 : 0); + setInput(newText, { - start: start + markdown.length, - end: start === end ? start + markdown.length : end + markdown.length + start: start + length, + end: start === end ? start + length : end + length }); }); emitter.on('toolbarMention', () => { @@ -157,7 +162,7 @@ export const ComposerInput = memo( useImperativeHandle(ref, () => ({ getTextAndClear: () => { const text = textRef.current; - setInput('', undefined, true); + setInput('', { start: 0, end: 0 }, true); return text; }, getText: () => textRef.current, From f60eddbe7ac5e5b12d6a5d7f3288da4c890566bf Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 17 Nov 2025 16:29:57 +0530 Subject: [PATCH 2/8] lint fix --- .../components/ComposerInput.tsx | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/app/containers/MessageComposer/components/ComposerInput.tsx b/app/containers/MessageComposer/components/ComposerInput.tsx index d0cdee6ecae..2410f03fe3f 100644 --- a/app/containers/MessageComposer/components/ComposerInput.tsx +++ b/app/containers/MessageComposer/components/ComposerInput.tsx @@ -45,6 +45,30 @@ import useIOSBackSwipeHandler from '../hooks/useIOSBackSwipeHandler'; const defaultSelection: IInputSelection = { start: 0, end: 0 }; +function calculateLength(startingText: string, markdown: string, isCodeBlock: boolean){ + if(isCodeBlock){ + if(startingText.length > 0){ + return markdown.length + 2; + } + + return markdown.length + 1; + } + + return markdown.length + (startingText.length > 0 ? 1 : 0); +} + +function getSeparator(startingText: string, isCodeBlock: boolean){ + if(startingText.length === 0){ + return ''; + } + + if(isCodeBlock){ + return '\n'; + } + + return ' '; +} + export const ComposerInput = memo( forwardRef(({ inputRef }, ref) => { const { colors, theme } = useTheme(); @@ -132,8 +156,11 @@ export const ComposerInput = memo( const isCodeBlock = style === 'code-block'; const startingText = text.substr(0, start); - const newText = `${startingText}${startingText.length > 0 ? isCodeBlock ? '\n' : ' ' : ''}${markdown}${isCodeBlock ? '\n\n' : ''}${text.substr(start, end - start)}${markdown}${text.substr(end)}`; - const length = isCodeBlock ? (startingText.length > 0 ? 1 : 0) + markdown.length + (isCodeBlock ? 1 : 0) : markdown.length + (startingText.length > 0 && !isCodeBlock ? 1 : 0); + const separator = getSeparator(startingText, isCodeBlock); + const closingNewlines = isCodeBlock ? '\n\n' : ''; + + const newText = `${startingText}${separator}${markdown}${closingNewlines}${text.substr(start, end - start)}${markdown}${text.substr(end)}`; + const length = calculateLength(startingText, markdown, isCodeBlock); setInput(newText, { start: start + length, From 5dec6bd23506f12c6fe9e0168461f5078faaa3f5 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 17 Nov 2025 17:50:30 +0530 Subject: [PATCH 3/8] More improvements --- .../MessageComposer/MessageComposer.test.tsx | 4 ++-- .../components/ComposerInput.tsx | 20 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/containers/MessageComposer/MessageComposer.test.tsx b/app/containers/MessageComposer/MessageComposer.test.tsx index 644decabae8..6aa8cba8fc3 100644 --- a/app/containers/MessageComposer/MessageComposer.test.tsx +++ b/app/containers/MessageComposer/MessageComposer.test.tsx @@ -365,7 +365,7 @@ describe('MessageComposer', () => { await user.press(screen.getByTestId('message-composer-code-block')); await user.press(screen.getByTestId('message-composer-send')); expect(onSendMessage).toHaveBeenCalledTimes(1); - expect(onSendMessage).toHaveBeenCalledWith('``````', undefined); + expect(onSendMessage).toHaveBeenCalledWith('```\n\n```', undefined); expect(screen.toJSON()).toMatchSnapshot(); }); @@ -384,7 +384,7 @@ describe('MessageComposer', () => { await user.press(screen.getByTestId('message-composer-code-block')); await user.press(screen.getByTestId('message-composer-send')); expect(onSendMessage).toHaveBeenCalledTimes(1); - expect(onSendMessage).toHaveBeenCalledWith('```test```', undefined); + expect(onSendMessage).toHaveBeenCalledWith('```\n\ntest\n```', undefined); expect(screen.toJSON()).toMatchSnapshot(); }); }); diff --git a/app/containers/MessageComposer/components/ComposerInput.tsx b/app/containers/MessageComposer/components/ComposerInput.tsx index 2410f03fe3f..b591bf835e5 100644 --- a/app/containers/MessageComposer/components/ComposerInput.tsx +++ b/app/containers/MessageComposer/components/ComposerInput.tsx @@ -45,7 +45,7 @@ import useIOSBackSwipeHandler from '../hooks/useIOSBackSwipeHandler'; const defaultSelection: IInputSelection = { start: 0, end: 0 }; -function calculateLength(startingText: string, markdown: string, isCodeBlock: boolean){ +function calculateLength(startingText: string, markdown: string, isCodeBlock: boolean, start: number, end: number){ if(isCodeBlock){ if(startingText.length > 0){ return markdown.length + 2; @@ -54,7 +54,9 @@ function calculateLength(startingText: string, markdown: string, isCodeBlock: bo return markdown.length + 1; } - return markdown.length + (startingText.length > 0 ? 1 : 0); + const endWithSpace = startingText.endsWith(' '); + + return markdown.length + (startingText.length > 0 ? 1 : 0) + (endWithSpace ? -1 : 0); } function getSeparator(startingText: string, isCodeBlock: boolean){ @@ -66,7 +68,7 @@ function getSeparator(startingText: string, isCodeBlock: boolean){ return '\n'; } - return ' '; + return startingText.endsWith(' ') ? '' : ' '; } export const ComposerInput = memo( @@ -155,12 +157,14 @@ export const ComposerInput = memo( const markdown = MARKDOWN_STYLES[style]; const isCodeBlock = style === 'code-block'; const startingText = text.substr(0, start); + console.log(style); const separator = getSeparator(startingText, isCodeBlock); - const closingNewlines = isCodeBlock ? '\n\n' : ''; + const closingNewlines = (isCodeBlock) ? '\n\n' : ''; + const beforeMarkdownClose = (isCodeBlock && start !== end) ? '\n' : ''; - const newText = `${startingText}${separator}${markdown}${closingNewlines}${text.substr(start, end - start)}${markdown}${text.substr(end)}`; - const length = calculateLength(startingText, markdown, isCodeBlock); + const newText = `${startingText}${separator}${markdown}${closingNewlines}${text.substr(start, end - start)}${beforeMarkdownClose}${markdown}${text.substr(end)}`; + const length = calculateLength(startingText, markdown, isCodeBlock, start, end); setInput(newText, { start: start + length, @@ -200,7 +204,7 @@ export const ComposerInput = memo( })); const setInput: TSetInput = (text, selection, forceUpdateDraftMessage) => { - const message = text.trim(); + const message = text; textRef.current = message; if (forceUpdateDraftMessage) { @@ -319,7 +323,7 @@ export const ComposerInput = memo( default: mention = ''; } - const newText = `${result}${mention} ${text.slice(cursor)}`; + const newText = `${result}${mention} ${text.slice(cursor)}`.trim() const newCursor = result.length + mention.length + 1; setInput(newText, { start: newCursor, end: newCursor }); From bf05b7e17717e02818f25d194e3e52f05355262d Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 17 Nov 2025 17:54:32 +0530 Subject: [PATCH 4/8] fix lint --- app/containers/MessageComposer/components/ComposerInput.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/MessageComposer/components/ComposerInput.tsx b/app/containers/MessageComposer/components/ComposerInput.tsx index b591bf835e5..8588f3775d6 100644 --- a/app/containers/MessageComposer/components/ComposerInput.tsx +++ b/app/containers/MessageComposer/components/ComposerInput.tsx @@ -45,7 +45,7 @@ import useIOSBackSwipeHandler from '../hooks/useIOSBackSwipeHandler'; const defaultSelection: IInputSelection = { start: 0, end: 0 }; -function calculateLength(startingText: string, markdown: string, isCodeBlock: boolean, start: number, end: number){ +function calculateLength(startingText: string, markdown: string, isCodeBlock: boolean){ if(isCodeBlock){ if(startingText.length > 0){ return markdown.length + 2; From dd1899b61b795d96bcb73695df47cc2c20367bd3 Mon Sep 17 00:00:00 2001 From: Rohit3523 Date: Mon, 17 Nov 2025 12:26:58 +0000 Subject: [PATCH 5/8] chore: format code and fix lint issues [skip ci] --- .../components/ComposerInput.tsx | 67 ++++++++++--------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/app/containers/MessageComposer/components/ComposerInput.tsx b/app/containers/MessageComposer/components/ComposerInput.tsx index 8588f3775d6..9429a6977f8 100644 --- a/app/containers/MessageComposer/components/ComposerInput.tsx +++ b/app/containers/MessageComposer/components/ComposerInput.tsx @@ -45,30 +45,30 @@ import useIOSBackSwipeHandler from '../hooks/useIOSBackSwipeHandler'; const defaultSelection: IInputSelection = { start: 0, end: 0 }; -function calculateLength(startingText: string, markdown: string, isCodeBlock: boolean){ - if(isCodeBlock){ - if(startingText.length > 0){ - return markdown.length + 2; - } - - return markdown.length + 1; - } - - const endWithSpace = startingText.endsWith(' '); - - return markdown.length + (startingText.length > 0 ? 1 : 0) + (endWithSpace ? -1 : 0); +function calculateLength(startingText: string, markdown: string, isCodeBlock: boolean) { + if (isCodeBlock) { + if (startingText.length > 0) { + return markdown.length + 2; + } + + return markdown.length + 1; + } + + const endWithSpace = startingText.endsWith(' '); + + return markdown.length + (startingText.length > 0 ? 1 : 0) + (endWithSpace ? -1 : 0); } -function getSeparator(startingText: string, isCodeBlock: boolean){ - if(startingText.length === 0){ - return ''; - } +function getSeparator(startingText: string, isCodeBlock: boolean) { + if (startingText.length === 0) { + return ''; + } - if(isCodeBlock){ - return '\n'; - } + if (isCodeBlock) { + return '\n'; + } - return startingText.endsWith(' ') ? '' : ' '; + return startingText.endsWith(' ') ? '' : ' '; } export const ComposerInput = memo( @@ -155,17 +155,20 @@ export const ComposerInput = memo( const { start, end } = selectionRef.current; const text = textRef.current; const markdown = MARKDOWN_STYLES[style]; - const isCodeBlock = style === 'code-block'; - const startingText = text.substr(0, start); - console.log(style); - - const separator = getSeparator(startingText, isCodeBlock); - const closingNewlines = (isCodeBlock) ? '\n\n' : ''; - const beforeMarkdownClose = (isCodeBlock && start !== end) ? '\n' : ''; - - const newText = `${startingText}${separator}${markdown}${closingNewlines}${text.substr(start, end - start)}${beforeMarkdownClose}${markdown}${text.substr(end)}`; - const length = calculateLength(startingText, markdown, isCodeBlock, start, end); - + const isCodeBlock = style === 'code-block'; + const startingText = text.substr(0, start); + console.log(style); + + const separator = getSeparator(startingText, isCodeBlock); + const closingNewlines = isCodeBlock ? '\n\n' : ''; + const beforeMarkdownClose = isCodeBlock && start !== end ? '\n' : ''; + + const newText = `${startingText}${separator}${markdown}${closingNewlines}${text.substr( + start, + end - start + )}${beforeMarkdownClose}${markdown}${text.substr(end)}`; + const length = calculateLength(startingText, markdown, isCodeBlock, start, end); + setInput(newText, { start: start + length, end: start === end ? start + length : end + length @@ -323,7 +326,7 @@ export const ComposerInput = memo( default: mention = ''; } - const newText = `${result}${mention} ${text.slice(cursor)}`.trim() + const newText = `${result}${mention} ${text.slice(cursor)}`.trim(); const newCursor = result.length + mention.length + 1; setInput(newText, { start: newCursor, end: newCursor }); From 3b10c40a26cea62172405170aff912f835aaf6df Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 17 Nov 2025 17:57:45 +0530 Subject: [PATCH 6/8] lint fix --- app/containers/MessageComposer/components/ComposerInput.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/MessageComposer/components/ComposerInput.tsx b/app/containers/MessageComposer/components/ComposerInput.tsx index 9429a6977f8..4a56fd59d0f 100644 --- a/app/containers/MessageComposer/components/ComposerInput.tsx +++ b/app/containers/MessageComposer/components/ComposerInput.tsx @@ -167,7 +167,7 @@ export const ComposerInput = memo( start, end - start )}${beforeMarkdownClose}${markdown}${text.substr(end)}`; - const length = calculateLength(startingText, markdown, isCodeBlock, start, end); + const length = calculateLength(startingText, markdown, isCodeBlock); setInput(newText, { start: start + length, From 4d2c3b1077665ec57b60d6241952fdc5d5e9a2c3 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 20 Nov 2025 22:03:31 +0530 Subject: [PATCH 7/8] Some improvements --- .../MessageComposer/components/ComposerInput.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/containers/MessageComposer/components/ComposerInput.tsx b/app/containers/MessageComposer/components/ComposerInput.tsx index 4a56fd59d0f..ca63fb622a8 100644 --- a/app/containers/MessageComposer/components/ComposerInput.tsx +++ b/app/containers/MessageComposer/components/ComposerInput.tsx @@ -65,6 +65,10 @@ function getSeparator(startingText: string, isCodeBlock: boolean) { } if (isCodeBlock) { + if (/```(\s*)$/.test(startingText)) { + return ''; + } + return '\n'; } @@ -157,13 +161,11 @@ export const ComposerInput = memo( const markdown = MARKDOWN_STYLES[style]; const isCodeBlock = style === 'code-block'; const startingText = text.substr(0, start); - console.log(style); const separator = getSeparator(startingText, isCodeBlock); - const closingNewlines = isCodeBlock ? '\n\n' : ''; - const beforeMarkdownClose = isCodeBlock && start !== end ? '\n' : ''; + const beforeMarkdownClose = isCodeBlock ? '\n' : ''; - const newText = `${startingText}${separator}${markdown}${closingNewlines}${text.substr( + const newText = `${startingText}${separator}${markdown}${beforeMarkdownClose}${text.substr( start, end - start )}${beforeMarkdownClose}${markdown}${text.substr(end)}`; From 6629a256bcdf7e8fd37f2d6778b961f8001ebc5b Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 20 Nov 2025 22:03:35 +0530 Subject: [PATCH 8/8] Test fix --- app/containers/MessageComposer/MessageComposer.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/MessageComposer/MessageComposer.test.tsx b/app/containers/MessageComposer/MessageComposer.test.tsx index 6aa8cba8fc3..258f2e231e4 100644 --- a/app/containers/MessageComposer/MessageComposer.test.tsx +++ b/app/containers/MessageComposer/MessageComposer.test.tsx @@ -384,7 +384,7 @@ describe('MessageComposer', () => { await user.press(screen.getByTestId('message-composer-code-block')); await user.press(screen.getByTestId('message-composer-send')); expect(onSendMessage).toHaveBeenCalledTimes(1); - expect(onSendMessage).toHaveBeenCalledWith('```\n\ntest\n```', undefined); + expect(onSendMessage).toHaveBeenCalledWith('```\ntest\n```', undefined); expect(screen.toJSON()).toMatchSnapshot(); }); });