Skip to content

Commit c973e62

Browse files
authored
Merge pull request Expensify#45130 from software-mansion-labs/@cdOut/cancel-payment-fix
[CP Staging] Expense - No option to cancel payment for paid expense as 3-dot menu is removed
2 parents 4ecfa0f + 1abb522 commit c973e62

File tree

4 files changed

+44
-21
lines changed

4 files changed

+44
-21
lines changed

src/CONST.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2452,6 +2452,7 @@ const CONST = {
24522452
PRIVATE_NOTES: 'privateNotes',
24532453
DELETE: 'delete',
24542454
MARK_AS_INCOMPLETE: 'markAsIncomplete',
2455+
CANCEL_PAYMENT: 'cancelPayment',
24552456
UNAPPROVE: 'unapprove',
24562457
},
24572458
EDIT_REQUEST_FIELD: {

src/components/MoneyReportHeader.tsx

-20
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
9999
const canAllowSettlement = ReportUtils.hasUpdatedTotal(moneyRequestReport, policy);
100100
const policyType = policy?.type;
101101
const isDraft = ReportUtils.isOpenExpenseReport(moneyRequestReport);
102-
const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false);
103102

104103
const navigateBackToAfterDelete = useRef<Route>();
105104
const hasScanningReceipt = ReportUtils.getTransactionsWithReceipts(moneyRequestReport?.reportID).some((t) => TransactionUtils.isReceiptBeingScanned(t));
@@ -108,14 +107,6 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
108107
// allTransactions in TransactionUtils might have stale data
109108
const hasOnlyHeldExpenses = ReportUtils.hasOnlyHeldExpenses(moneyRequestReport.reportID, transactions);
110109

111-
const cancelPayment = useCallback(() => {
112-
if (!chatReport) {
113-
return;
114-
}
115-
IOU.cancelPayment(moneyRequestReport, chatReport);
116-
setIsConfirmModalVisible(false);
117-
}, [moneyRequestReport, chatReport]);
118-
119110
const shouldShowPayButton = useMemo(() => IOU.canIOUBePaid(moneyRequestReport, chatReport, policy), [moneyRequestReport, chatReport, policy]);
120111

121112
const shouldShowApproveButton = useMemo(() => IOU.canApproveIOU(moneyRequestReport, chatReport, policy), [moneyRequestReport, chatReport, policy]);
@@ -371,17 +362,6 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
371362
transactionCount={transactionIDs.length}
372363
/>
373364
)}
374-
<ConfirmModal
375-
title={translate('iou.cancelPayment')}
376-
isVisible={isConfirmModalVisible}
377-
onConfirm={cancelPayment}
378-
onCancel={() => setIsConfirmModalVisible(false)}
379-
prompt={translate('iou.cancelPaymentConfirmation')}
380-
confirmText={translate('iou.cancelPayment')}
381-
cancelText={translate('common.dismiss')}
382-
danger
383-
shouldEnableNewFocusManagement
384-
/>
385365
<ConfirmModal
386366
title={translate('iou.deleteExpense')}
387367
isVisible={isDeleteRequestModalVisible}

src/libs/actions/IOU.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -6604,7 +6604,11 @@ function submitReport(expenseReport: OnyxTypes.Report) {
66046604
API.write(WRITE_COMMANDS.SUBMIT_REPORT, parameters, {optimisticData, successData, failureData});
66056605
}
66066606

6607-
function cancelPayment(expenseReport: OnyxTypes.Report, chatReport: OnyxTypes.Report) {
6607+
function cancelPayment(expenseReport: OnyxEntry<OnyxTypes.Report>, chatReport: OnyxTypes.Report) {
6608+
if (isEmptyObject(expenseReport)) {
6609+
return;
6610+
}
6611+
66086612
const optimisticReportAction = ReportUtils.buildOptimisticCancelPaymentReportAction(expenseReport.reportID, -(expenseReport.total ?? 0), expenseReport.currency ?? '');
66096613
const policy = PolicyUtils.getPolicy(chatReport.policyID);
66106614
const isFree = policy && policy.type === CONST.POLICY.TYPE.FREE;

src/pages/ReportDetailsPage.tsx

+38
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
109109
const [isLastMemberLeavingGroupModalVisible, setIsLastMemberLeavingGroupModalVisible] = useState(false);
110110
const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false);
111111
const [isUnapproveModalVisible, setIsUnapproveModalVisible] = useState(false);
112+
const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false);
112113
const policy = useMemo(() => policies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID ?? '-1'}`], [policies, report?.policyID]);
113114
const isPolicyAdmin = useMemo(() => PolicyUtils.isPolicyAdmin(policy), [policy]);
114115
const isPolicyEmployee = useMemo(() => PolicyUtils.isPolicyEmployee(report?.policyID ?? '-1', policies), [report?.policyID, policies]);
@@ -263,6 +264,21 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
263264
const shouldShowWriteCapability = !isMoneyRequestReport;
264265
const shouldShowMenuItem = shouldShowNotificationPref || shouldShowWriteCapability || (!!report?.visibility && report.chatType !== CONST.REPORT.CHAT_TYPE.INVOICE);
265266

267+
const isPayer = ReportUtils.isPayer(session, moneyRequestReport);
268+
const isSettled = ReportUtils.isSettled(moneyRequestReport?.reportID ?? '-1');
269+
270+
const shouldShowCancelPaymentButton = caseID === CASES.MONEY_REPORT && isPayer && isSettled && ReportUtils.isExpenseReport(moneyRequestReport);
271+
const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${moneyRequestReport?.chatReportID ?? '-1'}`);
272+
273+
const cancelPayment = useCallback(() => {
274+
if (!chatReport) {
275+
return;
276+
}
277+
278+
IOU.cancelPayment(moneyRequestReport, chatReport);
279+
setIsConfirmModalVisible(false);
280+
}, [moneyRequestReport, chatReport]);
281+
266282
const menuItems: ReportDetailsPageMenuItem[] = useMemo(() => {
267283
const items: ReportDetailsPageMenuItem[] = [];
268284

@@ -356,6 +372,16 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
356372
}
357373
}
358374

375+
if (shouldShowCancelPaymentButton) {
376+
items.push({
377+
key: CONST.REPORT_DETAILS_MENU_ITEM.CANCEL_PAYMENT,
378+
icon: Expensicons.Trashcan,
379+
translationKey: 'iou.cancelPayment',
380+
isAnonymousAction: false,
381+
action: () => setIsConfirmModalVisible(true),
382+
});
383+
}
384+
359385
if (shouldShowLeaveButton) {
360386
items.push({
361387
key: CONST.REPORT_DETAILS_MENU_ITEM.LEAVE_ROOM,
@@ -403,6 +429,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
403429
isCanceledTaskReport,
404430
shouldShowLeaveButton,
405431
activeChatMembers.length,
432+
shouldShowCancelPaymentButton,
406433
isPolicyAdmin,
407434
session,
408435
leaveChat,
@@ -710,6 +737,17 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
710737
confirmText={translate('common.leave')}
711738
cancelText={translate('common.cancel')}
712739
/>
740+
<ConfirmModal
741+
title={translate('iou.cancelPayment')}
742+
isVisible={isConfirmModalVisible}
743+
onConfirm={cancelPayment}
744+
onCancel={() => setIsConfirmModalVisible(false)}
745+
prompt={translate('iou.cancelPaymentConfirmation')}
746+
confirmText={translate('iou.cancelPayment')}
747+
cancelText={translate('common.dismiss')}
748+
danger
749+
shouldEnableNewFocusManagement
750+
/>
713751
<ConfirmModal
714752
title={caseID === CASES.DEFAULT ? translate('task.deleteTask') : translate('iou.deleteExpense')}
715753
isVisible={isDeleteModalVisible}

0 commit comments

Comments
 (0)