From 4c071ab880278a8f3e18cb210e10ed5c84bdb5dd Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 22 Apr 2025 09:57:19 +0700 Subject: [PATCH 1/4] fix: Distance expense preview shows Pending --- .../TransactionPreview/TransactionPreviewContent.tsx | 5 ++++- src/libs/ReportUtils.ts | 8 ++++++-- src/libs/TransactionUtils/index.ts | 4 +--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx b/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx index 32df23f475ea..ded6e99c1347 100644 --- a/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx +++ b/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx @@ -2,6 +2,7 @@ import lodashSortBy from 'lodash/sortBy'; import truncate from 'lodash/truncate'; import React, {useMemo} from 'react'; import {View} from 'react-native'; +import {useOnyx} from 'react-native-onyx'; import Button from '@components/Button'; import Icon from '@components/Icon'; import {DotIndicator, Folder, Tag} from '@components/Icon/Expensicons'; @@ -32,6 +33,7 @@ import {hasReceipt as hasReceiptTransactionUtils, isReceiptBeingScanned} from '@ import ViolationsUtils from '@libs/Violations/ViolationsUtils'; import variables from '@styles/variables'; import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; import SCREENS from '@src/SCREENS'; import type {TransactionPreviewContentProps} from './types'; @@ -66,7 +68,8 @@ function TransactionPreviewContent({ backgroundColor: theme.cardBG, }; - const transactionDetails = useMemo>(() => getTransactionDetails(transaction) ?? {}, [transaction]); + const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${iouReport?.policyID || CONST.DEFAULT_NUMBER_ID}`); + const transactionDetails = useMemo>(() => getTransactionDetails(transaction, undefined, policy) ?? {}, [transaction, policy]); const managerID = iouReport?.managerID ?? reportPreviewAction?.childManagerAccountID ?? CONST.DEFAULT_NUMBER_ID; const ownerAccountID = iouReport?.ownerAccountID ?? reportPreviewAction?.childOwnerAccountID ?? CONST.DEFAULT_NUMBER_ID; const isReportAPolicyExpenseChat = isPolicyExpenseChat(chatReport); diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 0b10132b953f..3bf8bafa8b7d 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3672,7 +3672,11 @@ function getMoneyRequestReportName({ * into a flat object. Used for displaying transactions and sending them in API commands */ -function getTransactionDetails(transaction: OnyxInputOrEntry, createdDateFormat: string = CONST.DATE.FNS_FORMAT_STRING): TransactionDetails | undefined { +function getTransactionDetails( + transaction: OnyxInputOrEntry, + createdDateFormat: string = CONST.DATE.FNS_FORMAT_STRING, + policy: OnyxEntry = undefined, +): TransactionDetails | undefined { if (!transaction) { return; } @@ -3685,7 +3689,7 @@ function getTransactionDetails(transaction: OnyxInputOrEntry, creat taxCode: getTaxCode(transaction), currency: getCurrency(transaction), comment: getDescription(transaction), - merchant: getMerchant(transaction), + merchant: getMerchant(transaction, policy), waypoints: getWaypoints(transaction), customUnitRateID: getRateID(transaction), category: getCategory(transaction), diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index ef568db066a2..b5804ff8290b 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -638,10 +638,8 @@ function isFetchingWaypointsFromServer(transaction: OnyxInputOrEntry): string { +function getMerchant(transaction: OnyxInputOrEntry, policy: OnyxEntry = undefined): string { if (transaction && isDistanceRequest(transaction)) { - const report = getReportOrDraftReport(transaction.reportID); - const policy = getPolicy(report?.policyID); const mileageRate = DistanceRequestUtils.getRate({transaction, policy}); const {unit, rate} = mileageRate; const distanceInMeters = getDistanceInMeters(transaction, unit); From 23aeaeacefc63f6063ccd4c50a73bd8fa1792f15 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Fri, 16 May 2025 14:39:25 +0700 Subject: [PATCH 2/4] fix lint --- .../TransactionPreview/TransactionPreviewContent.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx b/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx index d87a9364ea9b..71c8d2a2785e 100644 --- a/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx +++ b/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx @@ -13,6 +13,7 @@ import Text from '@components/Text'; import TransactionPreviewSkeletonView from '@components/TransactionPreviewSkeletonView'; import useLocalize from '@hooks/useLocalize'; import useTheme from '@hooks/useTheme'; +import useThemeStyles from '@hooks/useThemeStyles'; import {convertToDisplayString} from '@libs/CurrencyUtils'; import {calculateAmount} from '@libs/IOUUtils'; import {getAvatarsForAccountIDs} from '@libs/OptionsListUtils'; @@ -53,6 +54,7 @@ function TransactionPreviewContent({ shouldShowIOUData, }: TransactionPreviewContentProps) { const theme = useTheme(); + const styles = useThemeStyles(); const {translate} = useLocalize(); const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${iouReport?.policyID}`, {canBeMissing: true}); From 0d5212e1e5e76bf754e4e793bc11b5a5446db6eb Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Sat, 17 May 2025 11:53:07 +0700 Subject: [PATCH 3/4] fix for old component --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 2 +- src/components/ReportActionItem/ReportPreview.tsx | 2 +- .../TransactionPreview/TransactionPreviewContent.tsx | 4 ++-- src/libs/SearchUIUtils.ts | 9 ++++++--- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 964f9250f033..06ab0d0e98b9 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -142,7 +142,7 @@ function MoneyRequestPreviewContent({ merchant, tag, category, - } = useMemo>(() => getTransactionDetails(transaction) ?? {}, [transaction]); + } = useMemo>(() => getTransactionDetails(transaction, undefined, policy) ?? {}, [transaction, policy]); const description = truncate(StringUtils.lineBreaksToSpaces(Parser.htmlToText(requestComment ?? '')), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const requestMerchant = truncate(merchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 8abb8b93a58f..a3f16350e5b2 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -248,7 +248,7 @@ function ReportPreview({ const lastTransactionViolations = useTransactionViolations(lastTransaction?.transactionID); const showRTERViolationMessage = numberOfRequests === 1 && hasPendingUI(lastTransaction, lastTransactionViolations); const shouldShowBrokenConnectionViolation = numberOfRequests === 1 && shouldShowBrokenConnectionViolationForMultipleTransactions(transactionIDList, iouReport, policy, violations); - let formattedMerchant = numberOfRequests === 1 ? getMerchant(lastTransaction) : null; + let formattedMerchant = numberOfRequests === 1 ? getMerchant(lastTransaction, policy) : null; const formattedDescription = numberOfRequests === 1 ? Parser.htmlToMarkdown(getDescription(lastTransaction)) : null; if (isPartialMerchant(formattedMerchant ?? '')) { diff --git a/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx b/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx index 71c8d2a2785e..2f2d5be48f59 100644 --- a/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx +++ b/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx @@ -2,7 +2,6 @@ import lodashSortBy from 'lodash/sortBy'; import truncate from 'lodash/truncate'; import React, {useMemo} from 'react'; import {View} from 'react-native'; -import {useOnyx} from 'react-native-onyx'; import Icon from '@components/Icon'; import {DotIndicator, Folder, Tag} from '@components/Icon/Expensicons'; import MultipleAvatars from '@components/MultipleAvatars'; @@ -12,6 +11,7 @@ import UserInfoCellsWithArrow from '@components/SelectionList/Search/UserInfoCel import Text from '@components/Text'; import TransactionPreviewSkeletonView from '@components/TransactionPreviewSkeletonView'; import useLocalize from '@hooks/useLocalize'; +import useOnyx from '@hooks/useOnyx'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import {convertToDisplayString} from '@libs/CurrencyUtils'; @@ -57,7 +57,7 @@ function TransactionPreviewContent({ const styles = useThemeStyles(); const {translate} = useLocalize(); - const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${iouReport?.policyID}`, {canBeMissing: true}); + const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${iouReport?.policyID}`); const transactionDetails = useMemo>(() => getTransactionDetails(transaction, undefined, policy) ?? {}, [transaction, policy]); const managerID = iouReport?.managerID ?? reportPreviewAction?.childManagerAccountID ?? CONST.DEFAULT_NUMBER_ID; const ownerAccountID = iouReport?.ownerAccountID ?? reportPreviewAction?.childOwnerAccountID ?? CONST.DEFAULT_NUMBER_ID; diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index af76f63264d7..711c7de0023d 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -134,6 +134,7 @@ function getTransactionItemCommonFormattedProperties( transactionItem: SearchTransaction, from: SearchPersonalDetails, to: SearchPersonalDetails, + policy: SearchPolicy, ): Pick { const isExpenseReport = transactionItem.reportType === CONST.REPORT.TYPE.EXPENSE; @@ -143,7 +144,7 @@ function getTransactionItemCommonFormattedProperties( const formattedTo = formatPhoneNumber(getDisplayNameOrDefault(to, '', false) || getDisplayNameOrDefault(getPersonalDetailsForAccountID(to?.accountID))); const formattedTotal = getTransactionAmount(transactionItem, isExpenseReport); const date = transactionItem?.modifiedCreated ? transactionItem.modifiedCreated : transactionItem?.created; - const merchant = getTransactionMerchant(transactionItem); + const merchant = getTransactionMerchant(transactionItem, policy as OnyxTypes.Policy); const formattedMerchant = merchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT ? '' : merchant; return { @@ -323,10 +324,11 @@ function getTransactionsSections(data: OnyxTypes.SearchResults['data'], metadata const transactionItem = data[key]; const report = data[`${ONYXKEYS.COLLECTION.REPORT}${transactionItem.reportID}`]; const shouldShowBlankTo = isOpenExpenseReport(report); + const policy = data[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]; const from = data.personalDetailsList?.[transactionItem.accountID]; const to = transactionItem.managerID && !shouldShowBlankTo ? data.personalDetailsList?.[transactionItem.managerID] : emptyPersonalDetails; - const {formattedFrom, formattedTo, formattedTotal, formattedMerchant, date} = getTransactionItemCommonFormattedProperties(transactionItem, from, to); + const {formattedFrom, formattedTo, formattedTotal, formattedMerchant, date} = getTransactionItemCommonFormattedProperties(transactionItem, from, to, policy); return { ...transactionItem, @@ -598,12 +600,13 @@ function getReportSections(data: OnyxTypes.SearchResults['data'], metadata: Onyx const transactionItem = {...data[key]}; const reportKey = `${ONYXKEYS.COLLECTION.REPORT}${transactionItem.reportID}`; const report = data[`${ONYXKEYS.COLLECTION.REPORT}${transactionItem.reportID}`]; + const policy = data[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]; const shouldShowBlankTo = isOpenExpenseReport(report); const from = data.personalDetailsList?.[transactionItem.accountID]; const to = transactionItem.managerID && !shouldShowBlankTo ? data.personalDetailsList?.[transactionItem.managerID] : emptyPersonalDetails; - const {formattedFrom, formattedTo, formattedTotal, formattedMerchant, date} = getTransactionItemCommonFormattedProperties(transactionItem, from, to); + const {formattedFrom, formattedTo, formattedTotal, formattedMerchant, date} = getTransactionItemCommonFormattedProperties(transactionItem, from, to, policy); const transaction = { ...transactionItem, From 3c3bef5acc9efcb7031bbc4d9d131fa0b83aaeda Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Sat, 17 May 2025 12:00:31 +0700 Subject: [PATCH 4/4] fix lint --- .../TransactionPreviewContent.tsx | 2 +- src/libs/ReportUtils.ts | 3 +-- src/libs/TransactionUtils/index.ts | 15 +++++++++------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx b/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx index 2f2d5be48f59..16e33d7f551c 100644 --- a/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx +++ b/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx @@ -57,7 +57,7 @@ function TransactionPreviewContent({ const styles = useThemeStyles(); const {translate} = useLocalize(); - const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${iouReport?.policyID}`); + const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${iouReport?.policyID}`, {canBeMissing: true}); const transactionDetails = useMemo>(() => getTransactionDetails(transaction, undefined, policy) ?? {}, [transaction, policy]); const managerID = iouReport?.managerID ?? reportPreviewAction?.childManagerAccountID ?? CONST.DEFAULT_NUMBER_ID; const ownerAccountID = iouReport?.ownerAccountID ?? reportPreviewAction?.childOwnerAccountID ?? CONST.DEFAULT_NUMBER_ID; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 3cfa713b7848..cddf6961dd52 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -231,7 +231,6 @@ import { getTag, getTaxAmount, getTaxCode, - getTransaction, getAmount as getTransactionAmount, getWaypoints, hasMissingSmartscanFields as hasMissingSmartscanFieldsTransactionUtils, @@ -2384,7 +2383,7 @@ function canDeleteTransaction(moneyRequestReport: OnyxEntry): boolean { * Checks whether the card transaction support deleting based on liability type */ function canDeleteCardTransactionByLiabilityType(iouTransactionID?: string): boolean { - const transaction = getTransaction(iouTransactionID ?? CONST.DEFAULT_NUMBER_ID); + const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${iouTransactionID}`]; const isCardTransaction = isCardTransactionTransactionUtils(transaction); if (!isCardTransaction) { return true; diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index f8d91bf504fb..3dde8fa1e262 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -27,6 +27,7 @@ import { } from '@libs/PolicyUtils'; import {getOriginalMessage, getReportAction, isMoneyRequestAction} from '@libs/ReportActionsUtils'; import { + getReportOrDraftReport, getReportTransactions, isCurrentUserSubmitter, isOpenExpenseReport, @@ -639,8 +640,10 @@ function isFetchingWaypointsFromServer(transaction: OnyxInputOrEntry, policy: OnyxEntry = undefined): string { +function getMerchant(transaction: OnyxInputOrEntry, policyParam: OnyxEntry = undefined): string { if (transaction && isDistanceRequest(transaction)) { + const report = getReportOrDraftReport(transaction.reportID); + const policy = policyParam ?? getPolicy(report?.policyID); const mileageRate = DistanceRequestUtils.getRate({transaction, policy}); const {unit, rate} = mileageRate; const distanceInMeters = getDistanceInMeters(transaction, unit); @@ -825,7 +828,7 @@ function hasMissingSmartscanFields(transaction: OnyxInputOrEntry): * Get all transaction violations of the transaction with given transactionID. */ function getTransactionViolations(transactionID: string | undefined, transactionViolations: OnyxCollection | undefined): TransactionViolations | undefined { - const transaction = getTransaction(transactionID); + const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; if (!transactionID || !transactionViolations) { return undefined; } @@ -1018,7 +1021,7 @@ function getRecentTransactions(transactions: Record, size = 2): * @param checkDismissed - whether to check if the violation has already been dismissed as well */ function isDuplicate(transactionID: string | undefined, checkDismissed = false): boolean { - const transaction = getTransaction(transactionID); + const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; if (!transaction) { return false; } @@ -1108,7 +1111,7 @@ function hasDuplicateTransactions(iouReportID?: string, allReportTransactions?: * Checks if any violations for the provided transaction are of type 'notice' */ function hasNoticeTypeViolation(transactionID: string | undefined, transactionViolations: TransactionViolation[] | OnyxCollection, showInReview?: boolean): boolean { - const transaction = getTransaction(transactionID); + const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; if (!doesTransactionSupportViolations(transaction)) { return false; } @@ -1126,7 +1129,7 @@ function hasNoticeTypeViolation(transactionID: string | undefined, transactionVi * Checks if any violations for the provided transaction are of type 'warning' */ function hasWarningTypeViolation(transactionID: string | undefined, transactionViolations: TransactionViolation[] | OnyxCollection, showInReview?: boolean): boolean { - const transaction = getTransaction(transactionID); + const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; if (!doesTransactionSupportViolations(transaction)) { return false; } @@ -1312,7 +1315,7 @@ function compareDuplicateTransactionFields( } const transactionViolations = allTransactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${reviewingTransactionID}`]; const duplicates = transactionViolations?.find((violation) => violation.name === CONST.VIOLATIONS.DUPLICATED_TRANSACTION)?.data?.duplicates ?? []; - const transactions = removeSettledAndApprovedTransactions([reviewingTransactionID, ...duplicates]).map((item) => getTransaction(item)); + const transactions = removeSettledAndApprovedTransactions([reviewingTransactionID, ...duplicates]).map((item) => allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${item}`]); const fieldsToCompare: FieldsToCompare = { merchant: ['modifiedMerchant', 'merchant'],