From 4886fb1ca562e75050dae1776d31d053b8418596 Mon Sep 17 00:00:00 2001 From: Prakash Baskaran Date: Wed, 29 Jan 2025 14:03:58 +0530 Subject: [PATCH 1/4] Web - Chat - Pasted message not always displays no hyperlink format when paste as plain text --- src/hooks/useHtmlPaste/index.ts | 6 +++--- src/pages/home/report/ContextMenu/ContextMenuActions.tsx | 6 ++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/hooks/useHtmlPaste/index.ts b/src/hooks/useHtmlPaste/index.ts index 1a7e62f3141e..67f4117d0e6b 100644 --- a/src/hooks/useHtmlPaste/index.ts +++ b/src/hooks/useHtmlPaste/index.ts @@ -89,9 +89,9 @@ const useHtmlPaste: UseHtmlPaste = (textInputRef, preHtmlPasteCallback, isActive */ const handlePastePlainText = useCallback( (event: ClipboardEvent) => { - const plainText = event.clipboardData?.getData('text/plain'); - if (plainText) { - paste(plainText); + const markdownText = event.clipboardData?.getData('text/plain'); + if (markdownText) { + paste(Parser.htmlToText(Parser.replace(markdownText))); } }, [paste], diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx index bf5e1b253f3f..694d8eea5ab5 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx @@ -119,10 +119,8 @@ function setClipboardMessage(content: string | undefined) { if (!Clipboard.canSetHtml()) { Clipboard.setString(Parser.htmlToMarkdown(content)); } else { - const anchorRegex = CONST.REGEX_LINK_IN_ANCHOR; - const isAnchorTag = anchorRegex.test(content); - const plainText = isAnchorTag ? Parser.htmlToMarkdown(content) : Parser.htmlToText(content); - Clipboard.setHtml(content, plainText); + const markdownText = Parser.htmlToMarkdown(content); + Clipboard.setHtml(content, markdownText); } } From 668e6ae095889a8d7d99ac464ab6d810cb233681 Mon Sep 17 00:00:00 2001 From: Prakash Baskaran Date: Thu, 6 Feb 2025 10:24:22 +0530 Subject: [PATCH 2/4] Added isMobile check when paste as plain text --- src/hooks/useHtmlPaste/index.ts | 4 +++- src/utils/isMobile/index.native.ts | 5 +++++ src/utils/isMobile/index.ts | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/utils/isMobile/index.native.ts create mode 100644 src/utils/isMobile/index.ts diff --git a/src/hooks/useHtmlPaste/index.ts b/src/hooks/useHtmlPaste/index.ts index 67f4117d0e6b..690b64aeec3a 100644 --- a/src/hooks/useHtmlPaste/index.ts +++ b/src/hooks/useHtmlPaste/index.ts @@ -1,6 +1,7 @@ import {useCallback, useEffect} from 'react'; import Parser from '@libs/Parser'; import CONST from '@src/CONST'; +import isMobile from '@src/utils/isMobile'; import type UseHtmlPaste from './types'; const insertAtCaret = (target: HTMLElement, insertedText: string, maxLength: number) => { @@ -91,7 +92,8 @@ const useHtmlPaste: UseHtmlPaste = (textInputRef, preHtmlPasteCallback, isActive (event: ClipboardEvent) => { const markdownText = event.clipboardData?.getData('text/plain'); if (markdownText) { - paste(Parser.htmlToText(Parser.replace(markdownText))); + const parsedText = isMobile() ? markdownText : Parser.htmlToText(Parser.replace(markdownText)); + paste(parsedText); } }, [paste], diff --git a/src/utils/isMobile/index.native.ts b/src/utils/isMobile/index.native.ts new file mode 100644 index 000000000000..f90e703288f1 --- /dev/null +++ b/src/utils/isMobile/index.native.ts @@ -0,0 +1,5 @@ +import {Platform} from 'react-native'; + +const isMobile = () => ['ios', 'android'].includes(Platform.OS); + +export default isMobile; diff --git a/src/utils/isMobile/index.ts b/src/utils/isMobile/index.ts new file mode 100644 index 000000000000..3870d61c0e14 --- /dev/null +++ b/src/utils/isMobile/index.ts @@ -0,0 +1,3 @@ +const isMobile = () => /Mobi|Android|iPhone|iPad|iPod|Windows Phone/i.test(navigator?.userAgent || ''); + +export default isMobile; From c97af1978b2261b88efabe532ea3b099c7e8742b Mon Sep 17 00:00:00 2001 From: Prakash Baskaran Date: Thu, 6 Feb 2025 10:39:33 +0530 Subject: [PATCH 3/4] Removed redundant isMobile util --- src/utils/isMobile/index.native.ts | 5 ----- src/utils/isMobile/index.ts | 3 --- 2 files changed, 8 deletions(-) delete mode 100644 src/utils/isMobile/index.native.ts delete mode 100644 src/utils/isMobile/index.ts diff --git a/src/utils/isMobile/index.native.ts b/src/utils/isMobile/index.native.ts deleted file mode 100644 index f90e703288f1..000000000000 --- a/src/utils/isMobile/index.native.ts +++ /dev/null @@ -1,5 +0,0 @@ -import {Platform} from 'react-native'; - -const isMobile = () => ['ios', 'android'].includes(Platform.OS); - -export default isMobile; diff --git a/src/utils/isMobile/index.ts b/src/utils/isMobile/index.ts deleted file mode 100644 index 3870d61c0e14..000000000000 --- a/src/utils/isMobile/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -const isMobile = () => /Mobi|Android|iPhone|iPad|iPod|Windows Phone/i.test(navigator?.userAgent || ''); - -export default isMobile; From 9ed76b256ea776650c4f8ffe703cfa0c2aceaa32 Mon Sep 17 00:00:00 2001 From: Prakash Baskaran Date: Thu, 6 Feb 2025 11:02:05 +0530 Subject: [PATCH 4/4] Fixed commit and added comment to explain the changes --- src/hooks/useHtmlPaste/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hooks/useHtmlPaste/index.ts b/src/hooks/useHtmlPaste/index.ts index 690b64aeec3a..1a5606ef48ad 100644 --- a/src/hooks/useHtmlPaste/index.ts +++ b/src/hooks/useHtmlPaste/index.ts @@ -1,7 +1,7 @@ import {useCallback, useEffect} from 'react'; +import {isMobile} from '@libs/Browser'; import Parser from '@libs/Parser'; import CONST from '@src/CONST'; -import isMobile from '@src/utils/isMobile'; import type UseHtmlPaste from './types'; const insertAtCaret = (target: HTMLElement, insertedText: string, maxLength: number) => { @@ -91,6 +91,10 @@ const useHtmlPaste: UseHtmlPaste = (textInputRef, preHtmlPasteCallback, isActive const handlePastePlainText = useCallback( (event: ClipboardEvent) => { const markdownText = event.clipboardData?.getData('text/plain'); + // Updated paste logic to address issue #53718 + // When copying from a chat conversation, the clipboard contains markdown-formatted text. + // On desktop web, users have the option to paste as plain text, but this feature is unavailable on mobile web. + // A conditional check is added to determine whether to retain markdown or convert it to plain text based on the platform. if (markdownText) { const parsedText = isMobile() ? markdownText : Parser.htmlToText(Parser.replace(markdownText)); paste(parsedText);