Skip to content

Commit bbd704f

Browse files
authored
Merge pull request Expensify#64381 from FitseTLT/fix-navigate-back-to-chat-report-on-deleting-all-transactions
2 parents 5c1a600 + 253771b commit bbd704f

7 files changed

Lines changed: 46 additions & 16 deletions

File tree

src/components/MoneyReportHeader.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import {turnOffMobileSelectionMode} from '@libs/actions/MobileSelectionMode';
2020
import {deleteAppReport, downloadReportPDF, exportReportToCSV, exportReportToPDF, exportToIntegration, markAsManuallyExported, openUnreportedExpense} from '@libs/actions/Report';
2121
import {getThreadReportIDsForTransactions, getTotalAmountForIOUReportPreviewButton} from '@libs/MoneyRequestReportUtils';
2222
import Navigation from '@libs/Navigation/Navigation';
23+
import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
24+
import type {ReportsSplitNavigatorParamList, SearchFullscreenNavigatorParamList, SearchReportParamList} from '@libs/Navigation/types';
2325
import {buildOptimisticNextStepForPreventSelfApprovalsEnabled} from '@libs/NextStepUtils';
2426
import {isSecondaryActionAPaymentOption, selectPaymentType} from '@libs/PaymentUtils';
2527
import type {KYCFlowEvent, TriggerKYCFlow} from '@libs/PaymentUtils';
@@ -152,7 +154,11 @@ function MoneyReportHeader({
152154
// eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
153155
const {shouldUseNarrowLayout, isSmallScreenWidth, isMediumScreenWidth} = useResponsiveLayout();
154156
const shouldDisplayNarrowVersion = shouldUseNarrowLayout || isMediumScreenWidth;
155-
const route = useRoute();
157+
const route = useRoute<
158+
| PlatformStackRouteProp<ReportsSplitNavigatorParamList, typeof SCREENS.REPORT>
159+
| PlatformStackRouteProp<SearchFullscreenNavigatorParamList, typeof SCREENS.SEARCH.MONEY_REQUEST_REPORT>
160+
| PlatformStackRouteProp<SearchReportParamList, typeof SCREENS.SEARCH.REPORT_RHP>
161+
>();
156162
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
157163
const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${moneyRequestReport?.chatReportID}`, {canBeMissing: true});
158164
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
@@ -1091,7 +1097,12 @@ function MoneyReportHeader({
10911097
<ConfirmModal
10921098
title={translate('iou.deleteExpense', {count: selectedTransactionIDs.length})}
10931099
isVisible={hookDeleteModalVisible}
1094-
onConfirm={handleDeleteTransactions}
1100+
onConfirm={() => {
1101+
if (transactions.filter((trans) => trans.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE).length === selectedTransactionIDs.length) {
1102+
Navigation.goBack(route.params?.backTo);
1103+
}
1104+
handleDeleteTransactions();
1105+
}}
10951106
onCancel={hideDeleteModal}
10961107
prompt={translate('iou.deleteConfirmation', {count: selectedTransactionIDs.length})}
10971108
confirmText={translate('common.delete')}

src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,14 @@ function MoneyRequestReportActionsList({
600600
<ConfirmModal
601601
title={translate('iou.deleteExpense', {count: selectedTransactionIDs.length})}
602602
isVisible={isDeleteModalVisible}
603-
onConfirm={handleDeleteTransactions}
603+
onConfirm={() => {
604+
const shouldNavigateBack =
605+
transactions.filter((trans) => trans.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE).length === selectedTransactionIDs.length;
606+
handleDeleteTransactions();
607+
if (shouldNavigateBack) {
608+
Navigation.goBack(route.params?.backTo);
609+
}
610+
}}
604611
onCancel={hideDeleteModal}
605612
prompt={translate('iou.deleteConfirmation', {count: selectedTransactionIDs.length})}
606613
confirmText={translate('common.delete')}

src/components/MoneyRequestReportView/MoneyRequestReportView.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {buildCannedSearchQuery} from '@libs/SearchQueryUtils';
2525
import Navigation from '@navigation/Navigation';
2626
import ReportActionsView from '@pages/home/report/ReportActionsView';
2727
import ReportFooter from '@pages/home/report/ReportFooter';
28+
import CONST from '@src/CONST';
2829
import NAVIGATORS from '@src/NAVIGATORS';
2930
import ONYXKEYS from '@src/ONYXKEYS';
3031
import type {Route} from '@src/ROUTES';
@@ -101,7 +102,8 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
101102
const {transactions: reportTransactions} = useTransactionsAndViolationsForReport(reportID);
102103
const transactions = useMemo(() => getAllNonDeletedTransactions(reportTransactions, reportActions), [reportTransactions, reportActions]);
103104

104-
const reportTransactionIDs = transactions?.map((transaction) => transaction.transactionID);
105+
const visibleTransactions = transactions?.filter((transaction) => isOffline || transaction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
106+
const reportTransactionIDs = visibleTransactions?.map((transaction) => transaction.transactionID);
105107
const transactionThreadReportID = getOneTransactionThreadReportID(report, chatReport, reportActions ?? [], isOffline, reportTransactionIDs);
106108

107109
const newTransactions = useNewTransactions(reportMetadata?.hasOnceLoadedReportActions, transactions);
@@ -128,8 +130,8 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
128130
// We need to wait for both the selector to finish AND ensure we're not in a loading state where transactions could still populate
129131
const shouldWaitForTransactions = shouldWaitForTransactionsUtil(report, transactions, reportMetadata);
130132

131-
const isEmptyTransactionReport = transactions && transactions.length === 0 && transactionThreadReportID === undefined;
132-
const shouldDisplayMoneyRequestActionsList = !!isEmptyTransactionReport || shouldDisplayReportTableView(report, transactions ?? []);
133+
const isEmptyTransactionReport = visibleTransactions && visibleTransactions.length === 0 && transactionThreadReportID === undefined;
134+
const shouldDisplayMoneyRequestActionsList = !!isEmptyTransactionReport || shouldDisplayReportTableView(report, visibleTransactions ?? []);
133135

134136
const reportHeaderView = useMemo(
135137
() =>
@@ -216,7 +218,7 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
216218
<MoneyRequestReportActionsList
217219
report={report}
218220
policy={policy}
219-
transactions={transactions}
221+
transactions={visibleTransactions}
220222
newTransactions={newTransactions}
221223
reportActions={reportActions}
222224
hasOlderActions={hasOlderActions}

src/hooks/useSelectedTransactionsActions.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,15 @@ function useSelectedTransactionsActions({
8181
return transactionID === IOUTransactionID;
8282
}),
8383
}));
84+
const deletedTransactionIDs: string[] = [];
85+
transactionsWithActions.forEach(({transactionID, action}) => {
86+
if (!action) {
87+
return;
88+
}
8489

85-
transactionsWithActions.forEach(({transactionID, action}) => action && deleteMoneyRequest(transactionID, action));
90+
deleteMoneyRequest(transactionID, action, undefined, deletedTransactionIDs);
91+
deletedTransactionIDs.push(transactionID);
92+
});
8693
clearSelectedTransactions(true);
8794
if (allTransactionsLength - transactionsWithActions.length <= 1) {
8895
turnOffMobileSelectionMode();

src/libs/Navigation/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,6 +2071,7 @@ type SearchReportParamList = {
20712071
[SCREENS.SEARCH.REPORT_RHP]: {
20722072
reportID: string;
20732073
reportActionID?: string;
2074+
backTo?: Routes;
20742075
};
20752076
[SCREENS.SEARCH.TRANSACTION_HOLD_REASON_RHP]: {
20762077
/** ID of the transaction the page was opened for */

src/libs/actions/IOU.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {format} from 'date-fns';
22
import {fastMerge, Str} from 'expensify-common';
3+
import cloneDeep from 'lodash/cloneDeep';
34
import {InteractionManager} from 'react-native';
45
import type {NullishDeep, OnyxCollection, OnyxEntry, OnyxInputValue, OnyxUpdate} from 'react-native-onyx';
56
import Onyx from 'react-native-onyx';
@@ -7411,7 +7412,7 @@ function updateMoneyRequestAmountAndCurrency({
74117412
* @param reportAction - The reportAction of the transaction in the IOU report
74127413
* @return the url to navigate back once the money request is deleted
74137414
*/
7414-
function prepareToCleanUpMoneyRequest(transactionID: string, reportAction: OnyxTypes.ReportAction, shouldRemoveIOUTransactionID = true) {
7415+
function prepareToCleanUpMoneyRequest(transactionID: string, reportAction: OnyxTypes.ReportAction, shouldRemoveIOUTransactionID = true, transactionIDsPendingDeletion?: string[]) {
74157416
// STEP 1: Get all collections we're updating
74167417
const iouReportID = isMoneyRequestAction(reportAction) ? getOriginalMessage(reportAction)?.IOUReportID : undefined;
74177418
const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`] ?? null;
@@ -7459,12 +7460,12 @@ function prepareToCleanUpMoneyRequest(transactionID: string, reportAction: OnyxT
74597460
canUserPerformWriteAction = !!canUserPerformWriteActionReportUtils(chatReport);
74607461
}
74617462
// If we are deleting the last transaction on a report, then delete the report too
7462-
const shouldDeleteIOUReport = getReportTransactions(iouReportID).length === 1;
7463+
const shouldDeleteIOUReport = getReportTransactions(iouReportID).filter((trans) => !transactionIDsPendingDeletion?.includes(trans.transactionID)).length === 1;
74637464

74647465
// STEP 4: Update the iouReport and reportPreview with new totals and messages if it wasn't deleted
74657466
let updatedIOUReport: OnyxInputValue<OnyxTypes.Report>;
74667467
const currency = getCurrency(transaction);
7467-
const updatedReportPreviewAction: Partial<OnyxTypes.ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>> = {...reportPreviewAction};
7468+
const updatedReportPreviewAction: Partial<OnyxTypes.ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>> = cloneDeep(reportPreviewAction ?? {});
74687469
updatedReportPreviewAction.pendingAction = shouldDeleteIOUReport ? CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE : CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE;
74697470
if (iouReport && isExpenseReport(iouReport)) {
74707471
updatedIOUReport = {...iouReport};
@@ -7775,7 +7776,7 @@ function cleanUpMoneyRequest(transactionID: string, reportAction: OnyxTypes.Repo
77757776
* @param isSingleTransactionView - whether we are in the transaction thread report
77767777
* @return the url to navigate back once the money request is deleted
77777778
*/
7778-
function deleteMoneyRequest(transactionID: string | undefined, reportAction: OnyxTypes.ReportAction, isSingleTransactionView = false) {
7779+
function deleteMoneyRequest(transactionID: string | undefined, reportAction: OnyxTypes.ReportAction, isSingleTransactionView = false, transactionIDsPendingDeletion?: string[]) {
77797780
if (!transactionID) {
77807781
return;
77817782
}
@@ -7794,7 +7795,7 @@ function deleteMoneyRequest(transactionID: string | undefined, reportAction: Ony
77947795
transactionViolations,
77957796
iouReport,
77967797
reportPreviewAction,
7797-
} = prepareToCleanUpMoneyRequest(transactionID, reportAction, false);
7798+
} = prepareToCleanUpMoneyRequest(transactionID, reportAction, false, transactionIDsPendingDeletion);
77987799

77997800
const urlToNavigateBack = getNavigationUrlOnMoneyRequestDelete(transactionID, reportAction, isSingleTransactionView);
78007801

src/pages/home/ReportScreen.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,8 @@ function ReportScreen({route, navigation}: ReportScreenProps) {
300300
const {transactions: allReportTransactions} = useTransactionsAndViolationsForReport(reportIDFromRoute);
301301

302302
const reportTransactions = useMemo(() => getAllNonDeletedTransactions(allReportTransactions, reportActions), [allReportTransactions, reportActions]);
303-
const reportTransactionIDs = reportTransactions?.map((transaction) => transaction.transactionID);
303+
const visibleTransactions = reportTransactions?.filter((transaction) => isOffline || transaction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
304+
const reportTransactionIDs = visibleTransactions?.map((transaction) => transaction.transactionID);
304305
const transactionThreadReportID = getOneTransactionThreadReportID(report, chatReport, reportActions ?? [], isOffline, reportTransactionIDs);
305306
const [transactionThreadReportActions = getEmptyObject<OnyxTypes.ReportActions>()] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID}`, {
306307
canBeMissing: true,
@@ -764,7 +765,7 @@ function ReportScreen({route, navigation}: ReportScreenProps) {
764765
}
765766

766767
// If true reports that are considered MoneyRequest | InvoiceReport will get the new report table view
767-
const shouldDisplayMoneyRequestActionsList = isMoneyRequestOrInvoiceReport && shouldDisplayReportTableView(report, reportTransactions ?? []);
768+
const shouldDisplayMoneyRequestActionsList = isMoneyRequestOrInvoiceReport && shouldDisplayReportTableView(report, visibleTransactions ?? []);
768769

769770
return (
770771
<ActionListContext.Provider value={actionListValue}>
@@ -828,7 +829,7 @@ function ReportScreen({route, navigation}: ReportScreenProps) {
828829
report={report}
829830
policy={policy}
830831
reportActions={reportActions}
831-
transactions={reportTransactions}
832+
transactions={visibleTransactions}
832833
newTransactions={newTransactions}
833834
hasOlderActions={hasOlderActions}
834835
hasNewerActions={hasNewerActions}

0 commit comments

Comments
 (0)