From f79edd0dad0724b53548fb2c7455dbe9e3a4a1f7 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 26 Nov 2024 14:41:10 +0700 Subject: [PATCH 01/19] fix: update how we show pending and scanning status --- .../MoneyRequestPreviewContent.tsx | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index cd9ed19a31ee..009c30717f95 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -199,6 +199,10 @@ function MoneyRequestPreviewContent({ message = translate('iou.split'); } + if (TransactionUtils.isPending(transaction)) { + message += `${CONST.DOT_SEPARATOR} ${translate('iou.pending')}`; + } + if (isSettled && !iouReport?.isCancelledIOU && !isPartialHold) { message += ` ${CONST.DOT_SEPARATOR} ${getSettledMessage()}`; return message; @@ -246,15 +250,9 @@ function MoneyRequestPreviewContent({ if (isScanning) { return {shouldShow: true, messageIcon: ReceiptScan, messageDescription: translate('iou.receiptScanInProgress')}; } - if (TransactionUtils.isPending(transaction)) { - return {shouldShow: true, messageIcon: Expensicons.CreditCardHourglass, messageDescription: translate('iou.transactionPending')}; - } if (TransactionUtils.shouldShowBrokenConnectionViolation(transaction?.transactionID ?? '-1', iouReport, policy)) { return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('violations.brokenConnection530Error')}; } - if (TransactionUtils.hasPendingUI(transaction, TransactionUtils.getTransactionViolations(transaction?.transactionID ?? '-1', transactionViolations))) { - return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('iou.pendingMatchWithCreditCard')}; - } return {shouldShow: false}; }; @@ -262,7 +260,7 @@ function MoneyRequestPreviewContent({ const getDisplayAmountText = (): string => { if (isScanning) { - return translate('iou.receiptScanning'); + return translate('iou.receiptStatusTitle'); } if (isFetchingWaypointsFromServer && !requestAmount) { @@ -358,6 +356,7 @@ function MoneyRequestPreviewContent({ )} From 1bde136ec9c0e98cecd4126c07b8a21a96b915df Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 2 Dec 2024 16:58:19 +0700 Subject: [PATCH 02/19] fix: style request preview content --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index e2e2c657f37b..7ede0cb315d1 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -203,7 +203,7 @@ function MoneyRequestPreviewContent({ } if (TransactionUtils.isPending(transaction)) { - message += `${CONST.DOT_SEPARATOR} ${translate('iou.pending')}`; + message += ` ${CONST.DOT_SEPARATOR} ${translate('iou.pending')}`; } if (isSettled && !iouReport?.isCancelledIOU && !isPartialHold) { From 37213ad7897d69dce546f2e56e88f340831b44f2 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Thu, 19 Dec 2024 16:46:53 +0700 Subject: [PATCH 03/19] fix logic show pending --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index d67cfdc4613f..a0aeb907de57 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -203,7 +203,7 @@ function MoneyRequestPreviewContent({ message = translate('iou.split'); } - if (TransactionUtils.isPending(transaction)) { + if (TransactionUtils.hasPendingUI(transaction)) { message += ` ${CONST.DOT_SEPARATOR} ${translate('iou.pending')}`; } From 9440394c4cb7b3d8c951799d4207020152416576 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 23 Dec 2024 15:05:05 +0700 Subject: [PATCH 04/19] fix lint --- .../MoneyRequestPreviewContent.tsx | 18 +++++++++--------- src/libs/ReportActionsUtils.ts | 5 ++++- src/libs/TransactionUtils/index.ts | 6 +++--- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index a0aeb907de57..b5f49639a6df 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -74,20 +74,20 @@ function MoneyRequestPreviewContent({ const route = useRoute>(); const {shouldUseNarrowLayout} = useResponsiveLayout(); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); - const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID || '-1'}`); + const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`); const [session] = useOnyx(ONYXKEYS.SESSION); - const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${iouReportID || '-1'}`); + const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`); const policy = PolicyUtils.getPolicy(iouReport?.policyID); const isMoneyRequestAction = ReportActionsUtils.isMoneyRequestAction(action); - const transactionID = isMoneyRequestAction ? ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID : '-1'; + const transactionID = isMoneyRequestAction ? ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID : undefined; const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`); const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS); const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS); const sessionAccountID = session?.accountID; - const managerID = iouReport?.managerID ?? -1; - const ownerAccountID = iouReport?.ownerAccountID ?? -1; + const managerID = iouReport?.managerID ?? CONST.DEFAULT_NUMBER_ID; + const ownerAccountID = iouReport?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID; const isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(chatReport); const participantAccountIDs = @@ -117,9 +117,9 @@ function MoneyRequestPreviewContent({ const isOnHold = TransactionUtils.isOnHold(transaction); const isSettlementOrApprovalPartial = !!iouReport?.pendingFields?.partial; const isPartialHold = isSettlementOrApprovalPartial && isOnHold; - const hasViolations = TransactionUtils.hasViolation(transaction?.transactionID ?? '-1', transactionViolations, true); - const hasNoticeTypeViolations = TransactionUtils.hasNoticeTypeViolation(transaction?.transactionID ?? '-1', transactionViolations, true) && ReportUtils.isPaidGroupPolicy(iouReport); - const hasWarningTypeViolations = TransactionUtils.hasWarningTypeViolation(transaction?.transactionID ?? '-1', transactionViolations, true); + const hasViolations = TransactionUtils.hasViolation(transaction?.transactionID, transactionViolations, true); + const hasNoticeTypeViolations = TransactionUtils.hasNoticeTypeViolation(transaction?.transactionID, transactionViolations, true) && ReportUtils.isPaidGroupPolicy(iouReport); + const hasWarningTypeViolations = TransactionUtils.hasWarningTypeViolation(transaction?.transactionID, transactionViolations, true); const hasFieldErrors = TransactionUtils.hasMissingSmartscanFields(transaction); const isDistanceRequest = TransactionUtils.isDistanceRequest(transaction); const isFetchingWaypointsFromServer = TransactionUtils.isFetchingWaypointsFromServer(transaction); @@ -155,7 +155,7 @@ function MoneyRequestPreviewContent({ const shouldShowHoldMessage = !(isSettled && !isSettlementOrApprovalPartial) && !!transaction?.comment?.hold; const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params?.threadReportID}`); - const parentReportAction = ReportActionsUtils.getReportAction(report?.parentReportID ?? '', report?.parentReportActionID ?? ''); + const parentReportAction = ReportActionsUtils.getReportAction(report?.parentReportID, report?.parentReportActionID); const reviewingTransactionID = ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction)?.IOUTransactionID ?? '-1' : '-1'; /* diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 455a125ad0c3..630144fdfadc 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -929,7 +929,10 @@ function getLinkedTransactionID(reportActionOrID: string | OnyxEntry, showInReview?: boolean): boolean { +function hasViolation(transactionID: string | undefined, transactionViolations: OnyxCollection, showInReview?: boolean): boolean { return !!transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]?.some( (violation: TransactionViolation) => violation.type === CONST.VIOLATION_TYPES.VIOLATION && (showInReview === undefined || showInReview === (violation.showInReview ?? false)), ); @@ -890,7 +890,7 @@ function hasViolation(transactionID: string, transactionViolations: OnyxCollecti /** * Checks if any violations for the provided transaction are of type 'notice' */ -function hasNoticeTypeViolation(transactionID: string, transactionViolations: OnyxCollection, showInReview?: boolean): boolean { +function hasNoticeTypeViolation(transactionID: string | undefined, transactionViolations: OnyxCollection, showInReview?: boolean): boolean { return !!transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]?.some( (violation: TransactionViolation) => violation.type === CONST.VIOLATION_TYPES.NOTICE && (showInReview === undefined || showInReview === (violation.showInReview ?? false)), ); @@ -899,7 +899,7 @@ function hasNoticeTypeViolation(transactionID: string, transactionViolations: On /** * Checks if any violations for the provided transaction are of type 'warning' */ -function hasWarningTypeViolation(transactionID: string, transactionViolations: OnyxCollection, showInReview?: boolean): boolean { +function hasWarningTypeViolation(transactionID: string | undefined, transactionViolations: OnyxCollection, showInReview?: boolean): boolean { const violations = transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]; const warningTypeViolations = violations?.filter( From 980012cf3ddc36860c34ea49d12cc7612f008603 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 23 Dec 2024 15:28:44 +0700 Subject: [PATCH 05/19] fix lint --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 8 ++------ src/libs/TransactionUtils/index.ts | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index b5f49639a6df..6460820b49e6 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -299,12 +299,8 @@ function MoneyRequestPreviewContent({ // Clear the draft before selecting a different expense to prevent merging fields from the previous expense // (e.g., category, tag, tax) that may be not enabled/available in the new expense's policy. Transaction.abandonReviewDuplicateTransactions(); - const comparisonResult = TransactionUtils.compareDuplicateTransactionFields( - reviewingTransactionID, - transaction?.reportID ?? '', - transaction?.transactionID ?? reviewingTransactionID, - ); - Transaction.setReviewDuplicatesKey({...comparisonResult.keep, duplicates, transactionID: transaction?.transactionID ?? '', reportID: transaction?.reportID}); + const comparisonResult = TransactionUtils.compareDuplicateTransactionFields(reviewingTransactionID, transaction?.reportID, transaction?.transactionID ?? reviewingTransactionID); + Transaction.setReviewDuplicatesKey({...comparisonResult.keep, duplicates, transactionID: transaction?.transactionID, reportID: transaction?.reportID}); if ('merchant' in comparisonResult.change) { Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE.getRoute(route.params?.threadReportID, backTo)); diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index f7ead587c799..5787444eb917 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -1062,7 +1062,7 @@ function removeSettledAndApprovedTransactions(transactionIDs: string[]) { function compareDuplicateTransactionFields( reviewingTransactionID: string | undefined, reportID: string | undefined, - selectedTransactionID?: string, + selectedTransactionID?: string | undefined, ): {keep: Partial; change: FieldsToChange} { if (!reviewingTransactionID || !reportID) { return {change: {}, keep: {}}; From f08b0e0bdd8b0db81bc9d8b0d040e1bf67611320 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 23 Dec 2024 16:22:38 +0700 Subject: [PATCH 06/19] fix lint --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 6460820b49e6..fede78566f19 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -156,7 +156,9 @@ function MoneyRequestPreviewContent({ const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params?.threadReportID}`); const parentReportAction = ReportActionsUtils.getReportAction(report?.parentReportID, report?.parentReportActionID); - const reviewingTransactionID = ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction)?.IOUTransactionID ?? '-1' : '-1'; + const reviewingTransactionID = ReportActionsUtils.isMoneyRequestAction(parentReportAction) + ? ReportActionsUtils.getOriginalMessage(parentReportAction)?.IOUTransactionID ?? undefined + : undefined; /* Show the merchant for IOUs and expenses only if: From f51600bab9b7da4f602d545c24f621c852eedafc Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 23 Dec 2024 16:36:02 +0700 Subject: [PATCH 07/19] fix lint --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 2 +- src/libs/TransactionUtils/index.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index fede78566f19..b0206c8547c5 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -256,7 +256,7 @@ function MoneyRequestPreviewContent({ if (isScanning) { return {shouldShow: true, messageIcon: ReceiptScan, messageDescription: translate('iou.receiptScanInProgress')}; } - if (TransactionUtils.shouldShowBrokenConnectionViolation(transaction?.transactionID ?? '-1', iouReport, policy)) { + if (TransactionUtils.shouldShowBrokenConnectionViolation(transaction?.transactionID, iouReport, policy)) { return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('violations.brokenConnection530Error')}; } return {shouldShow: false}; diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 5787444eb917..b54106e957e5 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -703,7 +703,7 @@ function hasMissingSmartscanFields(transaction: OnyxInputOrEntry): /** * Get all transaction violations of the transaction with given tranactionID. */ -function getTransactionViolations(transactionID: string, transactionViolations: OnyxCollection | null): TransactionViolations | null { +function getTransactionViolations(transactionID: string | undefined, transactionViolations: OnyxCollection | null): TransactionViolations | null { return transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID] ?? null; } @@ -723,7 +723,7 @@ function hasPendingRTERViolation(transactionViolations?: TransactionViolations | /** * Check if there is broken connection violation. */ -function hasBrokenConnectionViolation(transactionID: string): boolean { +function hasBrokenConnectionViolation(transactionID: string | undefined): boolean { const violations = getTransactionViolations(transactionID, allTransactionViolations); return !!violations?.find( (violation) => @@ -735,7 +735,7 @@ function hasBrokenConnectionViolation(transactionID: string): boolean { /** * Check if user should see broken connection violation warning. */ -function shouldShowBrokenConnectionViolation(transactionID: string, report: OnyxEntry | SearchReport, policy: OnyxEntry | SearchPolicy): boolean { +function shouldShowBrokenConnectionViolation(transactionID: string | undefined, report: OnyxEntry | SearchReport, policy: OnyxEntry | SearchPolicy): boolean { return ( hasBrokenConnectionViolation(transactionID) && (!PolicyUtils.isPolicyAdmin(policy) || ReportUtils.isOpenExpenseReport(report) || (ReportUtils.isProcessingReport(report) && PolicyUtils.isInstantSubmitEnabled(policy))) From d9225c872de154555b9bb2f40d13cd6377e5bd18 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 23 Dec 2024 16:50:19 +0700 Subject: [PATCH 08/19] Not show receipt scan in progress --- src/components/ReportActionItem/ReportPreview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 79497e5fab88..b1f7047ccd6f 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -401,7 +401,7 @@ function ReportPreview({ } } if (shouldShowScanningSubtitle) { - return {shouldShow: true, messageIcon: Expensicons.ReceiptScan, messageDescription: translate('iou.receiptScanInProgress')}; + return {shouldShow: false, messageIcon: Expensicons.ReceiptScan, messageDescription: translate('iou.receiptScanInProgress')}; } if (shouldShowPendingSubtitle) { return {shouldShow: true, messageIcon: Expensicons.CreditCardHourglass, messageDescription: translate('iou.transactionPending')}; From 1b28fd28c9ec739e463d3c3d465fbb32f6c98bdc Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 8 Jan 2025 00:47:45 +0700 Subject: [PATCH 09/19] remove some pending message --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index d07210364e1c..75041c15b4b8 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -203,7 +203,7 @@ function MoneyRequestPreviewContent({ message = translate('iou.split'); } - if (TransactionUtils.hasPendingUI(transaction)) { + if (TransactionUtils.isPending(transaction) || TransactionUtils.hasPendingRTERViolation(TransactionUtils.getTransactionViolations(transactionID, transactionViolations))) { message += ` ${CONST.DOT_SEPARATOR} ${translate('iou.pending')}`; } @@ -254,15 +254,9 @@ function MoneyRequestPreviewContent({ if (isScanning) { return {shouldShow: true, messageIcon: ReceiptScan, messageDescription: translate('iou.receiptScanInProgress')}; } - if (TransactionUtils.isPending(transaction)) { - return {shouldShow: true, messageIcon: Expensicons.CreditCardHourglass, messageDescription: translate('iou.transactionPending')}; - } if (TransactionUtils.shouldShowBrokenConnectionViolation(transaction?.transactionID, iouReport, policy)) { return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('violations.brokenConnection530Error')}; } - if (TransactionUtils.hasPendingUI(transaction, TransactionUtils.getTransactionViolations(transaction?.transactionID, transactionViolations))) { - return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('iou.pendingMatchWithCreditCard')}; - } return {shouldShow: false}; }; From 3b75e73bb1074eaae9e9ca7b195cd2e02295e41e Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 13 Jan 2025 14:11:22 +0700 Subject: [PATCH 10/19] fix lint --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 3 --- src/libs/ReportActionsUtils.ts | 5 +++-- src/libs/TransactionUtils/index.ts | 6 +++++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 75041c15b4b8..261a46aa262c 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -251,9 +251,6 @@ function MoneyRequestPreviewContent({ }; const getPendingMessageProps: () => PendingMessageProps = () => { - if (isScanning) { - return {shouldShow: true, messageIcon: ReceiptScan, messageDescription: translate('iou.receiptScanInProgress')}; - } if (TransactionUtils.shouldShowBrokenConnectionViolation(transaction?.transactionID, iouReport, policy)) { return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('violations.brokenConnection530Error')}; } diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index d56870d261f7..c1f4057199ee 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -931,10 +931,11 @@ function getLinkedTransactionID(reportActionOrID: string | OnyxEntry; change: FieldsToChange} { +function compareDuplicateTransactionFields( + reviewingTransactionID?: string | undefined, + reportID?: string | undefined, + selectedTransactionID?: string | undefined, +): {keep: Partial; change: FieldsToChange} { if (!reviewingTransactionID || !reportID) { return {change: {}, keep: {}}; } From 596cbc0f4d17219d7526e82292eb5cd840a92e87 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 13 Jan 2025 14:12:11 +0700 Subject: [PATCH 11/19] fix lint --- src/libs/TransactionUtils/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index dd64755bce67..528481dae237 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -1109,7 +1109,7 @@ function removeSettledAndApprovedTransactions(transactionIDs: string[]) { function compareDuplicateTransactionFields( reviewingTransactionID?: string | undefined, reportID?: string | undefined, - selectedTransactionID?: string | undefined, + selectedTransactionID?: string, ): {keep: Partial; change: FieldsToChange} { if (!reviewingTransactionID || !reportID) { return {change: {}, keep: {}}; From 21ee3a2b38cae63b2d9663204d68381ab256e3f3 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 13 Jan 2025 14:38:59 +0700 Subject: [PATCH 12/19] fix lint --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 1 - src/components/ReportActionItem/ReportPreview.tsx | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 261a46aa262c..bb9596ad97ad 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -9,7 +9,6 @@ import type {OnyxEntry} from 'react-native-onyx'; import Button from '@components/Button'; import Icon from '@components/Icon'; import * as Expensicons from '@components/Icon/Expensicons'; -import {ReceiptScan} from '@components/Icon/Expensicons'; import MoneyRequestSkeletonView from '@components/MoneyRequestSkeletonView'; import MultipleAvatars from '@components/MultipleAvatars'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 7589030e1ae4..bda15f57e528 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -282,6 +282,7 @@ function ReportPreview({ }; const getDisplayAmount = (): string => { + console.log('totalDisplaySpend', totalDisplaySpend); if (totalDisplaySpend) { return CurrencyUtils.convertToDisplayString(totalDisplaySpend, iouReport?.currency); } From c7cd27c2403cb33a79e760900dae8a44f3c4de73 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 13 Jan 2025 14:46:42 +0700 Subject: [PATCH 13/19] remove console log --- src/components/ReportActionItem/ReportPreview.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index bda15f57e528..7589030e1ae4 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -282,7 +282,6 @@ function ReportPreview({ }; const getDisplayAmount = (): string => { - console.log('totalDisplaySpend', totalDisplaySpend); if (totalDisplaySpend) { return CurrencyUtils.convertToDisplayString(totalDisplaySpend, iouReport?.currency); } From 41a538aa27013bea6809d76fca554477cddb52d0 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 15 Jan 2025 16:18:09 +0700 Subject: [PATCH 14/19] fix change logic show scanning report preview --- .../MoneyRequestPreviewContent.tsx | 160 ++++++++++-------- .../ReportActionItem/ReportPreview.tsx | 2 +- src/languages/en.ts | 1 + src/languages/es.ts | 1 + 4 files changed, 96 insertions(+), 68 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index bb9596ad97ad..040c1d0f0928 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -8,7 +8,7 @@ import {useOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; import Button from '@components/Button'; import Icon from '@components/Icon'; -import * as Expensicons from '@components/Icon/Expensicons'; +import {Checkmark, DotIndicator, Folder, Hourglass, Tag} from '@components/Icon/Expensicons'; import MoneyRequestSkeletonView from '@components/MoneyRequestSkeletonView'; import MultipleAvatars from '@components/MultipleAvatars'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -22,26 +22,53 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; +import {clearWalletTermsError} from '@libs/actions/PaymentMethods'; +import {clearIOUError} from '@libs/actions/Report'; +import {abandonReviewDuplicateTransactions, setReviewDuplicatesKey} from '@libs/actions/Transaction'; import ControlSelection from '@libs/ControlSelection'; -import * as CurrencyUtils from '@libs/CurrencyUtils'; -import * as DeviceCapabilities from '@libs/DeviceCapabilities'; -import * as IOUUtils from '@libs/IOUUtils'; +import {convertToDisplayString} from '@libs/CurrencyUtils'; +import {canUseTouchScreen} from '@libs/DeviceCapabilities'; +import {calculateAmount} from '@libs/IOUUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types'; import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/types'; -import * as OptionsListUtils from '@libs/OptionsListUtils'; -import * as PolicyUtils from '@libs/PolicyUtils'; -import * as ReceiptUtils from '@libs/ReceiptUtils'; -import * as ReportActionsUtils from '@libs/ReportActionsUtils'; -import * as ReportUtils from '@libs/ReportUtils'; -import type {TransactionDetails} from '@libs/ReportUtils'; +import {getAvatarsForAccountIDs} from '@libs/OptionsListUtils'; +import {getCleanedTagName, getPolicy} from '@libs/PolicyUtils'; +import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils'; +import {getOriginalMessage, getReportAction, isMessageDeleted, isMoneyRequestAction as isMoneyRequestActionReportActionUtils} from '@libs/ReportActionsUtils'; +import { + getTransactionDetails, + getWorkspaceIcon, + hasMissingSmartscanFields, + isPaidGroupPolicy, + isPaidGroupPolicyExpenseReport, + isPolicyExpenseChat as isPolicyExpenseChatReportUtils, + isReportApproved, + isSettled as isSettledReportUtils, + type TransactionDetails, +} from '@libs/ReportUtils'; import StringUtils from '@libs/StringUtils'; -import * as TransactionUtils from '@libs/TransactionUtils'; +import { + compareDuplicateTransactionFields, + getTransactionViolations, + hasNoticeTypeViolation, + hasPendingRTERViolation, + hasReceipt as hasReceiptTransactionUtils, + hasViolation, + hasWarningTypeViolation, + isAmountMissing as isAmountMissingTransactionUtils, + isCardTransaction as isCardTransactionTransactionUtils, + isDistanceRequest as isDistanceRequestTransactionUtils, + isFetchingWaypointsFromServer as isFetchingWaypointsFromServerTransactionUtils, + isMerchantMissing as isMerchantMissingTransactionUtils, + isOnHold as isOnHoldTransactionUtils, + isPending, + isReceiptBeingScanned, + removeSettledAndApprovedTransactions, + shouldShowBrokenConnectionViolation, +} from '@libs/TransactionUtils'; import ViolationsUtils from '@libs/Violations/ViolationsUtils'; import variables from '@styles/variables'; -import * as PaymentMethods from '@userActions/PaymentMethods'; -import * as Report from '@userActions/Report'; -import * as Transaction from '@userActions/Transaction'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -77,9 +104,9 @@ function MoneyRequestPreviewContent({ const [session] = useOnyx(ONYXKEYS.SESSION); const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${iouReportID || CONST.DEFAULT_NUMBER_ID}`); - const policy = PolicyUtils.getPolicy(iouReport?.policyID); - const isMoneyRequestAction = ReportActionsUtils.isMoneyRequestAction(action); - const transactionID = isMoneyRequestAction ? ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID : undefined; + const policy = getPolicy(iouReport?.policyID); + const isMoneyRequestAction = isMoneyRequestActionReportActionUtils(action); + const transactionID = isMoneyRequestAction ? getOriginalMessage(action)?.IOUTransactionID : undefined; const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`); const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS); const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS); @@ -87,14 +114,13 @@ function MoneyRequestPreviewContent({ const sessionAccountID = session?.accountID; const managerID = iouReport?.managerID ?? CONST.DEFAULT_NUMBER_ID; const ownerAccountID = iouReport?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID; - const isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(chatReport); + const isPolicyExpenseChat = isPolicyExpenseChatReportUtils(chatReport); - const participantAccountIDs = - ReportActionsUtils.isMoneyRequestAction(action) && isBillSplit ? ReportActionsUtils.getOriginalMessage(action)?.participantAccountIDs ?? [] : [managerID, ownerAccountID]; - const participantAvatars = OptionsListUtils.getAvatarsForAccountIDs(participantAccountIDs, personalDetails ?? {}); + const participantAccountIDs = isMoneyRequestActionReportActionUtils(action) && isBillSplit ? getOriginalMessage(action)?.participantAccountIDs ?? [] : [managerID, ownerAccountID]; + const participantAvatars = getAvatarsForAccountIDs(participantAccountIDs, personalDetails ?? {}); const sortedParticipantAvatars = lodashSortBy(participantAvatars, (avatar) => avatar.id); if (isPolicyExpenseChat && isBillSplit) { - sortedParticipantAvatars.push(ReportUtils.getWorkspaceIcon(chatReport)); + sortedParticipantAvatars.push(getWorkspaceIcon(chatReport)); } // Pay button should only be visible to the manager of the report. @@ -107,24 +133,24 @@ function MoneyRequestPreviewContent({ merchant, tag, category, - } = useMemo>(() => ReportUtils.getTransactionDetails(transaction) ?? {}, [transaction]); + } = useMemo>(() => getTransactionDetails(transaction) ?? {}, [transaction]); 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); - const isOnHold = TransactionUtils.isOnHold(transaction); + const hasReceipt = hasReceiptTransactionUtils(transaction); + const isScanning = hasReceipt && isReceiptBeingScanned(transaction); + const isOnHold = isOnHoldTransactionUtils(transaction); const isSettlementOrApprovalPartial = !!iouReport?.pendingFields?.partial; const isPartialHold = isSettlementOrApprovalPartial && isOnHold; - const hasViolations = TransactionUtils.hasViolation(transaction?.transactionID, transactionViolations, true); - const hasNoticeTypeViolations = TransactionUtils.hasNoticeTypeViolation(transaction?.transactionID, transactionViolations, true) && ReportUtils.isPaidGroupPolicy(iouReport); - const hasWarningTypeViolations = TransactionUtils.hasWarningTypeViolation(transaction?.transactionID, transactionViolations, true); - const hasFieldErrors = TransactionUtils.hasMissingSmartscanFields(transaction); - const isDistanceRequest = TransactionUtils.isDistanceRequest(transaction); - const isFetchingWaypointsFromServer = TransactionUtils.isFetchingWaypointsFromServer(transaction); - const isCardTransaction = TransactionUtils.isCardTransaction(transaction); - const isSettled = ReportUtils.isSettled(iouReport?.reportID); - const isApproved = ReportUtils.isReportApproved(iouReport); + const hasViolations = hasViolation(transaction?.transactionID, transactionViolations, true); + const hasNoticeTypeViolations = hasNoticeTypeViolation(transaction?.transactionID, transactionViolations, true) && isPaidGroupPolicy(iouReport); + const hasWarningTypeViolations = hasWarningTypeViolation(transaction?.transactionID, transactionViolations, true); + const hasFieldErrors = hasMissingSmartscanFields(transaction); + const isDistanceRequest = isDistanceRequestTransactionUtils(transaction); + const isFetchingWaypointsFromServer = isFetchingWaypointsFromServerTransactionUtils(transaction); + const isCardTransaction = isCardTransactionTransactionUtils(transaction); + const isSettled = isSettledReportUtils(iouReport?.reportID); + const isApproved = isReportApproved(iouReport); const isDeleted = action?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE; const isReviewDuplicateTransactionPage = route.name === SCREENS.TRANSACTION_DUPLICATE.REVIEW; @@ -141,7 +167,7 @@ function MoneyRequestPreviewContent({ ); // Remove settled transactions from duplicates - const duplicates = useMemo(() => TransactionUtils.removeSettledAndApprovedTransactions(allDuplicates), [allDuplicates]); + const duplicates = useMemo(() => removeSettledAndApprovedTransactions(allDuplicates), [allDuplicates]); // When there are no settled transactions in duplicates, show the "Keep this one" button const shouldShowKeepButton = !!(allDuplicates.length && duplicates.length && allDuplicates.length === duplicates.length); @@ -154,8 +180,8 @@ function MoneyRequestPreviewContent({ const shouldShowHoldMessage = !(isSettled && !isSettlementOrApprovalPartial) && !!transaction?.comment?.hold; const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params?.threadReportID}`); - const parentReportAction = ReportActionsUtils.getReportAction(report?.parentReportID, report?.parentReportActionID); - const reviewingTransactionID = ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction)?.IOUTransactionID : undefined; + const parentReportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); + const reviewingTransactionID = isMoneyRequestActionReportActionUtils(parentReportAction) ? getOriginalMessage(parentReportAction)?.IOUTransactionID : undefined; /* Show the merchant for IOUs and expenses only if: @@ -175,7 +201,7 @@ function MoneyRequestPreviewContent({ merchantOrDescription = description || ''; } - const receiptImages = [{...ReceiptUtils.getThumbnailAndImageURIs(transaction), transaction}]; + const receiptImages = [{...getThumbnailAndImageURIs(transaction), transaction}]; const getSettledMessage = (): string => { if (isCardTransaction) { @@ -202,7 +228,7 @@ function MoneyRequestPreviewContent({ message = translate('iou.split'); } - if (TransactionUtils.isPending(transaction) || TransactionUtils.hasPendingRTERViolation(TransactionUtils.getTransactionViolations(transactionID, transactionViolations))) { + if (isPending(transaction) || hasPendingRTERViolation(getTransactionViolations(transactionID, transactionViolations))) { message += ` ${CONST.DOT_SEPARATOR} ${translate('iou.pending')}`; } @@ -212,7 +238,7 @@ function MoneyRequestPreviewContent({ } if (shouldShowRBR && transaction) { - const violations = TransactionUtils.getTransactionViolations(transaction.transactionID, transactionViolations); + const violations = getTransactionViolations(transaction.transactionID, transactionViolations); if (shouldShowHoldMessage) { return `${message} ${CONST.DOT_SEPARATOR} ${translate('violations.hold')}`; } @@ -226,8 +252,8 @@ function MoneyRequestPreviewContent({ return `${message} ${CONST.DOT_SEPARATOR} ${isTooLong || hasViolationsAndFieldErrors ? translate('violations.reviewRequired') : violationMessage}`; } if (hasFieldErrors) { - const isMerchantMissing = TransactionUtils.isMerchantMissing(transaction); - const isAmountMissing = TransactionUtils.isAmountMissing(transaction); + const isMerchantMissing = isMerchantMissingTransactionUtils(transaction); + const isAmountMissing = isAmountMissingTransactionUtils(transaction); if (isAmountMissing && isMerchantMissing) { message += ` ${CONST.DOT_SEPARATOR} ${translate('violations.reviewRequired')}`; } else if (isAmountMissing) { @@ -237,9 +263,9 @@ function MoneyRequestPreviewContent({ } return message; } - } else if (hasNoticeTypeViolations && transaction && !ReportUtils.isReportApproved(iouReport) && !ReportUtils.isSettled(iouReport?.reportID)) { + } else if (hasNoticeTypeViolations && transaction && !isReportApproved(iouReport) && !isSettledReportUtils(iouReport?.reportID)) { message += ` • ${translate('violations.reviewRequired')}`; - } else if (ReportUtils.isPaidGroupPolicyExpenseReport(iouReport) && ReportUtils.isReportApproved(iouReport) && !ReportUtils.isSettled(iouReport?.reportID) && !isPartialHold) { + } else if (isPaidGroupPolicyExpenseReport(iouReport) && isReportApproved(iouReport) && !isSettledReportUtils(iouReport?.reportID) && !isPartialHold) { message += ` ${CONST.DOT_SEPARATOR} ${translate('iou.approved')}`; } else if (iouReport?.isCancelledIOU) { message += ` ${CONST.DOT_SEPARATOR} ${translate('iou.canceled')}`; @@ -250,8 +276,8 @@ function MoneyRequestPreviewContent({ }; const getPendingMessageProps: () => PendingMessageProps = () => { - if (TransactionUtils.shouldShowBrokenConnectionViolation(transaction?.transactionID, iouReport, policy)) { - return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('violations.brokenConnection530Error')}; + if (shouldShowBrokenConnectionViolation(transaction?.transactionID, iouReport, policy)) { + return {shouldShow: true, messageIcon: Hourglass, messageDescription: translate('violations.brokenConnection530Error')}; } return {shouldShow: false}; }; @@ -267,12 +293,12 @@ function MoneyRequestPreviewContent({ return translate('iou.fieldPending'); } - return CurrencyUtils.convertToDisplayString(requestAmount, requestCurrency); + return convertToDisplayString(requestAmount, requestCurrency); }; const getDisplayDeleteAmountText = (): string => { - const iouOriginalMessage: OnyxEntry = ReportActionsUtils.isMoneyRequestAction(action) ? ReportActionsUtils.getOriginalMessage(action) ?? undefined : undefined; - return CurrencyUtils.convertToDisplayString(iouOriginalMessage?.amount, iouOriginalMessage?.currency); + const iouOriginalMessage: OnyxEntry = isMoneyRequestActionReportActionUtils(action) ? getOriginalMessage(action) ?? undefined : undefined; + return convertToDisplayString(iouOriginalMessage?.amount, iouOriginalMessage?.currency); }; const displayAmount = isDeleted ? getDisplayDeleteAmountText() : getDisplayAmountText(); @@ -284,7 +310,7 @@ function MoneyRequestPreviewContent({ () => shouldShowSplitShare ? transaction?.comment?.splits?.find((split) => split.accountID === sessionAccountID)?.amount ?? - IOUUtils.calculateAmount(isPolicyExpenseChat ? 1 : participantAccountIDs.length - 1, requestAmount, requestCurrency ?? '', action.actorAccountID === sessionAccountID) + calculateAmount(isPolicyExpenseChat ? 1 : participantAccountIDs.length - 1, requestAmount, requestCurrency ?? '', action.actorAccountID === sessionAccountID) : 0, [shouldShowSplitShare, isPolicyExpenseChat, action.actorAccountID, participantAccountIDs.length, transaction?.comment?.splits, requestAmount, requestCurrency, sessionAccountID], ); @@ -294,9 +320,9 @@ function MoneyRequestPreviewContent({ // Clear the draft before selecting a different expense to prevent merging fields from the previous expense // (e.g., category, tag, tax) that may be not enabled/available in the new expense's policy. - Transaction.abandonReviewDuplicateTransactions(); - const comparisonResult = TransactionUtils.compareDuplicateTransactionFields(reviewingTransactionID, transaction?.reportID, transaction?.transactionID ?? reviewingTransactionID); - Transaction.setReviewDuplicatesKey({...comparisonResult.keep, duplicates, transactionID: transaction?.transactionID, reportID: transaction?.reportID}); + abandonReviewDuplicateTransactions(); + const comparisonResult = compareDuplicateTransactionFields(reviewingTransactionID, transaction?.reportID, transaction?.transactionID ?? reviewingTransactionID); + setReviewDuplicatesKey({...comparisonResult.keep, duplicates, transactionID: transaction?.transactionID, reportID: transaction?.reportID}); if ('merchant' in comparisonResult.change) { Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE.getRoute(route.params?.threadReportID, backTo)); @@ -324,8 +350,8 @@ function MoneyRequestPreviewContent({ { - PaymentMethods.clearWalletTermsError(); - Report.clearIOUError(chatReportID); + clearWalletTermsError(); + clearIOUError(chatReportID); }} errorRowStyles={[styles.mbn1]} needsOffscreenAlphaCompositing @@ -346,7 +372,7 @@ function MoneyRequestPreviewContent({ size={1} /> )} - {isEmptyObject(transaction) && !ReportActionsUtils.isMessageDeleted(action) && action.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE ? ( + {isEmptyObject(transaction) && !isMessageDeleted(action) && action.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE ? ( ) : ( @@ -356,7 +382,7 @@ function MoneyRequestPreviewContent({ {getPreviewHeaderText()} {!isSettled && shouldShowRBR && ( @@ -381,10 +407,10 @@ function MoneyRequestPreviewContent({ > {displayAmount} - {ReportUtils.isSettled(iouReport?.reportID) && !isPartialHold && !isBillSplit && ( + {isSettledReportUtils(iouReport?.reportID) && !isPartialHold && !isBillSplit && ( @@ -412,7 +438,7 @@ function MoneyRequestPreviewContent({ {!!splitShare && ( - {translate('iou.yourSplit', {amount: CurrencyUtils.convertToDisplayString(splitShare, requestCurrency)})} + {translate('iou.yourSplit', {amount: convertToDisplayString(splitShare, requestCurrency)})} )} @@ -443,7 +469,7 @@ function MoneyRequestPreviewContent({ ]} > - {PolicyUtils.getCleanedTagName(tag)} + {getCleanedTagName(tag)} )} @@ -490,17 +516,17 @@ function MoneyRequestPreviewContent({ return ( DeviceCapabilities.canUseTouchScreen() && ControlSelection.block()} + onPressIn={() => canUseTouchScreen() && ControlSelection.block()} onPressOut={() => ControlSelection.unblock()} onLongPress={showContextMenu} shouldUseHapticsOnLongPress accessibilityLabel={isBillSplit ? translate('iou.split') : showCashOrCard} - accessibilityHint={CurrencyUtils.convertToDisplayString(requestAmount, requestCurrency)} + accessibilityHint={convertToDisplayString(requestAmount, requestCurrency)} style={[ styles.moneyRequestPreviewBox, containerStyles, shouldDisableOnPress && styles.cursorDefault, - (isSettled || ReportUtils.isReportApproved(iouReport)) && isSettlementOrApprovalPartial && styles.offlineFeedback.pending, + (isSettled || isReportApproved(iouReport)) && isSettlementOrApprovalPartial && styles.offlineFeedback.pending, ]} > {childContainer} diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 0409439e6c0b..319d0c798a20 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -368,7 +368,7 @@ function ReportPreview({ const previewMessage = useMemo(() => { if (isScanning) { - return translate('common.receipt'); + return `${translate('common.receipt')} ${CONST.DOT_SEPARATOR} ${translate('common.scanning')}`; } let payerOrApproverName; diff --git a/src/languages/en.ts b/src/languages/en.ts index 3a8bcb0c18d5..7482ff82cf38 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -274,6 +274,7 @@ const translations = { continue: 'Continue', firstName: 'First name', lastName: 'Last name', + scanning: 'Scanning', addCardTermsOfService: 'Expensify Terms of Service', perPerson: 'per person', phone: 'Phone', diff --git a/src/languages/es.ts b/src/languages/es.ts index 325a5bb59edc..84892dcb7ca3 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -268,6 +268,7 @@ const translations = { continue: 'Continuar', firstName: 'Nombre', lastName: 'Apellidos', + scanning: 'Escaneando', phone: 'Teléfono', phoneNumber: 'Número de teléfono', phoneNumberPlaceholder: '(xxx) xxx-xxxx', From ca56734dc441dba70f24545c1e142a24391b327f Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 15 Jan 2025 18:29:14 +0700 Subject: [PATCH 15/19] fix lint --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 040c1d0f0928..26f2f84bd8a3 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -39,18 +39,18 @@ import {getOriginalMessage, getReportAction, isMessageDeleted, isMoneyRequestAct import { getTransactionDetails, getWorkspaceIcon, - hasMissingSmartscanFields, isPaidGroupPolicy, isPaidGroupPolicyExpenseReport, isPolicyExpenseChat as isPolicyExpenseChatReportUtils, isReportApproved, isSettled as isSettledReportUtils, - type TransactionDetails, } from '@libs/ReportUtils'; +import type {TransactionDetails} from '@libs/ReportUtils'; import StringUtils from '@libs/StringUtils'; import { compareDuplicateTransactionFields, getTransactionViolations, + hasMissingSmartscanFields, hasNoticeTypeViolation, hasPendingRTERViolation, hasReceipt as hasReceiptTransactionUtils, From 159c5687cfc20a102cbe33528bf2a11b53630d5c Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 20 Jan 2025 15:57:06 +0700 Subject: [PATCH 16/19] fix: report preivew message --- .../ReportActionItem/ReportPreview.tsx | 28 +++++++++---------- src/languages/en.ts | 6 ++-- src/languages/es.ts | 6 ++-- src/libs/ReportUtils.ts | 12 +++----- 4 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index bf8219f3eca7..1be86221981f 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -327,7 +327,7 @@ function ReportPreview({ return convertToDisplayString(totalDisplaySpend, iouReport?.currency); } if (isScanning) { - return translate('iou.receiptScanning', {count: numberOfScanningReceipts}); + return translate('iou.receiptScanning'); } if (hasOnlyTransactionsWithPendingRoutes) { return translate('iou.fieldPending'); @@ -363,7 +363,10 @@ function ReportPreview({ const previewMessage = useMemo(() => { if (isScanning) { - return `${translate('common.receipt')} ${CONST.DOT_SEPARATOR} ${translate('common.scanning')}`; + if (showRTERViolationMessage && totalDisplaySpend) { + return `${translate('common.receipt')} ${CONST.DOT_SEPARATOR} ${translate('iou.pendingMatch')}`; + } + return totalDisplaySpend ? `${translate('common.receipt')} ${CONST.DOT_SEPARATOR} ${translate('common.scanning')}` : `${translate('common.receipt')}`; } let payerOrApproverName; @@ -389,17 +392,19 @@ function ReportPreview({ }, [ isScanning, isPolicyExpenseChat, - policy, - chatReport, isInvoiceRoom, - invoiceReceiverPolicy, - invoiceReceiverPersonalDetail, - managerID, isApproved, iouSettled, iouReport?.isWaitingOnBankAccount, hasNonReimbursableTransactions, translate, + showRTERViolationMessage, + totalDisplaySpend, + chatReport, + policy, + invoiceReceiverPolicy, + invoiceReceiverPersonalDetail, + managerID, ]); const bankAccountRoute = getBankAccountRoute(chatReport); @@ -420,7 +425,6 @@ function ReportPreview({ const shouldShowSingleRequestMerchantOrDescription = numberOfRequests === 1 && (!!formattedMerchant || !!formattedDescription) && !(hasOnlyTransactionsWithPendingRoutes && !totalDisplaySpend); const shouldShowSubtitle = !isScanning && (shouldShowSingleRequestMerchantOrDescription || numberOfRequests > 1) && !isDisplayAmountZero(getDisplayAmount()); - const shouldShowPendingSubtitle = numberOfPendingRequests === 1 && numberOfRequests === 1; const isPayAtEndExpense = isPayAtEndExpenseReport(iouReportID, allTransactions); const [archiveReason] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportID}`, {selector: getArchiveReason}); @@ -438,14 +442,8 @@ function ReportPreview({ }; } } - if (shouldShowPendingSubtitle) { - return {shouldShow: true, messageIcon: Expensicons.CreditCardHourglass, messageDescription: translate('iou.transactionPending')}; - } - if (shouldShowBrokenConnectionViolation) { - return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('violations.brokenConnection530Error')}; - } if (showRTERViolationMessage) { - return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('iou.pendingMatchWithCreditCard')}; + return {shouldShow: !isScanning, messageIcon: Expensicons.Hourglass, messageDescription: translate('iou.pendingMatchWithCreditCard')}; } return {shouldShow: false}; }; diff --git a/src/languages/en.ts b/src/languages/en.ts index 91bd10b904c3..20eb37a4c28f 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -881,13 +881,11 @@ const translations = { posted: 'Posted', deleteReceipt: 'Delete receipt', pendingMatchWithCreditCard: 'Receipt pending match with card transaction', + pendingMatch: 'Pending match', pendingMatchWithCreditCardDescription: 'Receipt pending match with card transaction. Mark as cash to cancel.', markAsCash: 'Mark as cash', routePending: 'Route pending...', - receiptScanning: () => ({ - one: 'Receipt scanning...', - other: 'Receipts scanning...', - }), + receiptScanning: 'Scanning...', receiptScanInProgress: 'Receipt scan in progress', receiptScanInProgressDescription: 'Receipt scan in progress. Check back later or enter the details now.', receiptIssuesFound: () => ({ diff --git a/src/languages/es.ts b/src/languages/es.ts index d00011aa40da..d0af2c15917e 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -875,6 +875,7 @@ const translations = { canceled: 'Canceló', posted: 'Contabilizado', deleteReceipt: 'Eliminar recibo', + pendingMatch: 'Pendiente de coincidencia', pendingMatchWithCreditCard: 'Recibo pendiente de adjuntar con la transacción de la tarjeta', pendingMatchWithCreditCardDescription: 'Recibo pendiente de adjuntar con la transacción de la tarjeta. Márcalo como efectivo para cancelar.', markAsCash: 'Marcar como efectivo', @@ -884,10 +885,7 @@ const translations = { other: 'Problemas encontrados', }), fieldPending: 'Pendiente...', - receiptScanning: () => ({ - one: 'Escaneando recibo...', - other: 'Escaneando recibos...', - }), + receiptScanning: 'Escaneando', receiptScanInProgress: 'Escaneado de recibo en proceso', receiptScanInProgressDescription: 'Escaneado de recibo en proceso. Vuelve a comprobarlo más tarde o introduce los detalles ahora.', defaultRate: 'Tasa predeterminada', diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 674708fb4f9f..1e9a5ad0bda9 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3680,7 +3680,7 @@ function getTransactionReportName(reportAction: OnyxEntry Date: Wed, 22 Jan 2025 11:18:14 +0700 Subject: [PATCH 17/19] fix preview header text --- .../MoneyRequestPreviewContent.tsx | 6 +++++- src/components/ReportActionItem/ReportPreview.tsx | 6 +++--- src/languages/en.ts | 5 ++++- src/languages/es.ts | 5 ++++- src/libs/ReportUtils.ts | 12 ++++++++---- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 4dcc9a26064b..d55f293f2397 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -233,10 +233,14 @@ function MoneyRequestPreviewContent({ message = translate('iou.split'); } - if (isPending(transaction) || hasPendingRTERViolation(getTransactionViolations(transactionID, transactionViolations))) { + if (isPending(transaction)) { message += ` ${CONST.DOT_SEPARATOR} ${translate('iou.pending')}`; } + if (hasPendingRTERViolation(getTransactionViolations(transactionID, transactionViolations))) { + message += ` ${CONST.DOT_SEPARATOR} ${translate('iou.pendingMatch')}`; + } + if (isSettled && !iouReport?.isCancelledIOU && !isPartialHold) { message += ` ${CONST.DOT_SEPARATOR} ${getSettledMessage()}`; return message; diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 98444b8fc06f..dd34ccca7cf2 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -327,7 +327,7 @@ function ReportPreview({ return convertToDisplayString(totalDisplaySpend, iouReport?.currency); } if (isScanning) { - return translate('iou.receiptScanning'); + return translate('iou.receiptStatusTitle'); } if (hasOnlyTransactionsWithPendingRoutes) { return translate('iou.fieldPending'); @@ -442,8 +442,8 @@ function ReportPreview({ }; } } - if (showRTERViolationMessage) { - return {shouldShow: !isScanning, messageIcon: Expensicons.Hourglass, messageDescription: translate('iou.pendingMatchWithCreditCard')}; + if (shouldShowBrokenConnectionViolation) { + return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('violations.brokenConnection530Error')}; } return {shouldShow: false}; }; diff --git a/src/languages/en.ts b/src/languages/en.ts index 242ddd108220..90a5df2bf409 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -884,7 +884,10 @@ const translations = { pendingMatchWithCreditCardDescription: 'Receipt pending match with card transaction. Mark as cash to cancel.', markAsCash: 'Mark as cash', routePending: 'Route pending...', - receiptScanning: 'Scanning...', + receiptScanning: () => ({ + one: 'Receipt scanning...', + other: 'Receipts scanning...', + }), receiptScanInProgress: 'Receipt scan in progress', receiptScanInProgressDescription: 'Receipt scan in progress. Check back later or enter the details now.', receiptIssuesFound: () => ({ diff --git a/src/languages/es.ts b/src/languages/es.ts index 1cc45d498b6d..07287f34d9c7 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -884,7 +884,10 @@ const translations = { other: 'Problemas encontrados', }), fieldPending: 'Pendiente...', - receiptScanning: 'Escaneando', + receiptScanning: () => ({ + one: 'Escaneando recibo...', + other: 'Escaneando recibos...', + }), receiptScanInProgress: 'Escaneado de recibo en proceso', receiptScanInProgressDescription: 'Escaneado de recibo en proceso. Vuelve a comprobarlo más tarde o introduce los detalles ahora.', defaultRate: 'Tasa predeterminada', diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 7decfbffeb00..4353aeb1797d 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3687,7 +3687,7 @@ function getTransactionReportName(reportAction: OnyxEntry Date: Fri, 24 Jan 2025 16:21:52 +0700 Subject: [PATCH 18/19] fix logic show preview message --- src/components/ReportActionItem/ReportPreview.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index dd34ccca7cf2..9f8725c2c1c4 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -363,11 +363,14 @@ function ReportPreview({ const previewMessage = useMemo(() => { if (isScanning) { - if (showRTERViolationMessage && totalDisplaySpend) { - return `${translate('common.receipt')} ${CONST.DOT_SEPARATOR} ${translate('iou.pendingMatch')}`; - } return totalDisplaySpend ? `${translate('common.receipt')} ${CONST.DOT_SEPARATOR} ${translate('common.scanning')}` : `${translate('common.receipt')}`; } + if (numberOfPendingRequests === 1 && numberOfRequests === 1) { + return `${translate('common.receipt')} ${CONST.DOT_SEPARATOR} ${translate('iou.pending')}`; + } + if (showRTERViolationMessage) { + return `${translate('common.receipt')} ${CONST.DOT_SEPARATOR} ${translate('iou.pendingMatch')}`; + } let payerOrApproverName; if (isPolicyExpenseChat) { @@ -391,6 +394,9 @@ function ReportPreview({ return translate(paymentVerb, {payer: payerOrApproverName}); }, [ isScanning, + numberOfPendingRequests, + numberOfRequests, + showRTERViolationMessage, isPolicyExpenseChat, isInvoiceRoom, isApproved, @@ -398,7 +404,6 @@ function ReportPreview({ iouReport?.isWaitingOnBankAccount, hasNonReimbursableTransactions, translate, - showRTERViolationMessage, totalDisplaySpend, chatReport, policy, From 226a37b2883039d91f3a18c11bda9fc75d7d1ce5 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 5 Feb 2025 10:49:24 +0700 Subject: [PATCH 19/19] fix ts --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 3daaa376e73c..b04c6adafece 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -235,7 +235,7 @@ function MoneyRequestPreviewContent({ message += ` ${CONST.DOT_SEPARATOR} ${translate('iou.pending')}`; } - if (hasPendingRTERViolation(getTransactionViolations(transactionID, transactionViolations))) { + if (hasPendingRTERViolation(getTransactionViolations(transactionID))) { message += ` ${CONST.DOT_SEPARATOR} ${translate('iou.pendingMatch')}`; }