From 3f70c47fa600624b5e490037e62ec5cb79aa9c58 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Tue, 10 Dec 2024 19:20:13 +0300 Subject: [PATCH 01/11] implemented hiding RBR when a user cannot edit a transaction --- .../LHNOptionsList/OptionRowLHNData.tsx | 5 +- .../MoneyRequestPreviewContent.tsx | 15 ++- .../ReportActionItem/MoneyRequestView.tsx | 23 ++-- .../ReportActionItem/ReportPreview.tsx | 12 +- src/libs/ReportUtils.ts | 62 +++++++---- src/libs/TransactionUtils/index.ts | 103 ++++++++++++++++-- 6 files changed, 171 insertions(+), 49 deletions(-) diff --git a/src/components/LHNOptionsList/OptionRowLHNData.tsx b/src/components/LHNOptionsList/OptionRowLHNData.tsx index ccf12aa4ce24..0a738a66bb84 100644 --- a/src/components/LHNOptionsList/OptionRowLHNData.tsx +++ b/src/components/LHNOptionsList/OptionRowLHNData.tsx @@ -37,11 +37,10 @@ function OptionRowLHNData({ const optionItemRef = useRef(); - const shouldDisplayViolations = ReportUtils.shouldDisplayViolationsRBRInLHN(fullReport, transactionViolations); const isSettled = ReportUtils.isSettled(fullReport); const shouldDisplayReportViolations = !isSettled && ReportUtils.isReportOwner(fullReport) && ReportUtils.hasReportViolations(reportID); // We only want to show RBR for expense reports with transaction violations not for transaction threads reports. - const doesExpenseReportHasViolations = ReportUtils.isExpenseReport(fullReport) && !isSettled && ReportUtils.hasViolations(reportID, transactionViolations, true); + const doesExpenseReportHasViolations = ReportUtils.isExpenseReport(fullReport) && !isSettled && ReportUtils.shouldShowViolations(reportID, transactionViolations, true); const optionItem = useMemo(() => { // Note: ideally we'd have this as a dependent selector in onyx! @@ -52,7 +51,7 @@ function OptionRowLHNData({ preferredLocale: preferredLocale ?? CONST.LOCALES.DEFAULT, policy, parentReportAction, - hasViolations: !!shouldDisplayViolations || shouldDisplayReportViolations || doesExpenseReportHasViolations, + hasViolations: shouldDisplayReportViolations || doesExpenseReportHasViolations, lastMessageTextFromReport, transactionViolations, invoiceReceiverPolicy, diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 44e3b7488ba3..906d973c6e94 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -117,10 +117,17 @@ function MoneyRequestPreviewContent({ const isOnHold = TransactionUtils.isOnHold(transaction); const isSettlementOrApprovalPartial = !!iouReport?.pendingFields?.partial; const isPartialHold = isSettlementOrApprovalPartial && isOnHold; - const hasViolations = TransactionUtils.hasViolation(transaction?.transactionID ?? '-1', transactionViolations, true); - const hasNoticeTypeViolations = TransactionUtils.hasNoticeTypeViolation(transaction?.transactionID ?? '-1', transactionViolations, true) && ReportUtils.isPaidGroupPolicy(iouReport); - const hasWarningTypeViolations = TransactionUtils.hasWarningTypeViolation(transaction?.transactionID ?? '-1', transactionViolations, true); - const hasFieldErrors = TransactionUtils.hasMissingSmartscanFields(transaction); + const hasViolations = TransactionUtils.shouldShowViolation({transactionID: transaction?.transactionID ?? '-1', transactionViolations, showInReview: true, parentReportAction: action}); + const hasNoticeTypeViolations = + TransactionUtils.shouldShowNoticeTypeViolation({transactionID: transaction?.transactionID ?? '-1', transactionViolations, showInReview: true, parentReportAction: action}) && + ReportUtils.isPaidGroupPolicy(iouReport); + const hasWarningTypeViolations = TransactionUtils.shouldShowWarningTypeViolation({ + transactionID: transaction?.transactionID ?? '-1', + transactionViolations, + showInReview: true, + parentReportAction: action, + }); + const hasFieldErrors = TransactionUtils.shouldShowMissingSmartscanFieldsError(transaction, action); const isDistanceRequest = TransactionUtils.isDistanceRequest(transaction); const isFetchingWaypointsFromServer = TransactionUtils.isFetchingWaypointsFromServer(transaction); const isCardTransaction = TransactionUtils.isCardTransaction(transaction); diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index ca50e93e536f..48a2de4d3e11 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -259,7 +259,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals } let receiptURIs; - const hasErrors = TransactionUtils.hasMissingSmartscanFields(transaction); + const hasErrors = TransactionUtils.shouldShowMissingSmartscanFieldsError(transaction, parentReportAction); if (hasReceipt) { receiptURIs = ReceiptUtils.getThumbnailAndImageURIs(updatedTransaction ?? transaction); } @@ -269,6 +269,10 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals const getErrorForField = useCallback( (field: ViolationField, data?: OnyxTypes.TransactionViolation['data'], policyHasDependentTags = false, tagValue?: string) => { + if (readonly || !canEdit) { + return ''; + } + // Checks applied when creating a new expense // NOTE: receipt field can return multiple violations, so we need to handle it separately const fieldChecks: Partial> = { @@ -288,10 +292,6 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals const {isError, translationPath} = fieldChecks[field] ?? {}; - if (readonly) { - return ''; - } - // Return form errors if there are any if (hasErrors && isError && translationPath) { return translate(translationPath); @@ -309,7 +309,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals return ''; }, - [transactionAmount, isSettled, isCancelled, isPolicyExpenseChat, isEmptyMerchant, transactionDate, readonly, hasErrors, hasViolations, translate, getViolationsForField], + [transactionAmount, isSettled, isCancelled, isPolicyExpenseChat, isEmptyMerchant, transactionDate, readonly, hasErrors, hasViolations, translate, getViolationsForField, canEdit], ); const distanceRequestFields = ( @@ -364,8 +364,11 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals isReceiptAllowed && !hasReceipt && !isApproved && !isSettled && (canEditReceipt || isAdmin || isApprover || isRequestor) && (canEditReceipt || ReportUtils.isPaidGroupPolicy(report)); const [receiptImageViolations, receiptViolations] = useMemo(() => { - const imageViolations = []; - const allViolations = []; + const imageViolations: string[] = []; + const allViolations: string[] = []; + if (!canEdit) { + return [imageViolations, allViolations]; + } for (const violation of transactionViolations ?? []) { const isReceiptFieldViolation = receiptFieldViolationNames.includes(violation.name); @@ -379,9 +382,9 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals } } return [imageViolations, allViolations]; - }, [transactionViolations, translate]); + }, [transactionViolations, translate, canEdit]); - const receiptRequiredViolation = transactionViolations?.some((violation) => violation.name === CONST.VIOLATIONS.RECEIPT_REQUIRED); + const receiptRequiredViolation = canEdit && transactionViolations?.some((violation) => violation.name === CONST.VIOLATIONS.RECEIPT_REQUIRED); // Whether to show receipt audit result (e.g.`Verified`, `Issue Found`) and messages (e.g. `Receipt not verified. Please confirm accuracy.`) // `!!(receiptViolations.length || didReceiptScanSucceed)` is for not showing `Verified` when `receiptViolations` is empty and `didReceiptScanSucceed` is false. diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 41acbf5b4f90..b97da1c2820c 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -111,9 +111,9 @@ function ReportPreview({ const {isOffline} = useNetwork(); const allTransactions = useMemo(() => TransactionUtils.getAllReportTransactions(iouReportID, transactions), [iouReportID, transactions]); - const {hasMissingSmartscanFields, areAllRequestsBeingSmartScanned, hasOnlyTransactionsWithPendingRoutes, hasNonReimbursableTransactions} = useMemo( + const {shouldShowMissingSmartscanFieldsError, areAllRequestsBeingSmartScanned, hasOnlyTransactionsWithPendingRoutes, hasNonReimbursableTransactions} = useMemo( () => ({ - hasMissingSmartscanFields: ReportUtils.hasMissingSmartscanFields(iouReportID), + shouldShowMissingSmartscanFieldsError: ReportUtils.shouldShowMissingSmartscanFieldsError(iouReportID), areAllRequestsBeingSmartScanned: ReportUtils.areAllRequestsBeingSmartScanned(iouReportID, action), hasOnlyTransactionsWithPendingRoutes: ReportUtils.hasOnlyTransactionsWithPendingRoutes(iouReportID), hasNonReimbursableTransactions: ReportUtils.hasNonReimbursableTransactions(iouReportID), @@ -166,11 +166,11 @@ function ReportPreview({ const hasReceipts = transactionsWithReceipts.length > 0; const isScanning = hasReceipts && areAllRequestsBeingSmartScanned; const hasErrors = - (hasMissingSmartscanFields && !iouSettled) || + (shouldShowMissingSmartscanFieldsError && !iouSettled) || // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - ReportUtils.hasViolations(iouReportID, transactionViolations, true) || - ReportUtils.hasNoticeTypeViolations(iouReportID, transactionViolations, true) || - ReportUtils.hasWarningTypeViolations(iouReportID, transactionViolations, true) || + ReportUtils.shouldShowViolations(iouReportID, transactionViolations, true) || + ReportUtils.shouldShowNoticeTypeViolations(iouReportID, transactionViolations, true) || + ReportUtils.shouldShowWarningTypeViolations(iouReportID, transactionViolations, true) || (ReportUtils.isReportOwner(iouReport) && ReportUtils.hasReportViolations(iouReportID)) || ReportUtils.hasActionsWithErrors(iouReportID); const lastThreeTransactions = allTransactions.slice(-3); diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index ba507ef681c7..8ff1e05ffa1d 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3412,12 +3412,15 @@ function getLinkedTransaction(reportAction: OnyxEntry + TransactionUtils.shouldShowMissingSmartscanFieldsError(transaction, ReportActionsUtils.getIOUActionForReportID(iouReportID, transaction.transactionID)), + ); } /** @@ -3436,7 +3439,7 @@ function getReportActionWithMissingSmartscanFields(iouReportID: string): ReportA if (!ReportActionsUtils.wasActionTakenByCurrentUser(action)) { return false; } - return TransactionUtils.hasMissingSmartscanFields(transaction); + return TransactionUtils.shouldShowMissingSmartscanFieldsError(transaction, action); }); } @@ -6372,32 +6375,53 @@ function shouldDisplayViolationsRBRInLHN(report: OnyxEntry, transactionV const allReports = Object.values(ReportConnection.getAllReports() ?? {}) as Report[]; const potentialReports = allReports.filter((r) => r?.ownerAccountID === currentUserAccountID && (r?.stateNum ?? 0) <= 1 && r?.policyID === report.policyID); return potentialReports.some( - (potentialReport) => hasViolations(potentialReport.reportID, transactionViolations) || hasWarningTypeViolations(potentialReport.reportID, transactionViolations), + (potentialReport) => shouldShowViolations(potentialReport.reportID, transactionViolations) || shouldShowWarningTypeViolations(potentialReport.reportID, transactionViolations), ); } /** - * Checks to see if a report contains a violation + * Checks to see if a report contains a violation we should display. */ -function hasViolations(reportID: string, transactionViolations: OnyxCollection, shouldShowInReview?: boolean): boolean { +function shouldShowViolations(reportID: string, transactionViolations: OnyxCollection, shouldShowInReview?: boolean): boolean { const transactions = reportsTransactions[reportID] ?? []; - return transactions.some((transaction) => TransactionUtils.hasViolation(transaction.transactionID, transactionViolations, shouldShowInReview)); + return transactions.some((transaction) => + TransactionUtils.shouldShowViolation({ + transactionID: transaction.transactionID, + transactionViolations, + showInReview: shouldShowInReview, + parentReportAction: ReportActionsUtils.getIOUActionForReportID(reportID, transaction.transactionID), + }), + ); } /** - * Checks to see if a report contains a violation of type `warning` + * Checks to see if a report contains a violation of type `warning` we should display */ -function hasWarningTypeViolations(reportID: string, transactionViolations: OnyxCollection, shouldShowInReview?: boolean): boolean { +function shouldShowWarningTypeViolations(reportID: string, transactionViolations: OnyxCollection, shouldShowInReview?: boolean): boolean { const transactions = reportsTransactions[reportID] ?? []; - return transactions.some((transaction) => TransactionUtils.hasWarningTypeViolation(transaction.transactionID, transactionViolations, shouldShowInReview)); + return transactions.some((transaction) => + TransactionUtils.shouldShowWarningTypeViolation({ + transactionID: transaction.transactionID, + transactionViolations, + showInReview: shouldShowInReview, + parentReportAction: ReportActionsUtils.getIOUActionForReportID(reportID, transaction.transactionID), + }), + ); } /** - * Checks to see if a report contains a violation of type `notice` + * Checks to see if a report contains a violation of type `notice` we should display */ -function hasNoticeTypeViolations(reportID: string, transactionViolations: OnyxCollection, shouldShowInReview?: boolean): boolean { +function shouldShowNoticeTypeViolations(reportID: string, transactionViolations: OnyxCollection, shouldShowInReview?: boolean): boolean { const transactions = reportsTransactions[reportID] ?? []; - return transactions.some((transaction) => TransactionUtils.hasNoticeTypeViolation(transaction.transactionID, transactionViolations, shouldShowInReview)); + return transactions.some((transaction) => + TransactionUtils.shouldShowNoticeTypeViolation({ + transactionID: transaction.transactionID, + transactionViolations, + showInReview: shouldShowInReview, + parentReportAction: ReportActionsUtils.getIOUActionForReportID(reportID, transaction.transactionID), + }), + ); } function hasReportViolations(reportID: string) { @@ -6447,7 +6471,7 @@ function getAllReportActionsErrorsAndReportActionThatRequiresAttention(report: O if (ReportActionsUtils.wasActionTakenByCurrentUser(parentReportAction) && ReportActionsUtils.isTransactionThread(parentReportAction)) { const transactionID = ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction)?.IOUTransactionID : null; const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; - if (TransactionUtils.hasMissingSmartscanFields(transaction ?? null) && !isSettled(transaction?.reportID)) { + if (TransactionUtils.shouldShowMissingSmartscanFieldsError(transaction ?? null, parentReportAction) && !isSettled(transaction?.reportID)) { reportActionErrors.smartscan = ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericSmartscanFailureMessage'); reportAction = undefined; } @@ -8641,7 +8665,7 @@ export { hasHeldExpenses, hasIOUWaitingOnCurrentUserBankAccount, hasMissingPaymentMethod, - hasMissingSmartscanFields, + shouldShowMissingSmartscanFieldsError, hasNonReimbursableTransactions, hasOnlyHeldExpenses, hasOnlyTransactionsWithPendingRoutes, @@ -8649,9 +8673,9 @@ export { getReportActionWithSmartscanError, hasSmartscanError, hasUpdatedTotal, - hasViolations, - hasWarningTypeViolations, - hasNoticeTypeViolations, + shouldShowViolations, + shouldShowWarningTypeViolations, + shouldShowNoticeTypeViolations, isActionCreator, isAdminRoom, isAdminsOnlyPostingRoom, diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 944c431aaad9..1b71360368a3 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -25,7 +25,19 @@ import type {IOURequestType} from '@userActions/IOU'; import CONST from '@src/CONST'; import type {IOUType} from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {OnyxInputOrEntry, Policy, RecentWaypoint, Report, ReviewDuplicates, TaxRate, TaxRates, Transaction, TransactionViolation, TransactionViolations} from '@src/types/onyx'; +import type { + OnyxInputOrEntry, + Policy, + RecentWaypoint, + Report, + ReportAction, + ReviewDuplicates, + TaxRate, + TaxRates, + Transaction, + TransactionViolation, + TransactionViolations, +} from '@src/types/onyx'; import type {Attendee} from '@src/types/onyx/IOU'; import type {SearchPolicy, SearchReport} from '@src/types/onyx/SearchResults'; import type {Comment, Receipt, TransactionChanges, TransactionPendingFieldsKey, Waypoint, WaypointCollection} from '@src/types/onyx/Transaction'; @@ -691,6 +703,19 @@ function hasMissingSmartscanFields(transaction: OnyxInputOrEntry): return !!(transaction && !isDistanceRequest(transaction) && !isReceiptBeingScanned(transaction) && areRequiredFieldsEmpty(transaction)); } +/** + * Check if the current user should be shown missing smart scan field error. + * So it checks if there are missing smart scan fields and the user can edit the transaction + * because there is no point of showing RBR for the user who cannot edit the request. + */ +function shouldShowMissingSmartscanFieldsError(transaction: OnyxInputOrEntry, parentReportAction?: OnyxEntry): boolean { + if (!canEditTransaction(transaction?.transactionID ?? '-1', parentReportAction)) { + return false; + } + + return hasMissingSmartscanFields(transaction); +} + /** * Get all transaction violations of the transaction with given tranactionID. */ @@ -871,17 +896,65 @@ function isOnHoldByTransactionID(transactionID: string): boolean { /** * Checks if any violations for the provided transaction are of type 'violation' + * and the user can edit the transaction as we don't want to show RBR if the user can't edit it. */ -function hasViolation(transactionID: string, transactionViolations: OnyxCollection, showInReview?: boolean): boolean { +function shouldShowViolation({ + transactionID, + transactionViolations, + showInReview, + parentReportAction, +}: { + transactionID: string; + transactionViolations: OnyxCollection; + showInReview?: boolean; + parentReportAction: OnyxEntry; +}): boolean { + if (!canEditTransaction(transactionID, parentReportAction)) { + return false; + } + return !!transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]?.some( (violation: TransactionViolation) => violation.type === CONST.VIOLATION_TYPES.VIOLATION && (showInReview === undefined || showInReview === (violation.showInReview ?? false)), ); } +/** + * Checks if the current user can edit the transaction. If the necessary + * info like parentReportAction and report doesn't exist in onyx we will return + * true because we use this function to show RBR only for the user side who can edit the transaction + * but if we can't determine they cannot edit it, we opted to show the RBR instead of hiding it. + */ +function canEditTransaction(transactionID: string, parentReportAction: OnyxEntry): boolean { + const report = ReportConnection.getReport(parentReportAction?.childReportID ?? '-1'); + const transaction = getTransaction(transactionID ?? '-1'); + if (report && transaction && parentReportAction) { + const canUserPerformWriteAction = !!ReportUtils.canUserPerformWriteAction(report); + const canEditRequest = canUserPerformWriteAction && ReportActionsUtils.isMoneyRequestAction(parentReportAction) && ReportUtils.canEditMoneyRequest(parentReportAction, transaction); + return canEditRequest; + } + + return true; +} + /** * Checks if any violations for the provided transaction are of type 'notice' + * and the user can edit the transaction as we don't want to show RBR if the user can't edit it. */ -function hasNoticeTypeViolation(transactionID: string, transactionViolations: OnyxCollection, showInReview?: boolean): boolean { +function shouldShowNoticeTypeViolation({ + transactionID, + transactionViolations, + showInReview, + parentReportAction, +}: { + transactionID: string; + transactionViolations: OnyxCollection; + showInReview?: boolean; + parentReportAction: OnyxEntry; +}): boolean { + if (!canEditTransaction(transactionID, parentReportAction)) { + return false; + } + return !!transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]?.some( (violation: TransactionViolation) => violation.type === CONST.VIOLATION_TYPES.NOTICE && (showInReview === undefined || showInReview === (violation.showInReview ?? false)), ); @@ -889,8 +962,23 @@ function hasNoticeTypeViolation(transactionID: string, transactionViolations: On /** * Checks if any violations for the provided transaction are of type 'warning' + * and the user can edit the transaction as we don't want to show RBR if the user can't edit it. */ -function hasWarningTypeViolation(transactionID: string, transactionViolations: OnyxCollection, showInReview?: boolean): boolean { +function shouldShowWarningTypeViolation({ + transactionID, + transactionViolations, + showInReview, + parentReportAction, +}: { + transactionID: string; + transactionViolations: OnyxCollection; + showInReview?: boolean; + parentReportAction: OnyxEntry; +}): boolean { + if (!canEditTransaction(transactionID, parentReportAction)) { + return false; + } + const violations = transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]; const warningTypeViolations = violations?.filter( @@ -1290,6 +1378,7 @@ export { isCreatedMissing, areRequiredFieldsEmpty, hasMissingSmartscanFields, + shouldShowMissingSmartscanFieldsError, hasPendingRTERViolation, allHavePendingRTERViolation, hasPendingUI, @@ -1297,11 +1386,11 @@ export { waypointHasValidAddress, getRecentTransactions, hasReservationList, - hasViolation, + shouldShowViolation, hasBrokenConnectionViolation, shouldShowBrokenConnectionViolation, - hasNoticeTypeViolation, - hasWarningTypeViolation, + shouldShowNoticeTypeViolation, + shouldShowWarningTypeViolation, isCustomUnitRateIDForP2P, getRateID, getTransaction, From 8e980d69f2c5924d3e40fc6f3a0128dc60247390 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Sun, 15 Dec 2024 20:06:03 +0300 Subject: [PATCH 02/11] minor fix --- src/libs/TransactionUtils/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index ba5cc741c6a6..acb6647fbe70 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -932,7 +932,7 @@ function shouldShowViolation({ * but if we can't determine they cannot edit it, we opted to show the RBR instead of hiding it. */ function canEditTransaction(transactionID: string, parentReportAction: OnyxEntry): boolean { - const report = ReportConnection.getReport(parentReportAction?.childReportID ?? '-1'); + const report = ReportUtils.getReport(parentReportAction?.childReportID ?? '-1'); const transaction = getTransaction(transactionID ?? '-1'); if (report && transaction && parentReportAction) { const canUserPerformWriteAction = !!ReportUtils.canUserPerformWriteAction(report); From 99ef4c1e7afe7082cafce076d54a55d1479e1ad4 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Mon, 23 Dec 2024 19:10:53 +0300 Subject: [PATCH 03/11] Added tests --- tests/unit/TransactionUtilsTest.ts | 69 ++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/tests/unit/TransactionUtilsTest.ts b/tests/unit/TransactionUtilsTest.ts index 6cf3704aeb09..7c51f10fe3d5 100644 --- a/tests/unit/TransactionUtilsTest.ts +++ b/tests/unit/TransactionUtilsTest.ts @@ -1,6 +1,11 @@ +import Onyx from 'react-native-onyx'; +import * as ReportUtils from '@libs/ReportUtils'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; import type {Attendee} from '@src/types/onyx/IOU'; import * as TransactionUtils from '../../src/libs/TransactionUtils'; import type {Transaction} from '../../src/types/onyx'; +import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; function generateTransaction(values: Partial = {}): Transaction { const reportID = '1'; @@ -14,6 +19,8 @@ function generateTransaction(values: Partial = {}): Transaction { return {...baseValues, ...values}; } +Onyx.init({keys: ONYXKEYS}); + describe('TransactionUtils', () => { describe('getCreated', () => { describe('when the transaction property "modifiedCreated" has value', () => { @@ -91,5 +98,67 @@ describe('TransactionUtils', () => { expect(result).toEqual(expectedResult); }); }); + + describe('shouldShowViolations', () => { + it('returns true if there are violations and only if the user can edit the request', async () => { + // Given violations exist for a transaction + await Onyx.merge(ONYXKEYS.SESSION, { + accountID: 1234, + }); + const expenseReport = ReportUtils.buildOptimisticExpenseReport('212', '123', 100, 122, 'USD'); + const expenseTransaction = TransactionUtils.buildOptimisticTransaction(100, 'USD', expenseReport.reportID); + const transactionViolations = { + [`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${expenseTransaction.transactionID}`]: [ + {type: CONST.VIOLATION_TYPES.NOTICE, name: CONST.VIOLATIONS.TAX_REQUIRED}, + {type: CONST.VIOLATION_TYPES.VIOLATION, name: CONST.VIOLATIONS.TAX_REQUIRED}, + {type: CONST.VIOLATION_TYPES.WARNING, name: CONST.VIOLATIONS.TAX_REQUIRED}, + ], + }; + + const parentIOUAction = ReportUtils.buildOptimisticIOUReportAction( + 'create', + 100, + 'USD', + '', + [], + expenseTransaction.transactionID, + undefined, + expenseReport.reportID, + undefined, + false, + false, + undefined, + undefined, + ); + const transactionThreadReport = ReportUtils.buildTransactionThread(parentIOUAction, expenseReport); + parentIOUAction.childReportID = transactionThreadReport.reportID; + + await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport); + await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport.reportID}`, transactionThreadReport); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${expenseTransaction.transactionID}`, expenseTransaction); + // When the current user can edit the request then we should show violations + expect(TransactionUtils.shouldShowViolation({transactionID: expenseTransaction.transactionID, transactionViolations, parentReportAction: parentIOUAction})).toBe(true); + expect(TransactionUtils.shouldShowNoticeTypeViolation({transactionID: expenseTransaction.transactionID, transactionViolations, parentReportAction: parentIOUAction})).toBe( + true, + ); + expect(TransactionUtils.shouldShowWarningTypeViolation({transactionID: expenseTransaction.transactionID, transactionViolations, parentReportAction: parentIOUAction})).toBe( + true, + ); + expect(TransactionUtils.shouldShowMissingSmartscanFieldsError({...expenseTransaction, amount: 0}, parentIOUAction)).toBe(true); + + // When the current user can't edit the request + parentIOUAction.actorAccountID = 4321; + + // We should not show violations + expect(TransactionUtils.shouldShowViolation({transactionID: expenseTransaction.transactionID, transactionViolations, parentReportAction: parentIOUAction})).toBe(false); + expect(TransactionUtils.shouldShowNoticeTypeViolation({transactionID: expenseTransaction.transactionID, transactionViolations, parentReportAction: parentIOUAction})).toBe( + false, + ); + expect(TransactionUtils.shouldShowWarningTypeViolation({transactionID: expenseTransaction.transactionID, transactionViolations, parentReportAction: parentIOUAction})).toBe( + false, + ); + expect(TransactionUtils.shouldShowMissingSmartscanFieldsError({...expenseTransaction, amount: 0}, parentIOUAction)).toBe(false); + }); + }); }); }); From e755386892eb425dd9cc14322a3a364ed8a27655 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Tue, 24 Dec 2024 19:36:39 +0300 Subject: [PATCH 04/11] minor fix --- src/libs/TransactionUtils/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 0717a97e747f..2f9be9b07493 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -934,7 +934,7 @@ function shouldShowViolation({ * but if we can't determine they cannot edit it, we opted to show the RBR instead of hiding it. */ function canEditTransaction(transactionID: string, parentReportAction: OnyxEntry): boolean { - const report = ReportUtils.getReport(parentReportAction?.childReportID ?? '-1'); + const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${parentReportAction?.childReportID ?? CONST.DEFAULT_NUMBER_ID}`]; const transaction = getTransaction(transactionID ?? '-1'); if (report && transaction && parentReportAction) { const canUserPerformWriteAction = !!ReportUtils.canUserPerformWriteAction(report); From 6569a7d94fce3013bc7fc24bf964489c7db825af Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Wed, 25 Dec 2024 00:09:55 +0300 Subject: [PATCH 05/11] eslint fix --- .../MoneyRequestPreviewContent.tsx | 22 +++++++++---------- src/libs/TransactionUtils/index.ts | 16 +++++++------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index f7fcd37134a9..60d2b555b4e4 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -74,20 +74,20 @@ function MoneyRequestPreviewContent({ const route = useRoute>(); const {shouldUseNarrowLayout} = useResponsiveLayout(); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); - const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID || '-1'}`); + const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID || undefined}`); const [session] = useOnyx(ONYXKEYS.SESSION); - const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${iouReportID || '-1'}`); + const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${iouReportID || undefined}`); const policy = PolicyUtils.getPolicy(iouReport?.policyID); const isMoneyRequestAction = ReportActionsUtils.isMoneyRequestAction(action); - const transactionID = isMoneyRequestAction ? ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID : '-1'; + const transactionID = isMoneyRequestAction ? ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID : undefined; const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`); const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS); const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS); const sessionAccountID = session?.accountID; - const managerID = iouReport?.managerID ?? -1; - const ownerAccountID = iouReport?.ownerAccountID ?? -1; + const managerID = iouReport?.managerID ?? CONST.DEFAULT_NUMBER_ID; + const ownerAccountID = iouReport?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID; const isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(chatReport); const participantAccountIDs = @@ -117,12 +117,12 @@ function MoneyRequestPreviewContent({ const isOnHold = TransactionUtils.isOnHold(transaction); const isSettlementOrApprovalPartial = !!iouReport?.pendingFields?.partial; const isPartialHold = isSettlementOrApprovalPartial && isOnHold; - const hasViolations = TransactionUtils.shouldShowViolation({transactionID: transaction?.transactionID ?? '-1', transactionViolations, showInReview: true, parentReportAction: action}); + const hasViolations = TransactionUtils.shouldShowViolation({transactionID: transaction?.transactionID, transactionViolations, showInReview: true, parentReportAction: action}); const hasNoticeTypeViolations = - TransactionUtils.shouldShowNoticeTypeViolation({transactionID: transaction?.transactionID ?? '-1', transactionViolations, showInReview: true, parentReportAction: action}) && + TransactionUtils.shouldShowNoticeTypeViolation({transactionID: transaction?.transactionID, transactionViolations, showInReview: true, parentReportAction: action}) && ReportUtils.isPaidGroupPolicy(iouReport); const hasWarningTypeViolations = TransactionUtils.shouldShowWarningTypeViolation({ - transactionID: transaction?.transactionID ?? '-1', + transactionID: transaction?.transactionID, transactionViolations, showInReview: true, parentReportAction: action, @@ -163,7 +163,7 @@ function MoneyRequestPreviewContent({ const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params?.threadReportID}`); const parentReportAction = ReportActionsUtils.getReportAction(report?.parentReportID ?? '', report?.parentReportActionID ?? ''); - const reviewingTransactionID = ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction)?.IOUTransactionID ?? '-1' : '-1'; + const reviewingTransactionID = ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction)?.IOUTransactionID : undefined; /* Show the merchant for IOUs and expenses only if: @@ -260,10 +260,10 @@ function MoneyRequestPreviewContent({ if (TransactionUtils.isPending(transaction)) { return {shouldShow: true, messageIcon: Expensicons.CreditCardHourglass, messageDescription: translate('iou.transactionPending')}; } - if (TransactionUtils.shouldShowBrokenConnectionViolation(transaction?.transactionID ?? '-1', iouReport, policy)) { + if (TransactionUtils.shouldShowBrokenConnectionViolation(transaction?.transactionID, iouReport, policy)) { return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('violations.brokenConnection530Error')}; } - if (TransactionUtils.hasPendingUI(transaction, TransactionUtils.getTransactionViolations(transaction?.transactionID ?? '-1', transactionViolations))) { + if (TransactionUtils.hasPendingUI(transaction, TransactionUtils.getTransactionViolations(transaction?.transactionID, transactionViolations))) { return {shouldShow: true, messageIcon: Expensicons.Hourglass, messageDescription: translate('iou.pendingMatchWithCreditCard')}; } return {shouldShow: false}; diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 2f9be9b07493..a86d5a3066f5 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -728,7 +728,7 @@ function shouldShowMissingSmartscanFieldsError(transaction: OnyxInputOrEntry | null): TransactionViolations | null { +function getTransactionViolations(transactionID: string | undefined, transactionViolations: OnyxCollection | null): TransactionViolations | null { return transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID] ?? null; } @@ -748,7 +748,7 @@ function hasPendingRTERViolation(transactionViolations?: TransactionViolations | /** * Check if there is broken connection violation. */ -function hasBrokenConnectionViolation(transactionID: string): boolean { +function hasBrokenConnectionViolation(transactionID: string | undefined): boolean { const violations = getTransactionViolations(transactionID, allTransactionViolations); return !!violations?.find( (violation) => @@ -760,7 +760,7 @@ function hasBrokenConnectionViolation(transactionID: string): boolean { /** * Check if user should see broken connection violation warning. */ -function shouldShowBrokenConnectionViolation(transactionID: string, report: OnyxEntry | SearchReport, policy: OnyxEntry | SearchPolicy): boolean { +function shouldShowBrokenConnectionViolation(transactionID: string | undefined, report: OnyxEntry | SearchReport, policy: OnyxEntry | SearchPolicy): boolean { return ( hasBrokenConnectionViolation(transactionID) && (!PolicyUtils.isPolicyAdmin(policy) || ReportUtils.isOpenExpenseReport(report) || (ReportUtils.isProcessingReport(report) && PolicyUtils.isInstantSubmitEnabled(policy))) @@ -913,7 +913,7 @@ function shouldShowViolation({ showInReview, parentReportAction, }: { - transactionID: string; + transactionID: string | undefined; transactionViolations: OnyxCollection; showInReview?: boolean; parentReportAction: OnyxEntry; @@ -933,9 +933,9 @@ function shouldShowViolation({ * true because we use this function to show RBR only for the user side who can edit the transaction * but if we can't determine they cannot edit it, we opted to show the RBR instead of hiding it. */ -function canEditTransaction(transactionID: string, parentReportAction: OnyxEntry): boolean { +function canEditTransaction(transactionID: string | undefined, parentReportAction: OnyxEntry): boolean { const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${parentReportAction?.childReportID ?? CONST.DEFAULT_NUMBER_ID}`]; - const transaction = getTransaction(transactionID ?? '-1'); + const transaction = getTransaction(transactionID); if (report && transaction && parentReportAction) { const canUserPerformWriteAction = !!ReportUtils.canUserPerformWriteAction(report); const canEditRequest = canUserPerformWriteAction && ReportActionsUtils.isMoneyRequestAction(parentReportAction) && ReportUtils.canEditMoneyRequest(parentReportAction, transaction); @@ -955,7 +955,7 @@ function shouldShowNoticeTypeViolation({ showInReview, parentReportAction, }: { - transactionID: string; + transactionID: string | undefined; transactionViolations: OnyxCollection; showInReview?: boolean; parentReportAction: OnyxEntry; @@ -979,7 +979,7 @@ function shouldShowWarningTypeViolation({ showInReview, parentReportAction, }: { - transactionID: string; + transactionID: string | undefined; transactionViolations: OnyxCollection; showInReview?: boolean; parentReportAction: OnyxEntry; From a4fe71e1622c09de4d5e29c6a4bfcad6561417ef Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Mon, 30 Dec 2024 15:47:47 +0300 Subject: [PATCH 06/11] lint fix --- .../ReportActionItem/MoneyRequestView.tsx | 20 +++++++++---------- src/libs/ReportUtils.ts | 5 ++++- src/libs/actions/ReportActions.ts | 4 ++-- src/libs/actions/Transaction.ts | 5 ++++- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index ab11b8c9129d..fa359ed363e6 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -71,9 +71,9 @@ const receiptImageViolationNames: OnyxTypes.ViolationName[] = [ const receiptFieldViolationNames: OnyxTypes.ViolationName[] = [CONST.VIOLATIONS.MODIFIED_AMOUNT, CONST.VIOLATIONS.MODIFIED_DATE]; const getTransactionID = (report: OnyxEntry, parentReportActions: OnyxEntry) => { - const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1']; + const parentReportAction = report?.parentReportActionID ? parentReportActions?.[report?.parentReportActionID] : undefined; const originalMessage = parentReportAction && ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction) : undefined; - return originalMessage?.IOUTransactionID ?? -1; + return originalMessage?.IOUTransactionID; }; function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = false, updatedTransaction, isFromReviewDuplicates = false}: MoneyRequestViewProps) { @@ -81,8 +81,8 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals const session = useSession(); const {isOffline} = useNetwork(); const {translate, toLocaleDigit} = useLocalize(); - const parentReportID = report?.parentReportID ?? '-1'; - const policyID = report?.policyID ?? '-1'; + const parentReportID = report?.parentReportID; + const policyID = report?.policyID; const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`); const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReport?.parentReportID}`, { selector: (chatReportValue) => chatReportValue && {reportID: chatReportValue.reportID, errorFields: chatReportValue.errorFields}, @@ -97,12 +97,12 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals }); const [transactionViolations] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${getTransactionID(report, parentReportActions)}`); - const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1']; + const parentReportAction = report?.parentReportActionID ? parentReportActions?.[report?.parentReportActionID] : undefined; const isTrackExpense = ReportUtils.isTrackExpenseReport(report); const moneyRequestReport = parentReport; const linkedTransactionID = useMemo(() => { const originalMessage = parentReportAction && ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction) : undefined; - return originalMessage?.IOUTransactionID ?? '-1'; + return originalMessage?.IOUTransactionID; }, [parentReportAction]); const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${linkedTransactionID}`); @@ -224,10 +224,10 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals const saveBillable = useCallback( (newBillable: boolean) => { // If the value hasn't changed, don't request to save changes on the server and just close the modal - if (newBillable === TransactionUtils.getBillable(transaction)) { + if (newBillable === TransactionUtils.getBillable(transaction) || !transaction?.transactionID || !report?.reportID) { return; } - IOU.updateMoneyRequestBillable(transaction?.transactionID ?? '-1', report?.reportID ?? '-1', newBillable, policy, policyTagList, policyCategories); + IOU.updateMoneyRequestBillable(transaction?.transactionID, report?.reportID, newBillable, policy, policyTagList, policyCategories); }, [transaction, report, policy, policyTagList, policyCategories], ); @@ -458,7 +458,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals errors={errors} errorRowStyles={[styles.mh4]} onClose={() => { - if (!transaction?.transactionID && linkedTransactionID === '-1') { + if (!transaction?.transactionID && !linkedTransactionID) { return; } @@ -473,7 +473,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals } } Transaction.clearError(transaction?.transactionID ?? linkedTransactionID); - ReportActions.clearAllRelatedReportActionErrors(report?.reportID ?? '-1', parentReportAction); + ReportActions.clearAllRelatedReportActionErrors(report?.reportID, parentReportAction); }} > {hasReceipt && ( diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index e76666a16319..80ef3993eb2d 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -799,7 +799,10 @@ function isDraftReport(reportID: string | undefined): boolean { /** * Returns the report */ -function getReport(reportID: string): OnyxEntry { +function getReport(reportID: string | undefined): OnyxEntry { + if (!reportID) { + return undefined; + } return allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; } diff --git a/src/libs/actions/ReportActions.ts b/src/libs/actions/ReportActions.ts index 89517a753c26..38d8f4f1d911 100644 --- a/src/libs/actions/ReportActions.ts +++ b/src/libs/actions/ReportActions.ts @@ -26,7 +26,7 @@ Onyx.connect({ }, }); -function clearReportActionErrors(reportID: string, reportAction: ReportAction, keys?: string[]) { +function clearReportActionErrors(reportID: string | undefined, reportAction: ReportAction, keys?: string[]) { const originalReportID = ReportUtils.getOriginalReportID(reportID, reportAction); if (!reportAction?.reportActionID) { @@ -81,7 +81,7 @@ function clearReportActionErrors(reportID: string, reportAction: ReportAction, k ignore: `undefined` means we want to check both parent and children report actions ignore: `parent` or `child` means we want to ignore checking parent or child report actions because they've been previously checked */ -function clearAllRelatedReportActionErrors(reportID: string, reportAction: ReportAction | null | undefined, ignore?: IgnoreDirection, keys?: string[]) { +function clearAllRelatedReportActionErrors(reportID: string | undefined, reportAction: ReportAction | null | undefined, ignore?: IgnoreDirection, keys?: string[]) { const errorKeys = keys ?? Object.keys(reportAction?.errors ?? {}); if (!reportAction || errorKeys.length === 0) { return; diff --git a/src/libs/actions/Transaction.ts b/src/libs/actions/Transaction.ts index c8a007458242..a69142fc0fe2 100644 --- a/src/libs/actions/Transaction.ts +++ b/src/libs/actions/Transaction.ts @@ -457,7 +457,10 @@ function abandonReviewDuplicateTransactions() { Onyx.set(ONYXKEYS.REVIEW_DUPLICATES, null); } -function clearError(transactionID: string) { +function clearError(transactionID: string | undefined) { + if (!transactionID) { + return; + } Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {errors: null, errorFields: {route: null, waypoints: null, routes: null}}); } From 6997b5dbc3b89e5231cd51b6c66b24bca3669907 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Mon, 30 Dec 2024 16:19:37 +0300 Subject: [PATCH 07/11] ts fix --- src/libs/ReportActionsUtils.ts | 6 +++++- src/libs/ReportUtils.ts | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 4fa704944bc9..0cb98d0331f5 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -1057,7 +1057,11 @@ const iouRequestTypes = new Set>([ * Gets the reportID for the transaction thread associated with a report by iterating over the reportActions and identifying the IOU report actions. * Returns a reportID if there is exactly one transaction thread for the report, and null otherwise. */ -function getOneTransactionThreadReportID(reportID: string, reportActions: OnyxEntry | ReportAction[], isOffline: boolean | undefined = undefined): string | undefined { +function getOneTransactionThreadReportID( + reportID: string | undefined, + reportActions: OnyxEntry | ReportAction[], + isOffline: boolean | undefined = undefined, +): string | undefined { // If the report is not an IOU, Expense report, or Invoice, it shouldn't be treated as one-transaction report. const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; if (report?.type !== CONST.REPORT.TYPE.IOU && report?.type !== CONST.REPORT.TYPE.EXPENSE && report?.type !== CONST.REPORT.TYPE.INVOICE) { diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 80ef3993eb2d..b2032c4ced6b 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -7378,7 +7378,7 @@ function canUserPerformWriteAction(report: OnyxEntry) { /** * Returns ID of the original report from which the given reportAction is first created. */ -function getOriginalReportID(reportID: string, reportAction: OnyxInputOrEntry): string | undefined { +function getOriginalReportID(reportID: string | undefined, reportAction: OnyxInputOrEntry): string | undefined { const reportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`]; const currentReportAction = reportActions?.[reportAction?.reportActionID ?? '-1'] ?? null; const transactionThreadReportID = ReportActionsUtils.getOneTransactionThreadReportID(reportID, reportActions ?? ([] as ReportAction[])); From 21c352bc88e136535064db09c202e69b49625f20 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Mon, 30 Dec 2024 22:17:11 +0300 Subject: [PATCH 08/11] lint fix --- src/ROUTES.ts | 28 ++++----- .../ReportActionItem/MoneyRequestView.tsx | 60 +++++++------------ 2 files changed, 37 insertions(+), 51 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 909f847fd75d..d8040ab10171 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -457,27 +457,27 @@ const ROUTES = { }, MONEY_REQUEST_STEP_AMOUNT: { route: ':action/:iouType/amount/:transactionID/:reportID/:pageIndex?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, pageIndex: string, backTo = '') => + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, pageIndex: string, backTo = '') => getUrlWithBackToParam(`${action as string}/${iouType as string}/amount/${transactionID}/${reportID}/${pageIndex}`, backTo), }, MONEY_REQUEST_STEP_TAX_RATE: { route: ':action/:iouType/taxRate/:transactionID/:reportID?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => getUrlWithBackToParam(`${action as string}/${iouType as string}/taxRate/${transactionID}/${reportID}`, backTo), }, MONEY_REQUEST_STEP_TAX_AMOUNT: { route: ':action/:iouType/taxAmount/:transactionID/:reportID?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => getUrlWithBackToParam(`${action as string}/${iouType as string}/taxAmount/${transactionID}/${reportID}`, backTo), }, MONEY_REQUEST_STEP_CATEGORY: { route: ':action/:iouType/category/:transactionID/:reportID/:reportActionID?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '', reportActionID?: string) => + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => getUrlWithBackToParam(`${action as string}/${iouType as string}/category/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo), }, MONEY_REQUEST_ATTENDEE: { route: ':action/:iouType/attendees/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => getUrlWithBackToParam(`${action as string}/${iouType as string}/attendees/${transactionID}/${reportID}`, backTo), }, MONEY_REQUEST_UPGRADE: { @@ -578,27 +578,27 @@ const ROUTES = { }, MONEY_REQUEST_STEP_DATE: { route: ':action/:iouType/date/:transactionID/:reportID/:reportActionID?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '', reportActionID?: string) => + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => getUrlWithBackToParam(`${action as string}/${iouType as string}/date/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo), }, MONEY_REQUEST_STEP_DESCRIPTION: { route: ':action/:iouType/description/:transactionID/:reportID/:reportActionID?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '', reportActionID?: string) => + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => getUrlWithBackToParam(`${action as string}/${iouType as string}/description/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo), }, MONEY_REQUEST_STEP_DISTANCE: { route: ':action/:iouType/distance/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => getUrlWithBackToParam(`${action as string}/${iouType as string}/distance/${transactionID}/${reportID}`, backTo), }, MONEY_REQUEST_STEP_DISTANCE_RATE: { route: ':action/:iouType/distanceRate/:transactionID/:reportID', - getRoute: (action: ValueOf, iouType: ValueOf, transactionID: string, reportID: string, backTo = '') => + getRoute: (action: ValueOf, iouType: ValueOf, transactionID: string | undefined, reportID: string | undefined, backTo = '') => getUrlWithBackToParam(`${action}/${iouType}/distanceRate/${transactionID}/${reportID}`, backTo), }, MONEY_REQUEST_STEP_MERCHANT: { route: ':action/:iouType/merchant/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => getUrlWithBackToParam(`${action as string}/${iouType as string}/merchant/${transactionID}/${reportID}`, backTo), }, MONEY_REQUEST_STEP_PARTICIPANTS: { @@ -613,12 +613,12 @@ const ROUTES = { }, MONEY_REQUEST_STEP_SCAN: { route: ':action/:iouType/scan/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => getUrlWithBackToParam(`${action as string}/${iouType as string}/scan/${transactionID}/${reportID}`, backTo), }, MONEY_REQUEST_STEP_TAG: { route: ':action/:iouType/tag/:orderWeight/:transactionID/:reportID/:reportActionID?', - getRoute: (action: IOUAction, iouType: IOUType, orderWeight: number, transactionID: string, reportID: string, backTo = '', reportActionID?: string) => + getRoute: (action: IOUAction, iouType: IOUType, orderWeight: number, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => getUrlWithBackToParam(`${action as string}/${iouType as string}/tag/${orderWeight}/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo), }, MONEY_REQUEST_STEP_WAYPOINT: { @@ -1391,11 +1391,11 @@ const ROUTES = { TRACK_TRAINING_MODAL: 'track-training', TRAVEL_TRIP_SUMMARY: { route: 'r/:reportID/trip/:transactionID', - getRoute: (reportID: string, transactionID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}`, backTo), + getRoute: (reportID: string | undefined, transactionID: string | undefined, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}`, backTo), }, TRAVEL_TRIP_DETAILS: { route: 'r/:reportID/trip/:transactionID/:reservationIndex', - getRoute: (reportID: string, transactionID: string, reservationIndex: number, backTo?: string) => + getRoute: (reportID: string | undefined, transactionID: string | undefined, reservationIndex: number, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}/${reservationIndex}`, backTo), }, ONBOARDING_ROOT: { diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index fa359ed363e6..b3721ce64066 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -320,13 +320,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals titleStyle={styles.flex1} onPress={() => Navigation.navigate( - ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute( - CONST.IOU.ACTION.EDIT, - iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1', - Navigation.getReportRHPActiveRoute(), - ), + ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID, report?.reportID, Navigation.getReportRHPActiveRoute()), ) } /> @@ -343,8 +337,8 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.getRoute( CONST.IOU.ACTION.EDIT, iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1', + transaction?.transactionID, + report?.reportID, Navigation.getReportRHPActiveRoute(), ), ) @@ -427,8 +421,8 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals CONST.IOU.ACTION.EDIT, iouType, orderWeight, - transaction?.transactionID ?? '', - report?.reportID ?? '-1', + transaction?.transactionID, + report?.reportID, Navigation.getReportRHPActiveRoute(), ), ) @@ -504,8 +498,8 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals ROUTES.MONEY_REQUEST_STEP_SCAN.getRoute( CONST.IOU.ACTION.EDIT, iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1', + transaction?.transactionID, + report?.reportID, Navigation.getReportRHPActiveRoute(), ), ) @@ -529,8 +523,8 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals ROUTES.MONEY_REQUEST_STEP_AMOUNT.getRoute( CONST.IOU.ACTION.EDIT, iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1', + transaction?.transactionID, + report?.reportID, '', Navigation.getReportRHPActiveRoute(), ), @@ -553,8 +547,8 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute( CONST.IOU.ACTION.EDIT, iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1', + transaction?.transactionID, + report?.reportID, Navigation.getReportRHPActiveRoute(), ), ) @@ -580,8 +574,8 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute( CONST.IOU.ACTION.EDIT, iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1', + transaction?.transactionID, + report?.reportID, Navigation.getReportRHPActiveRoute(), ), ) @@ -602,13 +596,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals titleStyle={styles.flex1} onPress={() => Navigation.navigate( - ROUTES.MONEY_REQUEST_STEP_DATE.getRoute( - CONST.IOU.ACTION.EDIT, - iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1' ?? '-1', - Navigation.getReportRHPActiveRoute(), - ), + ROUTES.MONEY_REQUEST_STEP_DATE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID, report?.reportID, Navigation.getReportRHPActiveRoute()), ) } brickRoadIndicator={getErrorForField('date') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} @@ -628,8 +616,8 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute( CONST.IOU.ACTION.EDIT, iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1', + transaction?.transactionID, + report?.reportID, Navigation.getReportRHPActiveRoute(), ), ) @@ -663,8 +651,8 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals ROUTES.MONEY_REQUEST_STEP_TAX_RATE.getRoute( CONST.IOU.ACTION.EDIT, iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1', + transaction?.transactionID, + report?.reportID, Navigation.getReportRHPActiveRoute(), ), ) @@ -687,8 +675,8 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals ROUTES.MONEY_REQUEST_STEP_TAX_AMOUNT.getRoute( CONST.IOU.ACTION.EDIT, iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1', + transaction?.transactionID, + report?.reportID, Navigation.getReportRHPActiveRoute(), ), ) @@ -703,9 +691,9 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals onPress={() => { const reservations = transaction?.receipt?.reservationList?.length ?? 0; if (reservations > 1) { - Navigation.navigate(ROUTES.TRAVEL_TRIP_SUMMARY.getRoute(report?.reportID ?? '-1', transaction?.transactionID ?? '-1', Navigation.getReportRHPActiveRoute())); + Navigation.navigate(ROUTES.TRAVEL_TRIP_SUMMARY.getRoute(report?.reportID, transaction?.transactionID, Navigation.getReportRHPActiveRoute())); } - Navigation.navigate(ROUTES.TRAVEL_TRIP_DETAILS.getRoute(report?.reportID ?? '-1', transaction?.transactionID ?? '-1', 0, Navigation.getReportRHPActiveRoute())); + Navigation.navigate(ROUTES.TRAVEL_TRIP_DETAILS.getRoute(report?.reportID, transaction?.transactionID, 0, Navigation.getReportRHPActiveRoute())); }} /> )} @@ -720,9 +708,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals }`} style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} - onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_ATTENDEE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1')) - } + onPress={() => Navigation.navigate(ROUTES.MONEY_REQUEST_ATTENDEE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID, report?.reportID))} interactive shouldRenderAsHTML /> From 9f0eb8ea327762d79d3124241df4d6357c155b22 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Mon, 30 Dec 2024 22:30:28 +0300 Subject: [PATCH 09/11] lint fix --- src/libs/actions/ReportActions.ts | 4 ++-- src/libs/actions/Transaction.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libs/actions/ReportActions.ts b/src/libs/actions/ReportActions.ts index 38d8f4f1d911..c9098d10fe06 100644 --- a/src/libs/actions/ReportActions.ts +++ b/src/libs/actions/ReportActions.ts @@ -41,7 +41,7 @@ function clearReportActionErrors(reportID: string | undefined, reportAction: Rep // If there's a linked transaction, delete that too // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const linkedTransactionID = ReportActionUtils.getLinkedTransactionID(reportAction.reportActionID, originalReportID || '-1'); + const linkedTransactionID = ReportActionUtils.getLinkedTransactionID(reportAction.reportActionID, originalReportID); if (linkedTransactionID) { Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${linkedTransactionID}`, null); Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${reportAction.childReportID}`, null); @@ -101,7 +101,7 @@ function clearAllRelatedReportActionErrors(reportID: string | undefined, reportA const childActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportAction.childReportID}`] ?? {}; Object.values(childActions).forEach((action) => { const childErrorKeys = Object.keys(action.errors ?? {}).filter((err) => errorKeys.includes(err)); - clearAllRelatedReportActionErrors(reportAction.childReportID ?? '-1', action, 'parent', childErrorKeys); + clearAllRelatedReportActionErrors(reportAction.childReportID, action, 'parent', childErrorKeys); }); } } diff --git a/src/libs/actions/Transaction.ts b/src/libs/actions/Transaction.ts index a69142fc0fe2..829040094cb2 100644 --- a/src/libs/actions/Transaction.ts +++ b/src/libs/actions/Transaction.ts @@ -365,7 +365,7 @@ function dismissDuplicateTransactionViolation(transactionIDs: string[], dissmiss const optimisticReportActions: OnyxUpdate[] = transactionsReportActions.map((action, index) => ({ onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${action?.childReportID ?? '-1'}`, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${action?.childReportID}`, value: { [optimisticDissmidedViolationReportActions.at(index)?.reportActionID ?? '']: optimisticDissmidedViolationReportActions.at(index) as ReportAction, }, @@ -413,7 +413,7 @@ function dismissDuplicateTransactionViolation(transactionIDs: string[], dissmiss const failureReportActions: OnyxUpdate[] = transactionsReportActions.map((action, index) => ({ onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${action?.childReportID ?? '-1'}`, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${action?.childReportID}`, value: { [optimisticDissmidedViolationReportActions.at(index)?.reportActionID ?? '']: null, }, @@ -425,7 +425,7 @@ function dismissDuplicateTransactionViolation(transactionIDs: string[], dissmiss const successData: OnyxUpdate[] = transactionsReportActions.map((action, index) => ({ onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${action?.childReportID ?? '-1'}`, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${action?.childReportID}`, value: { [optimisticDissmidedViolationReportActions.at(index)?.reportActionID ?? '']: null, }, From 4670a3bfa859454bb145ab240ef5c18b57db330c Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Mon, 30 Dec 2024 22:48:21 +0300 Subject: [PATCH 10/11] lint fix --- src/libs/ReportActionsUtils.ts | 6 +++++- src/libs/actions/Transaction.ts | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 0cb98d0331f5..c01a98ad863a 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -1594,7 +1594,11 @@ function wasActionTakenByCurrentUser(reportAction: OnyxInputOrEntry { +function getIOUActionForReportID(reportID: string | undefined, transactionID: string | undefined): OnyxEntry { + if (!reportID || !transactionID) { + return undefined; + } + const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; const reportActions = getAllReportActions(report?.reportID ?? ''); const action = Object.values(reportActions ?? {})?.find((reportAction) => { diff --git a/src/libs/actions/Transaction.ts b/src/libs/actions/Transaction.ts index 829040094cb2..6ab1bffad4d7 100644 --- a/src/libs/actions/Transaction.ts +++ b/src/libs/actions/Transaction.ts @@ -355,7 +355,7 @@ function updateWaypoints(transactionID: string, waypoints: WaypointCollection, i function dismissDuplicateTransactionViolation(transactionIDs: string[], dissmissedPersonalDetails: PersonalDetails) { const currentTransactionViolations = transactionIDs.map((id) => ({transactionID: id, violations: allTransactionViolation?.[id] ?? []})); const currentTransactions = transactionIDs.map((id) => allTransactions?.[id]); - const transactionsReportActions = currentTransactions.map((transaction) => ReportActionsUtils.getIOUActionForReportID(transaction.reportID ?? '', transaction.transactionID ?? '')); + const transactionsReportActions = currentTransactions.map((transaction) => ReportActionsUtils.getIOUActionForReportID(transaction.reportID, transaction.transactionID)); const optimisticDissmidedViolationReportActions = transactionsReportActions.map(() => { return buildOptimisticDismissedViolationReportAction({reason: 'manual', violationName: CONST.VIOLATIONS.DUPLICATED_TRANSACTION}); }); @@ -367,7 +367,7 @@ function dismissDuplicateTransactionViolation(transactionIDs: string[], dissmiss onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${action?.childReportID}`, value: { - [optimisticDissmidedViolationReportActions.at(index)?.reportActionID ?? '']: optimisticDissmidedViolationReportActions.at(index) as ReportAction, + [`${optimisticDissmidedViolationReportActions.at(index)?.reportActionID}`]: optimisticDissmidedViolationReportActions.at(index) as ReportAction, }, })); const optimisticDataTransactionViolations: OnyxUpdate[] = currentTransactionViolations.map((transactionViolations) => ({ @@ -388,7 +388,7 @@ function dismissDuplicateTransactionViolation(transactionIDs: string[], dissmiss ...transaction.comment, dismissedViolations: { duplicatedTransaction: { - [dissmissedPersonalDetails.login ?? '']: getUnixTime(new Date()), + [`${dissmissedPersonalDetails.login}`]: getUnixTime(new Date()), }, }, }, @@ -415,7 +415,7 @@ function dismissDuplicateTransactionViolation(transactionIDs: string[], dissmiss onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${action?.childReportID}`, value: { - [optimisticDissmidedViolationReportActions.at(index)?.reportActionID ?? '']: null, + [`${optimisticDissmidedViolationReportActions.at(index)?.reportActionID}`]: null, }, })); @@ -427,7 +427,7 @@ function dismissDuplicateTransactionViolation(transactionIDs: string[], dissmiss onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${action?.childReportID}`, value: { - [optimisticDissmidedViolationReportActions.at(index)?.reportActionID ?? '']: null, + [`${optimisticDissmidedViolationReportActions.at(index)?.reportActionID}`]: null, }, })); // We are creating duplicate resolved report actions for each duplicate transactions and all the report actions From abad1bbcc14b0451573820f1e872e095f4af7ccf Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Mon, 13 Jan 2025 16:13:14 +0300 Subject: [PATCH 11/11] fix test --- tests/unit/TransactionUtilsTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/TransactionUtilsTest.ts b/tests/unit/TransactionUtilsTest.ts index 5b5cd380004f..45076c319af3 100644 --- a/tests/unit/TransactionUtilsTest.ts +++ b/tests/unit/TransactionUtilsTest.ts @@ -115,7 +115,7 @@ describe('TransactionUtils', () => { accountID: 1234, }); const expenseReport = ReportUtils.buildOptimisticExpenseReport('212', '123', 100, 122, 'USD'); - const expenseTransaction = TransactionUtils.buildOptimisticTransaction(100, 'USD', expenseReport.reportID); + const expenseTransaction = TransactionUtils.buildOptimisticTransaction({transactionParams: {amount: 100, currency: 'USD', reportID: expenseReport.reportID}}); const transactionViolations = { [`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${expenseTransaction.transactionID}`]: [ {type: CONST.VIOLATION_TYPES.NOTICE, name: CONST.VIOLATIONS.TAX_REQUIRED},