From ee33be9be78f8b02ae5c41ba26e996a33fcd2ed0 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Thu, 16 May 2024 14:19:04 +0800 Subject: [PATCH 1/7] update line break regex --- src/CONST.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CONST.ts b/src/CONST.ts index a983a18e3d6a..54c37b384657 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1925,7 +1925,7 @@ const CONST = { EMOJI_NAME: /:[\w+-]+:/g, EMOJI_SUGGESTIONS: /:[a-zA-Z0-9_+-]{1,40}$/, AFTER_FIRST_LINE_BREAK: /\n.*/g, - LINE_BREAK: /\r|\n/g, + LINE_BREAK: /\r\n|\r|\n/g, CODE_2FA: /^\d{6}$/, ATTACHMENT_ID: /chat-attachments\/(\d+)/, HAS_COLON_ONLY_AT_THE_BEGINNING: /^:[^:]+$/, From 9cc731c69e9a45f63d09cceeede475548a850a49 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Fri, 17 May 2024 14:06:18 +0800 Subject: [PATCH 2/7] replace line break with space in money request preview and truncate it --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 3 ++- src/components/ReportActionItem/ReportPreview.tsx | 6 ++++-- src/libs/lineBreaksToSpaces.ts | 5 +++++ 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 src/libs/lineBreaksToSpaces.ts diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 4ff318bc3c47..bf0549bfa2e0 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -23,6 +23,7 @@ import ControlSelection from '@libs/ControlSelection'; import * as CurrencyUtils from '@libs/CurrencyUtils'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import * as IOUUtils from '@libs/IOUUtils'; +import lineBreaksToSpaces from '@libs/lineBreaksToSpaces'; import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; @@ -80,7 +81,7 @@ function MoneyRequestPreviewContent({ const isCurrentUserManager = managerID === sessionAccountID; const {amount: requestAmount, currency: requestCurrency, comment: requestComment, merchant} = ReportUtils.getTransactionDetails(transaction) ?? {}; - const description = truncate(requestComment, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); + const description = truncate(lineBreaksToSpaces(requestComment), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const requestMerchant = truncate(merchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const hasReceipt = TransactionUtils.hasReceipt(transaction); const isScanning = hasReceipt && TransactionUtils.isReceiptBeingScanned(transaction); diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index dae827cdb5c0..77fe5edcbe69 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -1,3 +1,4 @@ +import {truncate} from 'lodash'; import React, {useMemo} from 'react'; import type {StyleProp, ViewStyle} from 'react-native'; import {View} from 'react-native'; @@ -18,6 +19,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import ControlSelection from '@libs/ControlSelection'; import * as CurrencyUtils from '@libs/CurrencyUtils'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; +import lineBreaksToSpaces from '@libs/lineBreaksToSpaces'; import Navigation from '@libs/Navigation/Navigation'; import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionUtils from '@libs/ReportActionsUtils'; @@ -249,10 +251,10 @@ function ReportPreview({ const {supportText} = useMemo(() => { if (formattedMerchant) { - return {supportText: formattedMerchant}; + return {supportText: truncate(formattedMerchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH})}; } if (formattedDescription ?? moneyRequestComment) { - return {supportText: formattedDescription ?? moneyRequestComment}; + return {supportText: truncate(lineBreaksToSpaces(formattedDescription ?? moneyRequestComment), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH})}; } return { supportText: translate('iou.expenseCount', { diff --git a/src/libs/lineBreaksToSpaces.ts b/src/libs/lineBreaksToSpaces.ts new file mode 100644 index 000000000000..857ee6542358 --- /dev/null +++ b/src/libs/lineBreaksToSpaces.ts @@ -0,0 +1,5 @@ +import CONST from '@src/CONST'; + +export default function lineBreaksToSpaces(text: string = '') { + return text.replace(CONST.REGEX.LINE_BREAK, ' '); +} From 1af64fe78f44cd49df285dda07178d4db863cfad Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Fri, 17 May 2024 14:14:45 +0800 Subject: [PATCH 3/7] remove type annotation --- src/libs/lineBreaksToSpaces.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/lineBreaksToSpaces.ts b/src/libs/lineBreaksToSpaces.ts index 857ee6542358..abdec1bdeb42 100644 --- a/src/libs/lineBreaksToSpaces.ts +++ b/src/libs/lineBreaksToSpaces.ts @@ -1,5 +1,5 @@ import CONST from '@src/CONST'; -export default function lineBreaksToSpaces(text: string = '') { +export default function lineBreaksToSpaces(text = '') { return text.replace(CONST.REGEX.LINE_BREAK, ' '); } From d05b2d7b55f43f53bbf7e211c792bd2a3800bec5 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Mon, 20 May 2024 16:49:04 +0800 Subject: [PATCH 4/7] move to string utils --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 3 ++- src/components/ReportActionItem/ReportPreview.tsx | 3 ++- src/libs/StringUtils.ts | 9 ++++++++- src/libs/lineBreaksToSpaces.ts | 5 ----- 4 files changed, 12 insertions(+), 8 deletions(-) delete mode 100644 src/libs/lineBreaksToSpaces.ts diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index bf0549bfa2e0..3c0a251d0071 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -28,6 +28,7 @@ import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; +import StringUtils from '@libs/StringUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import ViolationsUtils from '@libs/Violations/ViolationsUtils'; import variables from '@styles/variables'; @@ -81,7 +82,7 @@ function MoneyRequestPreviewContent({ const isCurrentUserManager = managerID === sessionAccountID; const {amount: requestAmount, currency: requestCurrency, comment: requestComment, merchant} = ReportUtils.getTransactionDetails(transaction) ?? {}; - const description = truncate(lineBreaksToSpaces(requestComment), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); + const description = truncate(StringUtils.lineBreaksToSpaces(requestComment), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const requestMerchant = truncate(merchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const hasReceipt = TransactionUtils.hasReceipt(transaction); const isScanning = hasReceipt && TransactionUtils.isReceiptBeingScanned(transaction); diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 77fe5edcbe69..b1730ee47f3c 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -24,6 +24,7 @@ import Navigation from '@libs/Navigation/Navigation'; import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; +import StringUtils from '@libs/StringUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import type {ContextMenuAnchor} from '@pages/home/report/ContextMenu/ReportActionContextMenu'; import variables from '@styles/variables'; @@ -254,7 +255,7 @@ function ReportPreview({ return {supportText: truncate(formattedMerchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH})}; } if (formattedDescription ?? moneyRequestComment) { - return {supportText: truncate(lineBreaksToSpaces(formattedDescription ?? moneyRequestComment), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH})}; + return {supportText: truncate(StringUtils.lineBreaksToSpaces(formattedDescription ?? moneyRequestComment), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH})}; } return { supportText: translate('iou.expenseCount', { diff --git a/src/libs/StringUtils.ts b/src/libs/StringUtils.ts index 94cd04046ccc..fa072b7e77f7 100644 --- a/src/libs/StringUtils.ts +++ b/src/libs/StringUtils.ts @@ -89,4 +89,11 @@ function getAcronym(string: string): string { return acronym; } -export default {sanitizeString, isEmptyString, removeInvisibleCharacters, normalizeCRLF, getAcronym}; +/** + * Replace all line breaks with white spaces + */ +function lineBreaksToSpaces(text = '') { + return text.replace(CONST.REGEX.LINE_BREAK, ' '); +} + +export default {sanitizeString, isEmptyString, removeInvisibleCharacters, normalizeCRLF, getAcronym, lineBreaksToSpaces}; diff --git a/src/libs/lineBreaksToSpaces.ts b/src/libs/lineBreaksToSpaces.ts deleted file mode 100644 index abdec1bdeb42..000000000000 --- a/src/libs/lineBreaksToSpaces.ts +++ /dev/null @@ -1,5 +0,0 @@ -import CONST from '@src/CONST'; - -export default function lineBreaksToSpaces(text = '') { - return text.replace(CONST.REGEX.LINE_BREAK, ' '); -} From 7c7d04ecce77dcdecdc8af9147e2c612f5e13926 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Mon, 20 May 2024 16:49:45 +0800 Subject: [PATCH 5/7] import a single function --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 3 +-- src/components/ReportActionItem/ReportPreview.tsx | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 3c0a251d0071..dc2e67d9c8ae 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -1,5 +1,5 @@ -import {truncate} from 'lodash'; import lodashSortBy from 'lodash/sortBy'; +import truncate from 'lodash/truncate'; import React, {useMemo} from 'react'; import {View} from 'react-native'; import type {GestureResponderEvent} from 'react-native'; @@ -23,7 +23,6 @@ import ControlSelection from '@libs/ControlSelection'; import * as CurrencyUtils from '@libs/CurrencyUtils'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import * as IOUUtils from '@libs/IOUUtils'; -import lineBreaksToSpaces from '@libs/lineBreaksToSpaces'; import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index b1730ee47f3c..0b3f6a1850d0 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -1,4 +1,4 @@ -import {truncate} from 'lodash'; +import truncate from 'lodash/truncate'; import React, {useMemo} from 'react'; import type {StyleProp, ViewStyle} from 'react-native'; import {View} from 'react-native'; @@ -19,7 +19,6 @@ import useThemeStyles from '@hooks/useThemeStyles'; import ControlSelection from '@libs/ControlSelection'; import * as CurrencyUtils from '@libs/CurrencyUtils'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; -import lineBreaksToSpaces from '@libs/lineBreaksToSpaces'; import Navigation from '@libs/Navigation/Navigation'; import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionUtils from '@libs/ReportActionsUtils'; From bd188bb2a1ee73ae59653f2f2ec500ccef610c4e Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Mon, 20 May 2024 16:51:15 +0800 Subject: [PATCH 6/7] dry-ing --- src/libs/ReportActionsUtils.ts | 3 ++- src/libs/ReportUtils.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 906a2963baa8..64b4a1b073e6 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -33,6 +33,7 @@ import type {MessageElementBase, MessageTextElement} from './MessageElement'; import * as PersonalDetailsUtils from './PersonalDetailsUtils'; import type {OptimisticIOUReportAction} from './ReportUtils'; import * as TransactionUtils from './TransactionUtils'; +import StringUtils from './StringUtils'; type LastVisibleMessage = { lastMessageTranslationKey?: string; @@ -634,7 +635,7 @@ function getLastVisibleMessage(reportID: string, actionsToMerge: OnyxCollection< let messageText = message?.text ?? ''; if (messageText) { - messageText = String(messageText).replace(CONST.REGEX.LINE_BREAK, ' ').substring(0, CONST.REPORT.LAST_MESSAGE_TEXT_MAX_LENGTH).trim(); + messageText = StringUtils.lineBreaksToSpaces(String(messageText)).substring(0, CONST.REPORT.LAST_MESSAGE_TEXT_MAX_LENGTH).trim(); } return { lastMessageText: messageText, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index b8e4c448fdc2..cea31a273233 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -81,6 +81,7 @@ import * as ReportActionsUtils from './ReportActionsUtils'; import * as TransactionUtils from './TransactionUtils'; import * as Url from './Url'; import * as UserUtils from './UserUtils'; +import StringUtils from './StringUtils'; type AvatarRange = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18; @@ -1666,7 +1667,7 @@ function formatReportLastMessageText(lastMessageText: string, isModifiedExpenseM if (isModifiedExpenseMessage) { return String(lastMessageText).trim().replace(CONST.REGEX.LINE_BREAK, '').trim(); } - return String(lastMessageText).trim().replace(CONST.REGEX.LINE_BREAK, ' ').substring(0, CONST.REPORT.LAST_MESSAGE_TEXT_MAX_LENGTH).trim(); + return StringUtils.lineBreaksToSpaces(String(lastMessageText).trim()).substring(0, CONST.REPORT.LAST_MESSAGE_TEXT_MAX_LENGTH).trim(); } /** From 9b9af3226d2156a1a39748cef3992db6f8c75573 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Mon, 20 May 2024 16:52:02 +0800 Subject: [PATCH 7/7] prettier --- src/libs/ReportActionsUtils.ts | 2 +- src/libs/ReportUtils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 64b4a1b073e6..a5744cbe99c8 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -32,8 +32,8 @@ import Log from './Log'; import type {MessageElementBase, MessageTextElement} from './MessageElement'; import * as PersonalDetailsUtils from './PersonalDetailsUtils'; import type {OptimisticIOUReportAction} from './ReportUtils'; -import * as TransactionUtils from './TransactionUtils'; import StringUtils from './StringUtils'; +import * as TransactionUtils from './TransactionUtils'; type LastVisibleMessage = { lastMessageTranslationKey?: string; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index cea31a273233..914b4b448809 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -78,10 +78,10 @@ import * as PhoneNumber from './PhoneNumber'; import * as PolicyUtils from './PolicyUtils'; import type {LastVisibleMessage} from './ReportActionsUtils'; import * as ReportActionsUtils from './ReportActionsUtils'; +import StringUtils from './StringUtils'; import * as TransactionUtils from './TransactionUtils'; import * as Url from './Url'; import * as UserUtils from './UserUtils'; -import StringUtils from './StringUtils'; type AvatarRange = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18;