Skip to content

Commit 72060fc

Browse files
authored
Merge pull request #61243 from ishakakkad/60755-delete-confirm-modal
2 parents a49b2a7 + 2b9808c commit 72060fc

File tree

4 files changed

+91
-21
lines changed

4 files changed

+91
-21
lines changed

src/components/MoneyReportHeader.tsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,12 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
201201

202202
const {selectedTransactionsID, setSelectedTransactionsID} = useMoneyRequestReportContext();
203203

204-
const selectedTransactionsOptions = useSelectedTransactionsActions({report: moneyRequestReport, reportActions, session, onExportFailed: () => setIsDownloadErrorModalVisible(true)});
204+
const {
205+
options: selectedTransactionsOptions,
206+
handleDeleteTransactions,
207+
isDeleteModalVisible: hookDeleteModalVisible,
208+
hideDeleteModal,
209+
} = useSelectedTransactionsActions({report: moneyRequestReport, reportActions, session, onExportFailed: () => setIsDownloadErrorModalVisible(true)});
205210

206211
const shouldShowSelectedTransactionsButton = !!selectedTransactionsOptions.length && !transactionThreadReportID;
207212

@@ -831,6 +836,17 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
831836
danger
832837
shouldEnableNewFocusManagement
833838
/>
839+
<ConfirmModal
840+
title={translate('iou.deleteExpense', {count: selectedTransactionsID.length})}
841+
isVisible={hookDeleteModalVisible}
842+
onConfirm={handleDeleteTransactions}
843+
onCancel={hideDeleteModal}
844+
prompt={translate('iou.deleteConfirmation', {count: selectedTransactionsID.length})}
845+
confirmText={translate('common.delete')}
846+
cancelText={translate('common.cancel')}
847+
danger
848+
shouldEnableNewFocusManagement
849+
/>
834850
{!!connectedIntegration && (
835851
<ConfirmModal
836852
title={translate('workspace.exportAgainModal.title')}

src/components/MoneyReportHeaderOld.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,12 @@ function MoneyReportHeaderOld({policy, report: moneyRequestReport, transactionTh
197197

198198
const {selectedTransactionsID, setSelectedTransactionsID} = useMoneyRequestReportContext();
199199

200-
const selectedTransactionsOptions = useSelectedTransactionsActions({report: moneyRequestReport, reportActions, session, onExportFailed: () => setIsDownloadErrorModalVisible(true)});
200+
const {
201+
options: selectedTransactionsOptions,
202+
handleDeleteTransactions,
203+
isDeleteModalVisible,
204+
hideDeleteModal,
205+
} = useSelectedTransactionsActions({report: moneyRequestReport, reportActions, session, onExportFailed: () => setIsDownloadErrorModalVisible(true)});
201206

202207
const shouldShowSelectedTransactionsButton = !!selectedTransactionsOptions.length && !transactionThreadReportID;
203208

@@ -654,6 +659,19 @@ function MoneyReportHeaderOld({policy, report: moneyRequestReport, transactionTh
654659
danger
655660
shouldEnableNewFocusManagement
656661
/>
662+
663+
<ConfirmModal
664+
title={translate('iou.deleteExpense', {count: selectedTransactionsID.length})}
665+
isVisible={isDeleteModalVisible}
666+
onConfirm={handleDeleteTransactions}
667+
onCancel={hideDeleteModal}
668+
prompt={translate('iou.deleteConfirmation', {count: selectedTransactionsID.length})}
669+
confirmText={translate('common.delete')}
670+
cancelText={translate('common.cancel')}
671+
danger
672+
shouldEnableNewFocusManagement
673+
/>
674+
657675
<DecisionModal
658676
title={translate('common.downloadFailedTitle')}
659677
prompt={translate('common.downloadFailedDescription')}

src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {OnyxEntry} from 'react-native-onyx';
77
import {useOnyx} from 'react-native-onyx';
88
import ButtonWithDropdownMenu from '@components/ButtonWithDropdownMenu';
99
import Checkbox from '@components/Checkbox';
10+
import ConfirmModal from '@components/ConfirmModal';
1011
import DecisionModal from '@components/DecisionModal';
1112
import FlatList from '@components/FlatList';
1213
import {AUTOSCROLL_TO_TOP_THRESHOLD} from '@components/InvertedFlatList/BaseInvertedFlatList';
@@ -119,7 +120,12 @@ function MoneyRequestReportActionsList({report, policy, reportActions = [], tran
119120
const {selectedTransactionsID, setSelectedTransactionsID} = useMoneyRequestReportContext();
120121

121122
const {selectionMode} = useMobileSelectionMode();
122-
const selectedTransactionsOptions = useSelectedTransactionsActions({report, reportActions, session, onExportFailed: () => setIsDownloadErrorModalVisible(true)});
123+
const {
124+
options: selectedTransactionsOptions,
125+
handleDeleteTransactions,
126+
isDeleteModalVisible,
127+
hideDeleteModal,
128+
} = useSelectedTransactionsActions({report, reportActions, session, onExportFailed: () => setIsDownloadErrorModalVisible(true)});
123129

124130
// We are reversing actions because in this View we are starting at the top and don't use Inverted list
125131
const visibleReportActions = useMemo(() => {
@@ -459,6 +465,17 @@ function MoneyRequestReportActionsList({report, policy, reportActions = [], tran
459465
<Text style={[styles.textStrong, styles.ph3]}>{translate('workspace.people.selectAll')}</Text>
460466
</PressableWithFeedback>
461467
</View>
468+
<ConfirmModal
469+
title={translate('iou.deleteExpense', {count: selectedTransactionsID.length})}
470+
isVisible={isDeleteModalVisible}
471+
onConfirm={handleDeleteTransactions}
472+
onCancel={hideDeleteModal}
473+
prompt={translate('iou.deleteConfirmation', {count: selectedTransactionsID.length})}
474+
confirmText={translate('common.delete')}
475+
cancelText={translate('common.cancel')}
476+
danger
477+
shouldEnableNewFocusManagement
478+
/>
462479
</>
463480
)}
464481
<View style={[styles.flex1, styles.justifyContentEnd, styles.overflowHidden, styles.pb4]}>

src/hooks/useSelectedTransactionsActions.ts

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {useMemo} from 'react';
1+
import {useCallback, useMemo, useState} from 'react';
22
import * as Expensicons from '@components/Icon/Expensicons';
33
import {useMoneyRequestReportContext} from '@components/MoneyRequestReportView/MoneyRequestReportContext';
44
import {deleteMoneyRequest, unholdRequest} from '@libs/actions/IOU';
@@ -19,8 +19,33 @@ const UNHOLD = 'UNHOLD';
1919
function useSelectedTransactionsActions({report, reportActions, session, onExportFailed}: {report?: Report; reportActions: ReportAction[]; session?: Session; onExportFailed?: () => void}) {
2020
const {selectedTransactionsID, setSelectedTransactionsID} = useMoneyRequestReportContext();
2121
const {translate} = useLocalize();
22+
const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false);
2223

23-
return useMemo(() => {
24+
const handleDeleteTransactions = useCallback(() => {
25+
const iouActions = reportActions.filter((action) => isMoneyRequestAction(action));
26+
27+
const transactionsWithActions = selectedTransactionsID.map((transactionID) => ({
28+
transactionID,
29+
action: iouActions.find((action) => {
30+
const IOUTransactionID = (getOriginalMessage(action) as OriginalMessageIOU)?.IOUTransactionID;
31+
return transactionID === IOUTransactionID;
32+
}),
33+
}));
34+
35+
transactionsWithActions.forEach(({transactionID, action}) => action && deleteMoneyRequest(transactionID, action));
36+
setSelectedTransactionsID([]);
37+
setIsDeleteModalVisible(false);
38+
}, [reportActions, selectedTransactionsID, setSelectedTransactionsID]);
39+
40+
const showDeleteModal = useCallback(() => {
41+
setIsDeleteModalVisible(true);
42+
}, []);
43+
44+
const hideDeleteModal = useCallback(() => {
45+
setIsDeleteModalVisible(false);
46+
}, []);
47+
48+
const computedOptions = useMemo(() => {
2449
if (!selectedTransactionsID.length) {
2550
return [];
2651
}
@@ -109,25 +134,19 @@ function useSelectedTransactionsActions({report, reportActions, session, onExpor
109134
text: translate('common.delete'),
110135
icon: Expensicons.Trashcan,
111136
value: CONST.REPORT.SECONDARY_ACTIONS.DELETE,
112-
onSelected: () => {
113-
const iouActions = reportActions.filter((action) => isMoneyRequestAction(action));
114-
115-
const transactionsWithActions = selectedTransactions.map((t) => ({
116-
transactionID: t?.transactionID,
117-
action: iouActions.find((action) => {
118-
const IOUTransactionID = (getOriginalMessage(action) as OriginalMessageIOU)?.IOUTransactionID;
119-
120-
return t?.transactionID === IOUTransactionID;
121-
}),
122-
}));
123-
124-
transactionsWithActions.forEach(({transactionID, action}) => action && deleteMoneyRequest(transactionID, action));
125-
setSelectedTransactionsID([]);
126-
},
137+
onSelected: showDeleteModal,
127138
});
128139
}
129140
return options;
130-
}, [onExportFailed, report, reportActions, selectedTransactionsID, session?.accountID, setSelectedTransactionsID, translate]);
141+
}, [onExportFailed, report, reportActions, selectedTransactionsID, session?.accountID, setSelectedTransactionsID, translate, showDeleteModal]);
142+
143+
return {
144+
options: computedOptions,
145+
handleDeleteTransactions,
146+
isDeleteModalVisible,
147+
showDeleteModal,
148+
hideDeleteModal,
149+
};
131150
}
132151

133152
export default useSelectedTransactionsActions;

0 commit comments

Comments
 (0)