Skip to content

Commit 65bdedc

Browse files
Merge pull request #46376 from dominictb/fix/44459-err-dismiss
fix: prevent editing money request in case create failure
2 parents 778a141 + f34d68a commit 65bdedc

File tree

2 files changed

+18
-20
lines changed

2 files changed

+18
-20
lines changed

src/components/ReportActionItem/MoneyRequestView.tsx

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ import type {TransactionPendingFieldsKey} from '@src/types/onyx/Transaction';
4949
import ReportActionItemImage from './ReportActionItemImage';
5050

5151
type MoneyRequestViewTransactionOnyxProps = {
52-
/** The transaction associated with the transactionThread */
53-
transaction: OnyxEntry<OnyxTypes.Transaction>;
54-
5552
/** Violations detected in this transaction */
5653
transactionViolations: OnyxEntry<OnyxTypes.TransactionViolations>;
5754
};
@@ -109,7 +106,6 @@ function MoneyRequestView({
109106
parentReport,
110107
parentReportActions,
111108
policyCategories,
112-
transaction,
113109
policyTagList,
114110
policy,
115111
transactionViolations,
@@ -132,6 +128,12 @@ function MoneyRequestView({
132128
const isTrackExpense = ReportUtils.isTrackExpenseReport(report);
133129
const {canUseViolations, canUseP2PDistanceRequests} = usePermissions(isTrackExpense ? CONST.IOU.TYPE.TRACK : undefined);
134130
const moneyRequestReport = parentReport;
131+
const linkedTransactionID = useMemo(() => {
132+
const originalMessage = parentReportAction && ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction) : undefined;
133+
return originalMessage?.IOUTransactionID ?? '-1';
134+
}, [parentReportAction]);
135+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${linkedTransactionID}`);
136+
135137
const {
136138
created: transactionDate,
137139
amount: transactionAmount,
@@ -169,7 +171,7 @@ function MoneyRequestView({
169171
const isCancelled = moneyRequestReport && moneyRequestReport?.isCancelledIOU;
170172

171173
// Used for non-restricted fields such as: description, category, tag, billable, etc.
172-
const canEdit = ReportActionsUtils.isMoneyRequestAction(parentReportAction) && ReportUtils.canEditMoneyRequest(parentReportAction);
174+
const canEdit = ReportActionsUtils.isMoneyRequestAction(parentReportAction) && ReportUtils.canEditMoneyRequest(parentReportAction, transaction);
173175
const canEditTaxFields = canEdit && !isDistanceRequest;
174176

175177
const canEditAmount = ReportUtils.canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.AMOUNT);
@@ -214,7 +216,7 @@ function MoneyRequestView({
214216
let amountDescription = `${translate('iou.amount')}`;
215217

216218
const hasRoute = TransactionUtils.hasRoute(transaction, isDistanceRequest);
217-
const rateID = transaction?.comment.customUnit?.customUnitRateID ?? '-1';
219+
const rateID = transaction?.comment?.customUnit?.customUnitRateID ?? '-1';
218220

219221
const currency = policy ? policy.outputCurrency : PolicyUtils.getPersonalPolicy()?.outputCurrency ?? CONST.CURRENCY.USD;
220222

@@ -430,18 +432,18 @@ function MoneyRequestView({
430432
errors={errors}
431433
errorRowStyles={[styles.mh4]}
432434
onClose={() => {
433-
if (!transaction?.transactionID) {
435+
if (!transaction?.transactionID && linkedTransactionID === '-1') {
434436
return;
435437
}
436438

437439
const isCreateChatErrored = !!report?.errorFields?.createChat;
438440
if ((isCreateChatErrored || !!report?.isOptimisticReport) && parentReportAction) {
439-
const urlToNavigateBack = IOU.cleanUpMoneyRequest(transaction.transactionID, parentReportAction, true);
441+
const urlToNavigateBack = IOU.cleanUpMoneyRequest(transaction?.transactionID ?? linkedTransactionID, parentReportAction, true);
440442
Navigation.goBack(urlToNavigateBack);
441443
return;
442444
}
443445

444-
if (transaction.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) {
446+
if (transaction?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) {
445447
if (chatReport?.reportID && ReportUtils.getAddWorkspaceRoomOrChatReportErrors(chatReport)) {
446448
Report.navigateToConciergeChatAndDeleteReport(chatReport.reportID, true, true);
447449
return;
@@ -450,7 +452,7 @@ function MoneyRequestView({
450452
deleteTransaction(parentReport, parentReportAction);
451453
}
452454
}
453-
Transaction.clearError(transaction.transactionID);
455+
Transaction.clearError(transaction?.transactionID ?? linkedTransactionID);
454456
ReportActions.clearAllRelatedReportActionErrors(report?.reportID ?? '-1', parentReportAction);
455457
}}
456458
>
@@ -675,15 +677,6 @@ export default withOnyx<MoneyRequestViewPropsWithoutTransaction, MoneyRequestVie
675677
},
676678
})(
677679
withOnyx<MoneyRequestViewProps, MoneyRequestViewTransactionOnyxProps>({
678-
transaction: {
679-
key: ({report, parentReportActions}) => {
680-
const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1'];
681-
const originalMessage =
682-
parentReportAction && ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction) : undefined;
683-
const transactionID = originalMessage?.IOUTransactionID ?? -1;
684-
return `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`;
685-
},
686-
},
687680
transactionViolations: {
688681
key: ({report, parentReportActions}) => {
689682
const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1'];

src/libs/ReportUtils.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2749,7 +2749,7 @@ function getTransactionCommentObject(transaction: OnyxEntry<Transaction>): Comme
27492749
* This is used in conjunction with canEditRestrictedField to control editing of specific fields like amount, currency, created, receipt, and distance.
27502750
* On its own, it only controls allowing/disallowing navigating to the editing pages or showing/hiding the 'Edit' icon on report actions
27512751
*/
2752-
function canEditMoneyRequest(reportAction: OnyxInputOrEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>): boolean {
2752+
function canEditMoneyRequest(reportAction: OnyxInputOrEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>, linkedTransaction?: OnyxEntry<Transaction>): boolean {
27532753
const isDeleted = ReportActionsUtils.isDeletedAction(reportAction);
27542754

27552755
if (isDeleted) {
@@ -2764,6 +2764,11 @@ function canEditMoneyRequest(reportAction: OnyxInputOrEntry<ReportAction<typeof
27642764
return false;
27652765
}
27662766

2767+
const transaction = linkedTransaction ?? getLinkedTransaction(reportAction ?? undefined);
2768+
if (!transaction?.transactionID || (transaction?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD && !isEmptyObject(transaction.errors))) {
2769+
return false;
2770+
}
2771+
27672772
const moneyRequestReportID = originalMessage?.IOUReportID ?? -1;
27682773

27692774
if (!moneyRequestReportID) {

0 commit comments

Comments
 (0)