Skip to content

Commit 58df08a

Browse files
committed
Add fix suggested by Vit
1 parent a601a8e commit 58df08a

File tree

3 files changed

+17
-26
lines changed

3 files changed

+17
-26
lines changed

src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {getAvatarsForAccountIDs} from '@libs/OptionsListUtils';
1919
import Parser from '@libs/Parser';
2020
import {getCleanedTagName} from '@libs/PolicyUtils';
2121
import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils';
22-
import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils';
22+
import {getOriginalMessage, getReportActions, isMoneyRequestAction} from '@libs/ReportActionsUtils';
2323
import type {TransactionDetails} from '@libs/ReportUtils';
2424
import {canEditMoneyRequest, getTransactionDetails, getWorkspaceIcon, isIOUReport, isPolicyExpenseChat, isReportApproved, isSettled} from '@libs/ReportUtils';
2525
import StringUtils from '@libs/StringUtils';
@@ -60,6 +60,7 @@ function TransactionPreviewContent({
6060
const ownerAccountID = iouReport?.ownerAccountID ?? reportPreviewAction?.childOwnerAccountID ?? CONST.DEFAULT_NUMBER_ID;
6161
const isReportAPolicyExpenseChat = isPolicyExpenseChat(chatReport);
6262
const {amount: requestAmount, comment: requestComment, merchant, tag, category, currency: requestCurrency} = transactionDetails;
63+
const reportActions = useMemo(() => (iouReport ? getReportActions(iouReport) ?? {} : {}), [iouReport]);
6364

6465
const transactionPreviewCommonArguments = useMemo(
6566
() => ({
@@ -96,8 +97,9 @@ function TransactionPreviewContent({
9697
...transactionPreviewCommonArguments,
9798
shouldShowRBR,
9899
violationMessage,
100+
reportActions,
99101
}),
100-
[transactionPreviewCommonArguments, shouldShowRBR, violationMessage],
102+
[transactionPreviewCommonArguments, shouldShowRBR, violationMessage, reportActions],
101103
);
102104
const getTranslatedText = (item: TranslationPathOrText) => (item.translationPath ? translate(item.translationPath) : item.text ?? '');
103105

src/libs/TransactionPreviewUtils.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {convertToDisplayString} from './CurrencyUtils';
1010
import DateUtils from './DateUtils';
1111
import type {PlatformStackRouteProp} from './Navigation/PlatformStackNavigation/types';
1212
import type {TransactionDuplicateNavigatorParamList} from './Navigation/types';
13-
import {getOriginalMessage, getReportAction, getReportActions, isMessageDeleted, isMoneyRequestAction} from './ReportActionsUtils';
13+
import {getOriginalMessage, getReportAction, isMessageDeleted, isMoneyRequestAction} from './ReportActionsUtils';
1414
import {hasActionsWithErrors, hasReportViolations, isPaidGroupPolicy, isPaidGroupPolicyExpenseReport, isReportApproved, isReportOwner, isSettled} from './ReportUtils';
1515
import type {TransactionDetails} from './ReportUtils';
1616
import StringUtils from './StringUtils';
@@ -140,10 +140,8 @@ function getViolationTranslatePath(violations: OnyxTypes.TransactionViolations,
140140
* it returns an empty array. It identifies the latest error in each action and filters out duplicates to
141141
* ensure only unique error messages are returned.
142142
*/
143-
function getUniqueActionErrors(report: OnyxEntry<OnyxTypes.Report>) {
144-
const reportActions = Object.values(report ? getReportActions(report) ?? {} : {});
145-
146-
const reportErrors = reportActions.map((reportAction) => {
143+
function getUniqueActionErrors(reportActions: OnyxTypes.ReportActions) {
144+
const reportErrors = Object.values(reportActions).map((reportAction) => {
147145
const errors = reportAction.errors ?? {};
148146
const key = Object.keys(errors).sort().reverse().at(0) ?? '';
149147
const error = errors[key];
@@ -162,6 +160,7 @@ function getTransactionPreviewTextAndTranslationPaths({
162160
isBillSplit,
163161
shouldShowRBR,
164162
violationMessage,
163+
reportActions,
165164
}: {
166165
iouReport: OnyxEntry<OnyxTypes.Report>;
167166
transaction: OnyxEntry<OnyxTypes.Transaction>;
@@ -171,6 +170,7 @@ function getTransactionPreviewTextAndTranslationPaths({
171170
isBillSplit: boolean;
172171
shouldShowRBR: boolean;
173172
violationMessage?: string;
173+
reportActions?: OnyxTypes.ReportActions;
174174
}) {
175175
const isFetchingWaypoints = isFetchingWaypointsFromServer(transaction);
176176
const isTransactionOnHold = isOnHold(transaction);
@@ -216,8 +216,8 @@ function getTransactionPreviewTextAndTranslationPaths({
216216
}
217217
}
218218

219-
if (RBRMessage === undefined && hasActionWithErrors) {
220-
const actionsWithErrors = getUniqueActionErrors(iouReport);
219+
if (RBRMessage === undefined && hasActionWithErrors && !!reportActions) {
220+
const actionsWithErrors = getUniqueActionErrors(reportActions);
221221
RBRMessage = actionsWithErrors.length > 1 ? {translationPath: 'violations.reviewRequired'} : {text: actionsWithErrors.at(0)};
222222
}
223223

tests/unit/TransactionPreviewUtils.test.ts

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ import {buildOptimisticIOUReport, buildOptimisticIOUReportAction} from '@libs/Re
22
import {createTransactionPreviewConditionals, getTransactionPreviewTextAndTranslationPaths, getUniqueActionErrors, getViolationTranslatePath} from '@libs/TransactionPreviewUtils';
33
import {buildOptimisticTransaction} from '@libs/TransactionUtils';
44
import CONST from '@src/CONST';
5-
import * as ReportActionUtils from '@src/libs/ReportActionsUtils';
65
import * as ReportUtils from '@src/libs/ReportUtils';
7-
import type {Report, ReportActions} from '@src/types/onyx';
8-
import {iouReportR14932 as mockedReport} from '../../__mocks__/reportData/reports';
6+
import type {ReportActions} from '@src/types/onyx';
97

108
const basicProps = {
119
iouReport: buildOptimisticIOUReport(123, 234, 1000, '1', 'USD'),
@@ -258,14 +256,8 @@ describe('TransactionPreviewUtils', () => {
258256
});
259257

260258
describe('getUniqueActionErrors', () => {
261-
test('returns an empty array if there is no report or it is empty', () => {
262-
expect(getUniqueActionErrors(undefined)).toEqual([]);
263-
expect(getUniqueActionErrors({} as Report)).toEqual([]);
264-
});
265-
266-
test('returns an empty array if there are no actions in the report', () => {
267-
jest.spyOn(ReportActionUtils, 'getReportActions').mockReturnValue({});
268-
expect(getUniqueActionErrors(mockedReport)).toEqual([]);
259+
test('returns an empty array if there are no actions', () => {
260+
expect(getUniqueActionErrors({})).toEqual([]);
269261
});
270262

271263
test('returns unique error messages from report actions', () => {
@@ -276,10 +268,9 @@ describe('TransactionPreviewUtils', () => {
276268
3: {errors: {a: 'Error A', d: 'Error D'}},
277269
/* eslint-enable @typescript-eslint/naming-convention */
278270
} as unknown as ReportActions;
279-
jest.spyOn(ReportActionUtils, 'getReportActions').mockReturnValue(actions);
280271

281272
const expectedErrors = ['Error B', 'Error C', 'Error D'];
282-
expect(getUniqueActionErrors(mockedReport).sort()).toEqual(expectedErrors.sort());
273+
expect(getUniqueActionErrors(actions).sort()).toEqual(expectedErrors.sort());
283274
});
284275

285276
test('returns the latest error message if multiple errors exist under a single action', () => {
@@ -288,9 +279,8 @@ describe('TransactionPreviewUtils', () => {
288279
1: {errors: {z: 'Error Z2', a: 'Error A', f: 'Error Z'}},
289280
/* eslint-enable @typescript-eslint/naming-convention */
290281
} as unknown as ReportActions;
291-
jest.spyOn(ReportActionUtils, 'getReportActions').mockReturnValue(actions);
292282

293-
expect(getUniqueActionErrors(mockedReport)).toEqual(['Error Z2']);
283+
expect(getUniqueActionErrors(actions)).toEqual(['Error Z2']);
294284
});
295285

296286
test('filters out non-string error messages', () => {
@@ -300,9 +290,8 @@ describe('TransactionPreviewUtils', () => {
300290
2: {errors: {c: null, d: 'Error D'}},
301291
/* eslint-enable @typescript-eslint/naming-convention */
302292
} as unknown as ReportActions;
303-
jest.spyOn(ReportActionUtils, 'getReportActions').mockReturnValue(actions);
304293

305-
expect(getUniqueActionErrors(mockedReport)).toEqual(['Error B', 'Error D']);
294+
expect(getUniqueActionErrors(actions)).toEqual(['Error B', 'Error D']);
306295
});
307296
});
308297
});

0 commit comments

Comments
 (0)