From f831f4fede6b4b9e1b98c0bb6ab53ea53e36551a Mon Sep 17 00:00:00 2001 From: Antony Kithinzi Date: Tue, 20 May 2025 00:32:23 +0300 Subject: [PATCH 1/8] implementing bulk hold --- src/libs/API/types.ts | 1 + src/libs/actions/IOU.ts | 199 ++++++++++++++++++ ...SearchMoneyRequestReportHoldReasonPage.tsx | 5 +- 3 files changed, 202 insertions(+), 3 deletions(-) diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 950c15dc3af9f..253b0e8fce46b 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -199,6 +199,7 @@ const WRITE_COMMANDS = { UPDATE_MONEY_REQUEST_DESCRIPTION: 'UpdateMoneyRequestDescription', UPDATE_MONEY_REQUEST_AMOUNT_AND_CURRENCY: 'UpdateMoneyRequestAmountAndCurrency', HOLD_MONEY_REQUEST: 'HoldRequest', + BULK_HOLD_MONEY_REQUEST: 'BulkHoldRequest', UPDATE_BILLING_CARD_CURRENCY: 'UpdateBillingCardCurrency', UNHOLD_MONEY_REQUEST: 'UnHoldRequest', REQUEST_MONEY: 'RequestMoney', diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 0cadeaddf812f..853cc37e8129f 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -76,6 +76,8 @@ import { } from '@libs/PolicyUtils'; import { getAllReportActions, + getIOUActionForReportID, + getIOUActionForTransactionID, getIOUReportIDFromReportActionPreview, getLastVisibleAction, getLastVisibleMessage, @@ -342,6 +344,18 @@ type PayMoneyRequestData = { failureData: OnyxUpdate[]; }; +type HoldDataEntry = { + transactionThreadReportID?: string; + transactionThreadCreatedReportActionID?: string; + holdReportActionID: string; + commentReportActionID: string; +}; + +type BulkHoldParams = { + holdData: Record; + comment: string; +}; + type SendMoneyParamsData = { params: SendMoneyParams; optimisticData: OnyxUpdate[]; @@ -10358,6 +10372,190 @@ function putOnHold(transactionID: string, comment: string, reportID: string, sea Navigation.setNavigationActionToMicrotaskQueue(() => notifyNewAction(currentReportID, userAccountID)); } +/** + * Put bulk expenses on HOLD + */ +function putOnHoldBulk(transactionIDs: string[], comment: string, reportID: string, searchHash?: number) { + const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; + + const successData: OnyxUpdate[] = []; + const failureData: OnyxUpdate[] = []; + + const currentTime = DateUtils.getDBTime(); + const createdReportAction = buildOptimisticHoldReportAction(currentTime); + const createdReportActionComment = buildOptimisticHoldReportActionComment(comment, DateUtils.addMillisecondsFromDateTime(currentTime, 1)); + const parentReportActionOptimistic = getOptimisticDataForParentReportAction(reportID, createdReportActionComment.created, CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD); + + const optimisticData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, + value: { + [createdReportAction.reportActionID]: createdReportAction as ReportAction, + [createdReportActionComment.reportActionID]: createdReportActionComment as ReportAction, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, + value: { + lastVisibleActionCreated: createdReportActionComment.created, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, + value: { + [createdReportAction.reportActionID]: null, + [createdReportActionComment.reportActionID]: null, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, + value: { + lastVisibleActionCreated: report?.lastVisibleActionCreated, + }, + }, + ]; + + parentReportActionOptimistic.forEach((parentActionData) => { + if (!parentActionData) { + return; + } + optimisticData.push(parentActionData); + }); + + const reportActions = Object.values(getAllReportActions(reportID)); + const holdData: Record = {}; + const iouReportsOptimisticData: Record> = {}; + const iouReportsFailureData: Record> = {}; + + transactionIDs.forEach((transactionID) => { + const newViolation = {name: CONST.VIOLATIONS.HOLD, type: CONST.VIOLATION_TYPES.VIOLATION, showInReview: true}; + const transactionViolations = allTransactionViolations[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`] ?? []; + const updatedViolations = [...transactionViolations, newViolation]; + const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; + + const iouAction = getIOUActionForTransactionID(reportActions, transactionID); + const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`]; + const transactionThreadReportID = iouAction?.childReportID; + const iouReportID = transaction?.reportID; + + const iouReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID}`] ?? {}; + const createdAction = Object.values(iouReportActions) + .filter((action) => action?.isOptimisticAction && action?.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED) + .at(0); + + holdData[transactionID] = { + transactionThreadReportID: createdAction?.reportID, + transactionThreadCreatedReportActionID: createdAction?.reportActionID, + holdReportActionID: createdReportAction.reportActionID, + commentReportActionID: createdReportActionComment.reportActionID, + }; + + if (iouReportID && iouReport && iouReport.currency === transaction?.currency) { + const isExpenseReportLocal = isExpenseReport(iouReport); + const coefficient = isExpenseReportLocal ? -1 : 1; + const transactionAmount = getAmount(transaction, isExpenseReportLocal) * coefficient; + const value = iouReportsOptimisticData?.[iouReportID] ?? iouReport; + iouReportsOptimisticData[iouReportID] = { + unheldTotal: (value?.unheldTotal ?? 0) - transactionAmount, + unheldNonReimbursableTotal: !transaction?.reimbursable ? (value?.unheldNonReimbursableTotal ?? 0) - transactionAmount : value.unheldNonReimbursableTotal, + }; + iouReportsFailureData[iouReportID] = iouReportsFailureData?.[iouReportID] ?? { + unheldTotal: iouReport?.unheldTotal, + unheldNonReimbursableTotal: iouReport?.unheldNonReimbursableTotal, + }; + } + + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + comment: { + hold: createdReportAction.reportActionID, + }, + }, + }); + + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, + value: updatedViolations, + }); + + successData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + pendingAction: null, + }, + }); + + failureData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + pendingAction: null, + comment: { + hold: null, + }, + errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericHoldExpenseFailureMessage'), + }, + }); + + // If we are holding from the search page, we optimistically update the snapshot data that search uses so that it is kept in sync + if (!searchHash) { + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, + value: { + data: { + [`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: { + canHold: false, + canUnhold: true, + }, + }, + } as Record>>, + }); + + failureData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, + value: { + data: { + [`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: { + canHold: true, + canUnhold: false, + }, + }, + } as Record>>, + }); + } + }); + + Object.keys(iouReportsOptimisticData).forEach((iouReportID) => { + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, + value: iouReportsOptimisticData[iouReportID], + }); + + failureData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, + value: iouReportsFailureData, + }); + }); + + API.write(WRITE_COMMANDS.BULK_HOLD_MONEY_REQUEST, {holdData, comment}, {optimisticData, successData, failureData}); + + const currentReportID = getDisplayedReportID(reportID); + Navigation.setNavigationActionToMicrotaskQueue(() => notifyNewAction(currentReportID, userAccountID)); +} + /** * Remove expense from HOLD */ @@ -10961,6 +11159,7 @@ export { payInvoice, payMoneyRequest, putOnHold, + putOnHoldBulk, replaceReceipt, requestMoney, resetSplitShares, diff --git a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx index 3eb2a415f5d33..a7511b47ed359 100644 --- a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx +++ b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx @@ -2,7 +2,7 @@ import React, {useCallback, useEffect} from 'react'; import type {FormInputErrors, FormOnyxValues} from '@components/Form/types'; import {useMoneyRequestReportContext} from '@components/MoneyRequestReportView/MoneyRequestReportContext'; import useLocalize from '@hooks/useLocalize'; -import {putOnHold} from '@libs/actions/IOU'; +import {putOnHoldBulk} from '@libs/actions/IOU'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SearchReportParamList} from '@libs/Navigation/types'; @@ -20,8 +20,7 @@ function SearchMoneyRequestReportHoldReasonPage({route}: PlatformStackScreenProp const {selectedTransactionsID, setSelectedTransactionsID} = useMoneyRequestReportContext(); const onSubmit = (values: FormOnyxValues) => { - selectedTransactionsID.forEach((transactionID) => putOnHold(transactionID, values.comment, reportID)); - + putOnHoldBulk(selectedTransactionsID, values.comment, reportID); setSelectedTransactionsID([]); Navigation.goBack(); }; From 44ba96af9c1c3b1def34fccf4d0d47da68068dfc Mon Sep 17 00:00:00 2001 From: Antony Kithinzi Date: Tue, 20 May 2025 01:01:06 +0300 Subject: [PATCH 2/8] refactoring --- src/libs/actions/IOU.ts | 42 ++++++++++--------- ...SearchMoneyRequestReportHoldReasonPage.tsx | 4 +- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 853cc37e8129f..f9f48d6d7ffb7 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10427,9 +10427,9 @@ function putOnHoldBulk(transactionIDs: string[], comment: string, reportID: stri }); const reportActions = Object.values(getAllReportActions(reportID)); - const holdData: Record = {}; + const iouReportsOptimisticData: Record> = {}; - const iouReportsFailureData: Record> = {}; + const holdData: Record = {}; transactionIDs.forEach((transactionID) => { const newViolation = {name: CONST.VIOLATIONS.HOLD, type: CONST.VIOLATION_TYPES.VIOLATION, showInReview: true}; @@ -10437,13 +10437,8 @@ function putOnHoldBulk(transactionIDs: string[], comment: string, reportID: stri const updatedViolations = [...transactionViolations, newViolation]; const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; - const iouAction = getIOUActionForTransactionID(reportActions, transactionID); - const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`]; - const transactionThreadReportID = iouAction?.childReportID; - const iouReportID = transaction?.reportID; - - const iouReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID}`] ?? {}; - const createdAction = Object.values(iouReportActions) + const transactionThreadReportID = getIOUActionForTransactionID(reportActions, transactionID)?.childReportID; + const createdAction = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID}`] ?? {}) .filter((action) => action?.isOptimisticAction && action?.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED) .at(0); @@ -10454,19 +10449,16 @@ function putOnHoldBulk(transactionIDs: string[], comment: string, reportID: stri commentReportActionID: createdReportActionComment.reportActionID, }; - if (iouReportID && iouReport && iouReport.currency === transaction?.currency) { + const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`]; + if (transaction?.reportID && iouReport && iouReport.currency === transaction?.currency) { const isExpenseReportLocal = isExpenseReport(iouReport); const coefficient = isExpenseReportLocal ? -1 : 1; const transactionAmount = getAmount(transaction, isExpenseReportLocal) * coefficient; - const value = iouReportsOptimisticData?.[iouReportID] ?? iouReport; - iouReportsOptimisticData[iouReportID] = { + const value = iouReportsOptimisticData?.[transaction?.reportID] ?? iouReport; + iouReportsOptimisticData[transaction?.reportID] = { unheldTotal: (value?.unheldTotal ?? 0) - transactionAmount, unheldNonReimbursableTotal: !transaction?.reimbursable ? (value?.unheldNonReimbursableTotal ?? 0) - transactionAmount : value.unheldNonReimbursableTotal, }; - iouReportsFailureData[iouReportID] = iouReportsFailureData?.[iouReportID] ?? { - unheldTotal: iouReport?.unheldTotal, - unheldNonReimbursableTotal: iouReport?.unheldNonReimbursableTotal, - }; } optimisticData.push({ @@ -10536,21 +10528,31 @@ function putOnHoldBulk(transactionIDs: string[], comment: string, reportID: stri } }); - Object.keys(iouReportsOptimisticData).forEach((iouReportID) => { + Object.entries(iouReportsOptimisticData).forEach(([iouReportID, data]) => { optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, - value: iouReportsOptimisticData[iouReportID], + value: data, }); + const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`]; failureData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, - value: iouReportsFailureData, + value: { + unheldTotal: iouReport?.unheldTotal, + unheldNonReimbursableTotal: iouReport?.unheldNonReimbursableTotal, + }, }); }); - API.write(WRITE_COMMANDS.BULK_HOLD_MONEY_REQUEST, {holdData, comment}, {optimisticData, successData, failureData}); + API.write( + WRITE_COMMANDS.BULK_HOLD_MONEY_REQUEST, { + holdData: JSON.stringify(holdData), + comment + }, + {optimisticData, successData, failureData} + ); const currentReportID = getDisplayedReportID(reportID); Navigation.setNavigationActionToMicrotaskQueue(() => notifyNewAction(currentReportID, userAccountID)); diff --git a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx index a7511b47ed359..33c130273b101 100644 --- a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx +++ b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx @@ -16,11 +16,11 @@ import INPUT_IDS from '@src/types/form/MoneyRequestHoldReasonForm'; function SearchMoneyRequestReportHoldReasonPage({route}: PlatformStackScreenProps) { const {translate} = useLocalize(); - const {backTo, reportID} = route.params; + const {backTo, reportID, searchHash} = route.params; const {selectedTransactionsID, setSelectedTransactionsID} = useMoneyRequestReportContext(); const onSubmit = (values: FormOnyxValues) => { - putOnHoldBulk(selectedTransactionsID, values.comment, reportID); + putOnHoldBulk(selectedTransactionsID, values.comment, reportID, searchHash); setSelectedTransactionsID([]); Navigation.goBack(); }; From be271d3bf05fbbb9fc408633df463b40b121864b Mon Sep 17 00:00:00 2001 From: Antony Kithinzi Date: Tue, 20 May 2025 22:33:21 +0300 Subject: [PATCH 3/8] creating BulkHoldRequestParams --- .../API/parameters/BulkHoldRequestParams.ts | 6 + src/libs/API/parameters/index.ts | 1 + src/libs/API/types.ts | 1 + src/libs/actions/IOU.ts | 299 +++++++++++------- ...SearchMoneyRequestReportHoldReasonPage.tsx | 6 +- 5 files changed, 192 insertions(+), 121 deletions(-) create mode 100644 src/libs/API/parameters/BulkHoldRequestParams.ts diff --git a/src/libs/API/parameters/BulkHoldRequestParams.ts b/src/libs/API/parameters/BulkHoldRequestParams.ts new file mode 100644 index 0000000000000..87a1f79bc342b --- /dev/null +++ b/src/libs/API/parameters/BulkHoldRequestParams.ts @@ -0,0 +1,6 @@ +type BulkHoldRequestParams = { + holdData: string; // This is a json object with shape Record; + comment: string; +}; + +export default BulkHoldRequestParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 510e5cc8efff9..e994e41962fe0 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -168,6 +168,7 @@ export type {default as SubmitReportParams} from './SubmitReportParams'; export type {default as DetachReceiptParams} from './DetachReceiptParams'; export type {default as PayMoneyRequestParams} from './PayMoneyRequestParams'; export type {default as HoldMoneyRequestParams} from './HoldMoneyRequestParams'; +export type {default as BulkHoldRequestParams} from './BulkHoldRequestParams'; export type {default as UnHoldMoneyRequestParams} from './UnHoldMoneyRequestParams'; export type {default as CancelPaymentParams} from './CancelPaymentParams'; export type {default as AcceptACHContractForBankAccount} from './AcceptACHContractForBankAccount'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 253b0e8fce46b..81e2ccc5bddcd 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -665,6 +665,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.UPDATE_MONEY_REQUEST_CATEGORY]: Parameters.UpdateMoneyRequestParams; [WRITE_COMMANDS.UPDATE_MONEY_REQUEST_DESCRIPTION]: Parameters.UpdateMoneyRequestParams; [WRITE_COMMANDS.HOLD_MONEY_REQUEST]: Parameters.HoldMoneyRequestParams; + [WRITE_COMMANDS.BULK_HOLD_MONEY_REQUEST]: Parameters.BulkHoldRequestParams; [WRITE_COMMANDS.UNHOLD_MONEY_REQUEST]: Parameters.UnHoldMoneyRequestParams; [WRITE_COMMANDS.UPDATE_MONEY_REQUEST_AMOUNT_AND_CURRENCY]: Parameters.UpdateMoneyRequestParams; [WRITE_COMMANDS.REQUEST_MONEY]: Parameters.RequestMoneyParams; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 7c714dd9eb27a..34fc065c22104 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -77,7 +77,6 @@ import { } from '@libs/PolicyUtils'; import { getAllReportActions, - getIOUActionForReportID, getIOUActionForTransactionID, getIOUReportIDFromReportActionPreview, getLastVisibleAction, @@ -117,6 +116,7 @@ import { buildOptimisticSubmittedReportAction, buildOptimisticUnapprovedReportAction, buildOptimisticUnHoldReportAction, + buildTransactionThread, canBeAutoReimbursed, canUserPerformWriteAction as canUserPerformWriteActionReportUtils, getAllHeldTransactions as getAllHeldTransactionsReportUtils, @@ -352,11 +352,6 @@ type HoldDataEntry = { commentReportActionID: string; }; -type BulkHoldParams = { - holdData: Record; - comment: string; -}; - type SendMoneyParamsData = { params: SendMoneyParams; optimisticData: OnyxUpdate[]; @@ -10376,110 +10371,163 @@ function putOnHold(transactionID: string, comment: string, reportID: string, sea } /** - * Put bulk expenses on HOLD + * Put expenses on HOLD in bulk */ -function putOnHoldBulk(transactionIDs: string[], comment: string, reportID: string, searchHash?: number) { - const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; - +function bulkHold(transactionIDs: string[], comment: string, iouReportID: string, searchHash?: number) { + const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`]; + const iouReportActions = Object.values(getAllReportActions(iouReportID)); + const iouReportOptimisticData: Partial = {}; + const holdData: Record = {}; + const optimisticData: OnyxUpdate[] = []; const successData: OnyxUpdate[] = []; const failureData: OnyxUpdate[] = []; - const currentTime = DateUtils.getDBTime(); - const createdReportAction = buildOptimisticHoldReportAction(currentTime); - const createdReportActionComment = buildOptimisticHoldReportActionComment(comment, DateUtils.addMillisecondsFromDateTime(currentTime, 1)); - const parentReportActionOptimistic = getOptimisticDataForParentReportAction(reportID, createdReportActionComment.created, CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD); - - const optimisticData: OnyxUpdate[] = [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, - value: { - [createdReportAction.reportActionID]: createdReportAction as ReportAction, - [createdReportActionComment.reportActionID]: createdReportActionComment as ReportAction, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, - value: { - lastVisibleActionCreated: createdReportActionComment.created, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, - value: { - [createdReportAction.reportActionID]: null, - [createdReportActionComment.reportActionID]: null, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, - value: { - lastVisibleActionCreated: report?.lastVisibleActionCreated, - }, - }, - ]; + transactionIDs.forEach((transactionID) => { + const iouAction = getIOUActionForTransactionID(iouReportActions, transactionID); - parentReportActionOptimistic.forEach((parentActionData) => { - if (!parentActionData) { + if (!iouAction) { return; } - optimisticData.push(parentActionData); - }); - const reportActions = Object.values(getAllReportActions(reportID)); - - const iouReportsOptimisticData: Record> = {}; - const holdData: Record = {}; + const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; + + if (iouReport && iouReport.currency === transaction?.currency) { + const isExpenseReportLocal = isExpenseReport(iouReport); + const coefficient = isExpenseReportLocal ? -1 : 1; + const transactionAmount = getAmount(transaction, isExpenseReportLocal) * coefficient; + iouReportOptimisticData.unheldTotal = (iouReportOptimisticData.unheldTotal ?? 0) - transactionAmount; + iouReportOptimisticData.unheldNonReimbursableTotal = !transaction?.reimbursable + ? (iouReportOptimisticData.unheldNonReimbursableTotal ?? 0) - transactionAmount + : iouReportOptimisticData.unheldNonReimbursableTotal; + } - transactionIDs.forEach((transactionID) => { - const newViolation = {name: CONST.VIOLATIONS.HOLD, type: CONST.VIOLATION_TYPES.VIOLATION, showInReview: true}; const transactionViolations = allTransactionViolations[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`] ?? []; + const newViolation = {name: CONST.VIOLATIONS.HOLD, type: CONST.VIOLATION_TYPES.VIOLATION, showInReview: true}; const updatedViolations = [...transactionViolations, newViolation]; - const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; - const transactionThreadReportID = getIOUActionForTransactionID(reportActions, transactionID)?.childReportID; - const createdAction = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID}`] ?? {}) - .filter((action) => action?.isOptimisticAction && action?.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED) - .at(0); + const currentTime = DateUtils.getDBTime(); + const createdReportAction = buildOptimisticHoldReportAction(currentTime); + const createdReportActionComment = buildOptimisticHoldReportActionComment(comment, DateUtils.addMillisecondsFromDateTime(currentTime, 1)); holdData[transactionID] = { - transactionThreadReportID: createdAction?.reportID, - transactionThreadCreatedReportActionID: createdAction?.reportActionID, holdReportActionID: createdReportAction.reportActionID, commentReportActionID: createdReportActionComment.reportActionID, }; - const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`]; - if (transaction?.reportID && iouReport && iouReport.currency === transaction?.currency) { - const isExpenseReportLocal = isExpenseReport(iouReport); - const coefficient = isExpenseReportLocal ? -1 : 1; - const transactionAmount = getAmount(transaction, isExpenseReportLocal) * coefficient; - const value = iouReportsOptimisticData?.[transaction?.reportID] ?? iouReport; - iouReportsOptimisticData[transaction?.reportID] = { - unheldTotal: (value?.unheldTotal ?? 0) - transactionAmount, - unheldNonReimbursableTotal: !transaction?.reimbursable ? (value?.unheldNonReimbursableTotal ?? 0) - transactionAmount : value.unheldNonReimbursableTotal, + // 5. Create transactionThread if it doesn't exist + let transactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouAction?.childReportID}`]; + + if (!transactionThreadReport) { + const optimisticTransactionThread = buildTransactionThread(iouAction, iouReport); + const optimisticCreatedActionForTransactionThread = buildOptimisticCreatedReportAction(currentUserEmail); + + transactionThreadReport = optimisticTransactionThread; + + // If the transactionThread is optimistic, we need the transactionThreadReportID and transactionThreadCreatedReportActionID in the holdData. + holdData[transactionID] = { + transactionThreadReportID: optimisticTransactionThread.reportID, + transactionThreadCreatedReportActionID: optimisticCreatedActionForTransactionThread.reportActionID, + holdReportActionID: createdReportAction.reportActionID, + commentReportActionID: createdReportActionComment.reportActionID, }; + + optimisticData.push( + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${optimisticTransactionThread.reportID}`, + value: {...optimisticTransactionThread, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD}, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticTransactionThread.reportID}`, + value: {[optimisticCreatedActionForTransactionThread.reportActionID]: optimisticCreatedActionForTransactionThread}, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportID}`, + value: {[iouAction.reportActionID]: {childReportID: optimisticTransactionThread.reportID}}, + }, + ); + + successData.push( + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${optimisticTransactionThread.reportID}`, + value: {pendingAction: null}, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticTransactionThread.reportID}`, + value: {[optimisticCreatedActionForTransactionThread.reportActionID]: {pendingAction: null}}, + }, + ); + + failureData.push( + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${optimisticTransactionThread.reportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticTransactionThread.reportID}`, + value: {[optimisticCreatedActionForTransactionThread.reportActionID]: null}, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportID}`, + value: {[iouAction.reportActionID]: {childReportID: null}}, + }, + ); } - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, - value: { - pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, - comment: { - hold: createdReportAction.reportActionID, + const parentReportActionOptimistic = getOptimisticDataForParentReportAction( + transactionThreadReport.reportID, + createdReportActionComment.created, + CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + ); + + optimisticData.push( + ...parentReportActionOptimistic.filter((parentActionData): parentActionData is OnyxUpdate => parentActionData !== null), + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`, + value: { + [createdReportAction.reportActionID]: createdReportAction as ReportAction, + [createdReportActionComment.reportActionID]: createdReportActionComment as ReportAction, }, }, - }); - - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, - value: updatedViolations, - }); + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport.reportID}`, + value: { + lastVisibleActionCreated: createdReportActionComment.created, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`, + value: { + [createdReportAction.reportActionID]: null, + [createdReportActionComment.reportActionID]: null, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + comment: { + hold: createdReportAction.reportActionID, + }, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, + value: updatedViolations, + }, + ); successData.push({ onyxMethod: Onyx.METHOD.MERGE, @@ -10489,20 +10537,35 @@ function putOnHoldBulk(transactionIDs: string[], comment: string, reportID: stri }, }); - failureData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, - value: { - pendingAction: null, - comment: { - hold: null, + failureData.push( + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + pendingAction: null, + comment: { + hold: null, + }, + errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericHoldExpenseFailureMessage'), }, - errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericHoldExpenseFailureMessage'), }, - }); + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport.reportID}`, + value: { + lastVisibleActionCreated: transactionThreadReport?.lastVisibleActionCreated, + }, + }, + + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, + value: transactionViolations, + }, + ); // If we are holding from the search page, we optimistically update the snapshot data that search uses so that it is kept in sync - if (!searchHash) { + if (searchHash) { optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, @@ -10531,33 +10594,31 @@ function putOnHoldBulk(transactionIDs: string[], comment: string, reportID: stri } }); - Object.entries(iouReportsOptimisticData).forEach(([iouReportID, data]) => { - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, - value: data, - }); + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, + value: iouReportOptimisticData, + }); - const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`]; - failureData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, - value: { - unheldTotal: iouReport?.unheldTotal, - unheldNonReimbursableTotal: iouReport?.unheldNonReimbursableTotal, - }, - }); + failureData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, + value: { + unheldTotal: iouReport?.unheldTotal, + unheldNonReimbursableTotal: iouReport?.unheldNonReimbursableTotal, + }, }); API.write( - WRITE_COMMANDS.BULK_HOLD_MONEY_REQUEST, { - holdData: JSON.stringify(holdData), - comment - }, - {optimisticData, successData, failureData} + WRITE_COMMANDS.BULK_HOLD_MONEY_REQUEST, + { + holdData: JSON.stringify(holdData), + comment, + }, + {optimisticData, successData, failureData}, ); - const currentReportID = getDisplayedReportID(reportID); + const currentReportID = getDisplayedReportID(iouReportID); Navigation.setNavigationActionToMicrotaskQueue(() => notifyNewAction(currentReportID, userAccountID)); } @@ -11164,7 +11225,7 @@ export { payInvoice, payMoneyRequest, putOnHold, - putOnHoldBulk, + bulkHold, replaceReceipt, requestMoney, resetSplitShares, diff --git a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx index 33c130273b101..4beecce099fff 100644 --- a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx +++ b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx @@ -2,7 +2,7 @@ import React, {useCallback, useEffect} from 'react'; import type {FormInputErrors, FormOnyxValues} from '@components/Form/types'; import {useMoneyRequestReportContext} from '@components/MoneyRequestReportView/MoneyRequestReportContext'; import useLocalize from '@hooks/useLocalize'; -import {putOnHoldBulk} from '@libs/actions/IOU'; +import {bulkHold} from '@libs/actions/IOU'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SearchReportParamList} from '@libs/Navigation/types'; @@ -20,7 +20,9 @@ function SearchMoneyRequestReportHoldReasonPage({route}: PlatformStackScreenProp const {selectedTransactionsID, setSelectedTransactionsID} = useMoneyRequestReportContext(); const onSubmit = (values: FormOnyxValues) => { - putOnHoldBulk(selectedTransactionsID, values.comment, reportID, searchHash); + if (selectedTransactionsID.length) { + bulkHold(selectedTransactionsID, values.comment, reportID, searchHash); + } setSelectedTransactionsID([]); Navigation.goBack(); }; From 78cd253b1278d7bf99e4b94c37b8543c2c1837aa Mon Sep 17 00:00:00 2001 From: Antony Kithinzi Date: Fri, 23 May 2025 02:03:28 +0300 Subject: [PATCH 4/8] applying suggestions --- src/libs/actions/IOU.ts | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 90d3311435271..49c51717a53b2 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10465,9 +10465,9 @@ function putOnHold(transactionID: string, comment: string, reportID: string, sea /** * Put expenses on HOLD in bulk */ -function bulkHold(transactionIDs: string[], comment: string, iouReportID: string, searchHash?: number) { - const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`]; - const iouReportActions = Object.values(getAllReportActions(iouReportID)); +function bulkHold(transactionIDs: string[], comment: string, reportID: string, searchHash?: number) { + const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; + const iouReportActions = Object.values(getAllReportActions(reportID)); const iouReportOptimisticData: Partial = {}; const holdData: Record = {}; const optimisticData: OnyxUpdate[] = []; @@ -10506,22 +10506,16 @@ function bulkHold(transactionIDs: string[], comment: string, iouReportID: string commentReportActionID: createdReportActionComment.reportActionID, }; - // 5. Create transactionThread if it doesn't exist let transactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouAction?.childReportID}`]; - if (!transactionThreadReport) { const optimisticTransactionThread = buildTransactionThread(iouAction, iouReport); const optimisticCreatedActionForTransactionThread = buildOptimisticCreatedReportAction(currentUserEmail); - transactionThreadReport = optimisticTransactionThread; - // If the transactionThread is optimistic, we need the transactionThreadReportID and transactionThreadCreatedReportActionID in the holdData. - holdData[transactionID] = { - transactionThreadReportID: optimisticTransactionThread.reportID, - transactionThreadCreatedReportActionID: optimisticCreatedActionForTransactionThread.reportActionID, - holdReportActionID: createdReportAction.reportActionID, - commentReportActionID: createdReportActionComment.reportActionID, - }; + holdData[transactionID].transactionThreadReportID = optimisticTransactionThread.reportID; + holdData[transactionID].transactionThreadCreatedReportActionID = optimisticCreatedActionForTransactionThread.reportActionID; + + transactionThreadReport = optimisticTransactionThread; optimisticData.push( { @@ -10536,7 +10530,7 @@ function bulkHold(transactionIDs: string[], comment: string, iouReportID: string }, { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, value: {[iouAction.reportActionID]: {childReportID: optimisticTransactionThread.reportID}}, }, ); @@ -10567,7 +10561,7 @@ function bulkHold(transactionIDs: string[], comment: string, iouReportID: string }, { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, value: {[iouAction.reportActionID]: {childReportID: null}}, }, ); @@ -10688,13 +10682,13 @@ function bulkHold(transactionIDs: string[], comment: string, iouReportID: string optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, value: iouReportOptimisticData, }); failureData.push({ onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, value: { unheldTotal: iouReport?.unheldTotal, unheldNonReimbursableTotal: iouReport?.unheldNonReimbursableTotal, @@ -10710,7 +10704,7 @@ function bulkHold(transactionIDs: string[], comment: string, iouReportID: string {optimisticData, successData, failureData}, ); - const currentReportID = getDisplayedReportID(iouReportID); + const currentReportID = getDisplayedReportID(reportID); Navigation.setNavigationActionToMicrotaskQueue(() => notifyNewAction(currentReportID, userAccountID)); } From 6de4c1171ccf50132e671a4b498161952333a5cc Mon Sep 17 00:00:00 2001 From: "Antony M. Kithinzi" Date: Fri, 30 May 2025 19:27:16 +0300 Subject: [PATCH 5/8] removing getIOUActionForReportID import --- src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx index 25e582287d189..4beecce099fff 100644 --- a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx +++ b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx @@ -6,7 +6,6 @@ import {bulkHold} from '@libs/actions/IOU'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SearchReportParamList} from '@libs/Navigation/types'; -import {getIOUActionForReportID} from '@libs/ReportActionsUtils'; import {getFieldRequiredErrors} from '@libs/ValidationUtils'; import HoldReasonFormView from '@pages/iou/HoldReasonFormView'; import {clearErrorFields, clearErrors} from '@userActions/FormActions'; From 4240b3132c4b60787fb88e2ac5186b08b87dc8f4 Mon Sep 17 00:00:00 2001 From: Antony Kithinzi Date: Tue, 3 Jun 2025 19:52:42 +0300 Subject: [PATCH 6/8] tsc --- src/libs/actions/IOU.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 30669a6a877ff..e6caea17aae86 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -79,6 +79,7 @@ import { } from '@libs/PolicyUtils'; import { getAllReportActions, + getIOUActionForReportID, getIOUActionForTransactionID, getIOUReportIDFromReportActionPreview, getLastVisibleAction, From 13543077f204c7fd9291b1e3aa5e5020205916dc Mon Sep 17 00:00:00 2001 From: "Antony M. Kithinzi" Date: Wed, 4 Jun 2025 23:39:57 +0300 Subject: [PATCH 7/8] Delete src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx --- ...SearchMoneyRequestReportHoldReasonPage.tsx | 59 ------------------- 1 file changed, 59 deletions(-) delete mode 100644 src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx diff --git a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx b/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx deleted file mode 100644 index 4beecce099fff..0000000000000 --- a/src/pages/Search/SearchMoneyRequestReportHoldReasonPage.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React, {useCallback, useEffect} from 'react'; -import type {FormInputErrors, FormOnyxValues} from '@components/Form/types'; -import {useMoneyRequestReportContext} from '@components/MoneyRequestReportView/MoneyRequestReportContext'; -import useLocalize from '@hooks/useLocalize'; -import {bulkHold} from '@libs/actions/IOU'; -import Navigation from '@libs/Navigation/Navigation'; -import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; -import type {SearchReportParamList} from '@libs/Navigation/types'; -import {getFieldRequiredErrors} from '@libs/ValidationUtils'; -import HoldReasonFormView from '@pages/iou/HoldReasonFormView'; -import {clearErrorFields, clearErrors} from '@userActions/FormActions'; -import ONYXKEYS from '@src/ONYXKEYS'; -import type SCREENS from '@src/SCREENS'; -import INPUT_IDS from '@src/types/form/MoneyRequestHoldReasonForm'; - -function SearchMoneyRequestReportHoldReasonPage({route}: PlatformStackScreenProps) { - const {translate} = useLocalize(); - - const {backTo, reportID, searchHash} = route.params; - const {selectedTransactionsID, setSelectedTransactionsID} = useMoneyRequestReportContext(); - - const onSubmit = (values: FormOnyxValues) => { - if (selectedTransactionsID.length) { - bulkHold(selectedTransactionsID, values.comment, reportID, searchHash); - } - setSelectedTransactionsID([]); - Navigation.goBack(); - }; - - const validate = useCallback( - (values: FormOnyxValues) => { - const errors: FormInputErrors = getFieldRequiredErrors(values, [INPUT_IDS.COMMENT]); - - if (!values.comment) { - errors.comment = translate('common.error.fieldRequired'); - } - - return errors; - }, - [translate], - ); - - useEffect(() => { - clearErrors(ONYXKEYS.FORMS.MONEY_REQUEST_HOLD_FORM); - clearErrorFields(ONYXKEYS.FORMS.MONEY_REQUEST_HOLD_FORM); - }, []); - - return ( - - ); -} - -SearchMoneyRequestReportHoldReasonPage.displayName = 'SearchMoneyRequestReportHoldReasonPage'; - -export default SearchMoneyRequestReportHoldReasonPage; From 51620a000477160ee8fe909a5cd2f3eb3c555e95 Mon Sep 17 00:00:00 2001 From: Antony Kithinzi Date: Wed, 4 Jun 2025 23:45:02 +0300 Subject: [PATCH 8/8] lint --- src/pages/Search/SearchHoldReasonPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/Search/SearchHoldReasonPage.tsx b/src/pages/Search/SearchHoldReasonPage.tsx index 8182f089e3f98..dd080c10af236 100644 --- a/src/pages/Search/SearchHoldReasonPage.tsx +++ b/src/pages/Search/SearchHoldReasonPage.tsx @@ -9,7 +9,7 @@ import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavig import {getFieldRequiredErrors} from '@libs/ValidationUtils'; import type {SearchReportParamList} from '@navigation/types'; import HoldReasonFormView from '@pages/iou/HoldReasonFormView'; -import {putTransactionsOnHold} from '@userActions/IOU'; +import {bulkHold} from '@userActions/IOU'; import ONYXKEYS from '@src/ONYXKEYS'; import SCREENS from '@src/SCREENS'; import INPUT_IDS from '@src/types/form/MoneyRequestHoldReasonForm'; @@ -22,7 +22,7 @@ function SearchHoldReasonPage({route}: PlatformStackScreenProps) => { if (route.name === SCREENS.SEARCH.MONEY_REQUEST_REPORT_HOLD_TRANSACTIONS) { - putTransactionsOnHold(context.selectedTransactionIDs, comment, reportID); + bulkHold(context.selectedTransactionIDs, comment, reportID, context.currentSearchHash); context.clearSelectedTransactions(true); } else { holdMoneyRequestOnSearch(context.currentSearchHash, Object.keys(context.selectedTransactions), comment);