diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 9df26fc194511..8b634e8387dec 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -8638,6 +8638,9 @@ const CONST = { REMOVE_SPLIT_BUTTON: 'SplitExpense-RemoveSplitButton', EDIT_SAVE_BUTTON: 'SplitExpense-EditSaveButton', }, + MERGE_EXPENSE: { + MERGE_TRANSACTION_ITEM: 'MergeExpense-MergeTransactionItem', + }, IOU_REQUEST_STEP: { DISTANCE_NEXT_BUTTON: 'IOURequestStep-DistanceNextButton', DISTANCE_MAP_NEXT_BUTTON: 'IOURequestStep-DistanceMapNextButton', diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportTransactionItem.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportTransactionItem.tsx index da6b76dc384b0..a789adcbf7c39 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportTransactionItem.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportTransactionItem.tsx @@ -1,5 +1,6 @@ import React, {useEffect, useRef} from 'react'; import type {View} from 'react-native'; +import type {OnyxEntry} from 'react-native-onyx'; import {getButtonRole} from '@components/Button/utils'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import {PressableWithFeedback} from '@components/Pressable'; @@ -17,7 +18,7 @@ import canUseTouchScreen from '@libs/DeviceCapabilities/canUseTouchScreen'; import {getTransactionPendingAction, isTransactionPendingDelete} from '@libs/TransactionUtils'; import variables from '@styles/variables'; import CONST from '@src/CONST'; -import type {Report} from '@src/types/onyx'; +import type {Policy, Report} from '@src/types/onyx'; import type {TransactionWithOptionalHighlight} from './MoneyRequestReportTransactionList'; type MoneyRequestReportTransactionItemProps = { @@ -27,6 +28,9 @@ type MoneyRequestReportTransactionItemProps = { /** Report to which the transaction belongs */ report: Report; + /** Policy to which the transaction belongs */ + policy: OnyxEntry; + /** Whether the mobile selection mode is enabled */ isSelectionModeEnabled: boolean; @@ -67,6 +71,7 @@ type MoneyRequestReportTransactionItemProps = { function MoneyRequestReportTransactionItem({ transaction, report, + policy, isSelectionModeEnabled, toggleTransaction, isSelected, @@ -139,6 +144,7 @@ function MoneyRequestReportTransactionItem({ transactionItem={transaction} violations={filteredViolations} report={report} + policy={policy} isSelected={isSelected} dateColumnSize={dateColumnSize} amountColumnSize={amountColumnSize} diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx index f584a03093852..ef8f17f98c8d0 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx @@ -516,6 +516,7 @@ function MoneyRequestReportTransactionList({ shouldBeHighlighted={highlightedTransactionIDs.has(transaction.transactionID)} columns={columnsToShow} report={report} + policy={policy} isSelectionModeEnabled={isMobileSelectionModeEnabled} toggleTransaction={toggleTransaction} isSelected={isTransactionSelected(transaction.transactionID)} @@ -539,6 +540,7 @@ function MoneyRequestReportTransactionList({ shouldBeHighlighted={highlightedTransactionIDs.has(transaction.transactionID)} columns={columnsToShow} report={report} + policy={policy} isSelectionModeEnabled={isMobileSelectionModeEnabled} toggleTransaction={toggleTransaction} isSelected={isTransactionSelected(transaction.transactionID)} diff --git a/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx b/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx index 9c7343306f184..4d6c2e4e5977f 100644 --- a/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx +++ b/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx @@ -179,6 +179,7 @@ function TransactionGroupListExpanded({ const transactionRow = ( ({ onCheckboxPress?.(item)} diff --git a/src/components/TransactionItemRow/index.tsx b/src/components/TransactionItemRow/index.tsx index 87002d6a66467..ad6c38ab1e90f 100644 --- a/src/components/TransactionItemRow/index.tsx +++ b/src/components/TransactionItemRow/index.tsx @@ -107,6 +107,7 @@ type TransactionWithOptionalSearchFields = TransactionWithOptionalHighlight & { type TransactionItemRowProps = { transactionItem: TransactionWithOptionalSearchFields; report?: Report; + policy?: Policy; shouldUseNarrowLayout: boolean; isSelected: boolean; shouldShowTooltip: boolean; @@ -158,6 +159,7 @@ function getMerchantName(transactionItem: TransactionWithOptionalSearchFields, t function TransactionItemRow({ transactionItem, report, + policy, shouldUseNarrowLayout, isSelected, shouldShowTooltip, @@ -232,7 +234,8 @@ function TransactionItemRow({ return ''; } - const isCustomUnitOutOfPolicy = isUnreportedAndHasInvalidDistanceRateTransaction(transactionItem); + const policyParam = policy ?? transactionItem.policy; + const isCustomUnitOutOfPolicy = isUnreportedAndHasInvalidDistanceRateTransaction(transactionItem, policyParam); const hasFieldErrors = hasMissingSmartscanFields(transactionItem, report) || isCustomUnitOutOfPolicy; if (hasFieldErrors) { const amountMissing = isAmountMissing(transactionItem); @@ -250,7 +253,7 @@ function TransactionItemRow({ } return error; } - }, [transactionItem, translate, report]); + }, [transactionItem, translate, report, policy]); const exchangeRateMessage = getExchangeRate(transactionItem); diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index b656bde1d0ba4..d5b97a98683cd 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -1117,11 +1117,8 @@ function isFetchingWaypointsFromServer(transaction: OnyxInputOrEntry, policyParam: OnyxEntry = undefined) { +function isUnreportedAndHasInvalidDistanceRateTransaction(transaction: OnyxInputOrEntry, policy: OnyxEntry) { if (transaction && isDistanceRequest(transaction)) { - const report = getReportOrDraftReport(transaction.reportID); - // eslint-disable-next-line @typescript-eslint/no-deprecated - const policy = policyParam ?? getPolicy(report?.policyID); const {rate} = DistanceRequestUtils.getRate({transaction, policy}); const isUnreportedExpense = !transaction.reportID || transaction.reportID === CONST.REPORT.UNREPORTED_REPORT_ID || String(transaction.reportID) === CONST.REPORT.SPLIT_REPORT_ID; diff --git a/src/pages/TransactionMerge/MergeTransactionItem.tsx b/src/pages/TransactionMerge/MergeTransactionItem.tsx index 79eda49854f96..9e1ed63c87278 100644 --- a/src/pages/TransactionMerge/MergeTransactionItem.tsx +++ b/src/pages/TransactionMerge/MergeTransactionItem.tsx @@ -6,17 +6,22 @@ import {PressableWithFeedback} from '@components/Pressable'; import type {ListItem, ListItemProps, TransactionListItemType} from '@components/SelectionListWithSections/types'; import TransactionItemRow from '@components/TransactionItemRow'; import useAnimatedHighlightStyle from '@hooks/useAnimatedHighlightStyle'; +import useOnyx from '@hooks/useOnyx'; +import usePolicy from '@hooks/usePolicy'; import useStyleUtils from '@hooks/useStyleUtils'; import useSyncFocus from '@hooks/useSyncFocus'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import variables from '@styles/variables'; import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; function MergeTransactionItem({item, isFocused, showTooltip, isDisabled, onFocus, shouldSyncFocus, onSelectRow}: ListItemProps) { const styles = useThemeStyles(); const transactionItem = item as unknown as TransactionListItemType; const theme = useTheme(); + const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionItem.reportID}`); + const policy = usePolicy(report?.policyID); const animatedHighlightStyle = useAnimatedHighlightStyle({ borderRadius: variables.componentBorderRadius, @@ -33,6 +38,7 @@ function MergeTransactionItem({item, isFocused, showTool { onSelectRow(item); }} @@ -53,6 +59,8 @@ function MergeTransactionItem({item, isFocused, showTool >