diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index c7a665480dbb6..0f8ce631fb725 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -185,8 +185,8 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea const isPayAtEndExpense = isPayAtEndExpenseTransactionUtils(transaction); const isArchivedReport = isArchivedReportWithID(moneyRequestReport?.reportID); const [archiveReason] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${moneyRequestReport?.reportID}`, {selector: getArchiveReason, canBeMissing: true}); - const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${moneyRequestReport?.reportID}`, {canBeMissing: true}); + const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${moneyRequestReport?.reportID}`, {canBeMissing: true}); const getCanIOUBePaid = useCallback( (onlyShowPayElsewhere = false, shouldCheckApprovedState = true) => canIOUBePaidAction(moneyRequestReport, chatReport, policy, transaction ? [transaction] : undefined, onlyShowPayElsewhere, undefined, undefined, shouldCheckApprovedState), diff --git a/src/hooks/useSelectedTransactionsActions.ts b/src/hooks/useSelectedTransactionsActions.ts index 1d62471a80d43..75bcb7d9171bc 100644 --- a/src/hooks/useSelectedTransactionsActions.ts +++ b/src/hooks/useSelectedTransactionsActions.ts @@ -5,8 +5,8 @@ import {deleteMoneyRequest, unholdRequest} from '@libs/actions/IOU'; import {exportReportToCSV} from '@libs/actions/Report'; import Navigation from '@libs/Navigation/Navigation'; import {getIOUActionForTransactionID, getOriginalMessage, isDeletedAction, isMoneyRequestAction} from '@libs/ReportActionsUtils'; -import {canDeleteCardTransactionByLiabilityType, canDeleteTransaction, isMoneyRequestReport as isMoneyRequestReportUtils} from '@libs/ReportUtils'; -import {getTransaction, isOnHold} from '@libs/TransactionUtils'; +import {canDeleteCardTransactionByLiabilityType, canDeleteTransaction, canHoldUnholdReportAction, isMoneyRequestReport as isMoneyRequestReportUtils} from '@libs/ReportUtils'; +import {getTransaction} from '@libs/TransactionUtils'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; import type {OriginalMessageIOU, Report, ReportAction, Session} from '@src/types/onyx'; @@ -25,14 +25,28 @@ function useSelectedTransactionsActions({report, reportActions, session, onExpor return []; } const options = []; + const isMoneyRequestReport = isMoneyRequestReportUtils(report); const selectedTransactions = selectedTransactionsID.map((transactionID) => getTransaction(transactionID)).filter((t) => !!t); - - const anyTransactionOnHold = selectedTransactions.some(isOnHold); - const allTransactionOnHold = selectedTransactions.every(isOnHold); const isReportReimbursed = report?.stateNum === CONST.REPORT.STATE_NUM.APPROVED && report?.statusNum === CONST.REPORT.STATUS_NUM.REIMBURSED; - const isMoneyRequestReport = isMoneyRequestReportUtils(report); + let canHoldTransactions = isMoneyRequestReport && !isReportReimbursed; + let canUnholdTransactions = isMoneyRequestReport; + + selectedTransactions.forEach((selectedTransaction) => { + if (!selectedTransaction?.transactionID) { + canHoldTransactions = false; + canUnholdTransactions = false; + return true; + } + const iouReportAction = getIOUActionForTransactionID(reportActions, selectedTransaction.transactionID); + const {canHoldRequest, canUnholdRequest} = canHoldUnholdReportAction(iouReportAction); + + canHoldTransactions = canHoldTransactions && canHoldRequest; + canUnholdTransactions = canUnholdTransactions && canUnholdRequest; + + return !(canHoldTransactions || canUnholdTransactions); + }); - if (isMoneyRequestReport && !anyTransactionOnHold && selectedTransactions.length === 1 && !isReportReimbursed) { + if (canHoldTransactions) { options.push({ text: translate('iou.hold'), icon: Expensicons.Stopwatch, @@ -46,7 +60,7 @@ function useSelectedTransactionsActions({report, reportActions, session, onExpor }); } - if (isMoneyRequestReport && allTransactionOnHold && selectedTransactions.length === 1) { + if (canUnholdTransactions) { options.push({ text: translate('iou.unhold'), icon: Expensicons.Stopwatch, diff --git a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx index f5b7fb9b128b9..3eb2a415f5d33 100644 --- a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx +++ b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx @@ -20,12 +20,7 @@ function SearchMoneyRequestReportHoldReasonPage({route}: PlatformStackScreenProp const {selectedTransactionsID, setSelectedTransactionsID} = useMoneyRequestReportContext(); const onSubmit = (values: FormOnyxValues) => { - const firstTransactionID = selectedTransactionsID.at(0); - if (!firstTransactionID) { - return; - } - - putOnHold(firstTransactionID, values.comment, reportID); + selectedTransactionsID.forEach((transactionID) => putOnHold(transactionID, values.comment, reportID)); setSelectedTransactionsID([]); Navigation.goBack();