diff --git a/src/libs/ModifiedExpenseMessage.ts b/src/libs/ModifiedExpenseMessage.ts index 66c66cf4e88f7..d9ae8647a71a3 100644 --- a/src/libs/ModifiedExpenseMessage.ts +++ b/src/libs/ModifiedExpenseMessage.ts @@ -333,8 +333,8 @@ function getForReportAction({ buildMessageFragmentForValue( // eslint-disable-next-line @typescript-eslint/no-deprecated translateLocal, - Parser.htmlToMarkdown(reportActionOriginalMessage?.newComment ?? ''), - Parser.htmlToMarkdown(reportActionOriginalMessage?.oldComment ?? ''), + reportActionOriginalMessage?.newComment ?? '', + reportActionOriginalMessage?.oldComment ?? '', descriptionLabel, true, setFragments, @@ -643,8 +643,8 @@ function getForReportActionTemp({ buildMessageFragmentForValue( translate, - Parser.htmlToMarkdown(reportActionOriginalMessage?.newComment ?? ''), - Parser.htmlToMarkdown(reportActionOriginalMessage?.oldComment ?? ''), + reportActionOriginalMessage?.newComment ?? '', + reportActionOriginalMessage?.oldComment ?? '', descriptionLabel, true, setFragments, diff --git a/src/libs/Notification/LocalNotification/BrowserNotifications.ts b/src/libs/Notification/LocalNotification/BrowserNotifications.ts index 9dbd6982ea9eb..a237a854efd01 100644 --- a/src/libs/Notification/LocalNotification/BrowserNotifications.ts +++ b/src/libs/Notification/LocalNotification/BrowserNotifications.ts @@ -144,7 +144,7 @@ export default { currentUserLogin, }: LocalNotificationModifiedExpensePushParams) { const title = reportAction.person?.map((f) => f.text).join(', ') ?? ''; - const body = getForReportActionTemp({ + const bodyWithHTML = getForReportActionTemp({ // eslint-disable-next-line @typescript-eslint/no-deprecated -- translateLocal is deprecated; BrowserNotifications is non-React code that cannot use the translate hook translate: translateLocal, reportAction, @@ -154,6 +154,8 @@ export default { policyTags, currentUserLogin, }); + // Strip HTML tags for plain text notification body + const body = getTextFromHtml(bodyWithHTML); const icon = usesIcon ? EXPENSIFY_ICON_URL : ''; const data = { reportID: report.reportID, diff --git a/src/libs/OptionsListUtils/index.ts b/src/libs/OptionsListUtils/index.ts index 2530ec6561898..110d8018180e5 100644 --- a/src/libs/OptionsListUtils/index.ts +++ b/src/libs/OptionsListUtils/index.ts @@ -725,7 +725,7 @@ function getLastMessageTextForReport({ } else if (isReportMessageAttachment({text: report?.lastMessageText ?? '', html: report?.lastMessageHtml, type: ''})) { lastMessageTextFromReport = `[${translate('common.attachment')}]`; } else if (isModifiedExpenseAction(lastReportAction)) { - const properSchemaForModifiedExpenseMessage = policyTags + const properSchemaForModifiedExpenseMessageWithHTML = policyTags ? getForReportActionTemp({ translate, reportAction: lastReportAction, @@ -743,6 +743,8 @@ function getLastMessageTextForReport({ policyForMovingExpensesID, currentUserLogin, }); + // Strip HTML tags for plain text display in options list + const properSchemaForModifiedExpenseMessage = Parser.htmlToText(properSchemaForModifiedExpenseMessageWithHTML); lastMessageTextFromReport = formatReportLastMessageText(properSchemaForModifiedExpenseMessage, true); } else if (isMovedTransactionAction(lastReportAction)) { lastMessageTextFromReport = Parser.htmlToText(getMovedTransactionMessage(translate, lastReportAction)); diff --git a/src/libs/ReportNameUtils.ts b/src/libs/ReportNameUtils.ts index 4ed6cad000242..909a05d6b99f2 100644 --- a/src/libs/ReportNameUtils.ts +++ b/src/libs/ReportNameUtils.ts @@ -751,7 +751,7 @@ function computeChatThreadReportName( const movedFromReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(parentReportAction, CONST.REPORT.MOVE_TYPE.FROM)}`]; const movedToReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(parentReportAction, CONST.REPORT.MOVE_TYPE.TO)}`]; - const modifiedMessage = policyTags + const modifiedMessageWithHTML = policyTags ? getForReportActionTemp({ translate, reportAction: parentReportAction, @@ -768,6 +768,8 @@ function computeChatThreadReportName( movedToReport, currentUserLogin, }); + // Strip HTML tags for plain text display in report previews + const modifiedMessage = Parser.htmlToText(modifiedMessageWithHTML); return formatReportLastMessageText(modifiedMessage); } if (isTripRoom(report) && report?.reportName !== CONST.REPORT.DEFAULT_REPORT_NAME) { diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index afa945e01fcbe..3f32702b78041 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -5884,7 +5884,7 @@ function getReportName(reportNameInformation: GetReportNameParams): string { const movedFromReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(parentReportAction, CONST.REPORT.MOVE_TYPE.FROM)}`]; const movedToReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(parentReportAction, CONST.REPORT.MOVE_TYPE.TO)}`]; - const modifiedMessage = getForReportAction({ + const modifiedMessageWithHTML = getForReportAction({ reportAction: parentReportAction, policyID, movedFromReport, @@ -5892,6 +5892,8 @@ function getReportName(reportNameInformation: GetReportNameParams): string { // Temporarily retrieves current user email from getCurrentUserEmail, since getReportName is deprecated and no longer requires this parameter to be passed explicitly. currentUserLogin: getCurrentUserEmail() ?? '', }); + // Strip HTML tags for plain text display in report last message + const modifiedMessage = Parser.htmlToText(modifiedMessageWithHTML); return formatReportLastMessageText(modifiedMessage); } if (isTripRoom(report) && report?.reportName !== CONST.REPORT.DEFAULT_REPORT_NAME) { diff --git a/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx b/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx index 19cb1f4f4d5df..d517bc537979a 100644 --- a/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx @@ -774,7 +774,7 @@ const ContextMenuActions: ContextMenuAction[] = [ const displayMessage = html ?? text; setClipboardMessage(displayMessage); } else if (isModifiedExpenseAction(reportAction)) { - const modifyExpenseMessage = getForReportActionTemp({ + const modifyExpenseMessageWithHTML = getForReportActionTemp({ translate, reportAction, policy, @@ -783,6 +783,8 @@ const ContextMenuActions: ContextMenuAction[] = [ policyTags, currentUserLogin: currentUserPersonalDetails?.email ?? '', }); + // Convert HTML to markdown for clipboard copy to preserve links and formatting + const modifyExpenseMessage = Parser.htmlToMarkdown(modifyExpenseMessageWithHTML); Clipboard.setString(modifyExpenseMessage); } else if (isReimbursementDeQueuedOrCanceledAction(reportAction)) { const displayMessage = getReimbursementDeQueuedOrCanceledActionMessage(translate, reportAction, report);