From 91de47033bc7c1427686bf5610d66d57360d8c62 Mon Sep 17 00:00:00 2001 From: dominictb Date: Sun, 28 Jul 2024 11:58:39 +0700 Subject: [PATCH 1/2] fix: prevent editing money request in case create failure --- .../ReportActionItem/MoneyRequestView.tsx | 31 +++++++------------ src/libs/ReportUtils.ts | 7 ++++- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index b6cc46769abb..2acbe3ae883d 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -49,9 +49,6 @@ import type {TransactionPendingFieldsKey} from '@src/types/onyx/Transaction'; import ReportActionItemImage from './ReportActionItemImage'; type MoneyRequestViewTransactionOnyxProps = { - /** The transaction associated with the transactionThread */ - transaction: OnyxEntry; - /** Violations detected in this transaction */ transactionViolations: OnyxEntry; }; @@ -109,7 +106,6 @@ function MoneyRequestView({ parentReport, parentReportActions, policyCategories, - transaction, policyTagList, policy, transactionViolations, @@ -132,6 +128,12 @@ function MoneyRequestView({ const isTrackExpense = ReportUtils.isTrackExpenseReport(report); const {canUseViolations, canUseP2PDistanceRequests} = usePermissions(isTrackExpense ? CONST.IOU.TYPE.TRACK : undefined); const moneyRequestReport = parentReport; + const linkedTransactionID = useMemo(() => { + const originalMessage = parentReportAction && ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction) : undefined; + return originalMessage?.IOUTransactionID ?? '-1'; + }, [parentReportAction]); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${linkedTransactionID}`); + const { created: transactionDate, amount: transactionAmount, @@ -169,7 +171,7 @@ function MoneyRequestView({ const isCancelled = moneyRequestReport && moneyRequestReport?.isCancelledIOU; // Used for non-restricted fields such as: description, category, tag, billable, etc. - const canEdit = ReportActionsUtils.isMoneyRequestAction(parentReportAction) && ReportUtils.canEditMoneyRequest(parentReportAction); + const canEdit = ReportActionsUtils.isMoneyRequestAction(parentReportAction) && ReportUtils.canEditMoneyRequest(parentReportAction, transaction); const canEditTaxFields = canEdit && !isDistanceRequest; const canEditAmount = ReportUtils.canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.AMOUNT); @@ -214,7 +216,7 @@ function MoneyRequestView({ let amountDescription = `${translate('iou.amount')}`; const hasRoute = TransactionUtils.hasRoute(transaction, isDistanceRequest); - const rateID = transaction?.comment.customUnit?.customUnitRateID ?? '-1'; + const rateID = transaction?.comment?.customUnit?.customUnitRateID ?? '-1'; const currency = policy ? policy.outputCurrency : PolicyUtils.getPersonalPolicy()?.outputCurrency ?? CONST.CURRENCY.USD; @@ -430,18 +432,18 @@ function MoneyRequestView({ errors={errors} errorRowStyles={[styles.mh4]} onClose={() => { - if (!transaction?.transactionID) { + if (!transaction?.transactionID && linkedTransactionID === '-1') { return; } const isCreateChatErrored = !!report?.errorFields?.createChat; if ((isCreateChatErrored || !!report?.isOptimisticReport) && parentReportAction) { - const urlToNavigateBack = IOU.cleanUpMoneyRequest(transaction.transactionID, parentReportAction, true); + const urlToNavigateBack = IOU.cleanUpMoneyRequest(transaction?.transactionID ?? linkedTransactionID, parentReportAction, true); Navigation.goBack(urlToNavigateBack); return; } - if (transaction.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) { + if (transaction?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) { if (chatReport?.reportID && ReportUtils.getAddWorkspaceRoomOrChatReportErrors(chatReport)) { Report.navigateToConciergeChatAndDeleteReport(chatReport.reportID, true, true); return; @@ -450,7 +452,7 @@ function MoneyRequestView({ deleteTransaction(parentReport, parentReportAction); } } - Transaction.clearError(transaction.transactionID); + Transaction.clearError(transaction?.transactionID ?? linkedTransactionID); ReportActions.clearAllRelatedReportActionErrors(report?.reportID ?? '-1', parentReportAction); }} > @@ -675,15 +677,6 @@ export default withOnyx({ - transaction: { - key: ({report, parentReportActions}) => { - const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1']; - const originalMessage = - parentReportAction && ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction) : undefined; - const transactionID = originalMessage?.IOUTransactionID ?? -1; - return `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`; - }, - }, transactionViolations: { key: ({report, parentReportActions}) => { const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1']; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 8b08e5ac6c8f..7a0d94b0ce30 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2718,7 +2718,7 @@ function getTransactionCommentObject(transaction: OnyxEntry): Comme * This is used in conjunction with canEditRestrictedField to control editing of specific fields like amount, currency, created, receipt, and distance. * On its own, it only controls allowing/disallowing navigating to the editing pages or showing/hiding the 'Edit' icon on report actions */ -function canEditMoneyRequest(reportAction: OnyxInputOrEntry>): boolean { +function canEditMoneyRequest(reportAction: OnyxInputOrEntry>, linkedTransaction?: OnyxEntry): boolean { const isDeleted = ReportActionsUtils.isDeletedAction(reportAction); if (isDeleted) { @@ -2733,6 +2733,11 @@ function canEditMoneyRequest(reportAction: OnyxInputOrEntry Date: Wed, 31 Jul 2024 01:01:18 +0700 Subject: [PATCH 2/2] fix: update boolean logic --- src/libs/ReportUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 7a0d94b0ce30..7b712c43ee34 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2734,7 +2734,7 @@ function canEditMoneyRequest(reportAction: OnyxInputOrEntry