From 54ad47b33cbc5995573caad55226d9cd421ca32e Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Mon, 3 Nov 2025 23:40:03 +0500 Subject: [PATCH 1/5] fix: update getReportStatusTranslation to accept params object and remove translateLocal usage --- src/libs/ReportUtils.ts | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index b715240b98f5..29879aba8a2b 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -922,6 +922,12 @@ type GetReportNameParams = { isReportArchived?: boolean; }; +type GetReportStatusParams = { + stateNum?: number; + statusNum?: number; + translate: LocaleContextProps['translate']; +}; + type ReportByPolicyMap = Record>; let currentUserEmail: string | undefined; @@ -12241,34 +12247,29 @@ function buildOptimisticMarkedAsResolvedReportAction(created = DateUtils.getDBTi * ======================================== */ -function getReportStatusTranslation(stateNum?: number, statusNum?: number): string { +function getReportStatusTranslation({stateNum, statusNum, translate}: GetReportStatusParams): string { if (stateNum === undefined || statusNum === undefined) { return ''; } if (stateNum === CONST.REPORT.STATE_NUM.OPEN && statusNum === CONST.REPORT.STATUS_NUM.OPEN) { - // eslint-disable-next-line @typescript-eslint/no-deprecated - return translateLocal('common.draft'); + return translate('common.draft'); } if (stateNum === CONST.REPORT.STATE_NUM.SUBMITTED && statusNum === CONST.REPORT.STATUS_NUM.SUBMITTED) { - // eslint-disable-next-line @typescript-eslint/no-deprecated - return translateLocal('common.outstanding'); + return translate('common.outstanding'); } if (stateNum === CONST.REPORT.STATE_NUM.APPROVED && statusNum === CONST.REPORT.STATUS_NUM.CLOSED) { - // eslint-disable-next-line @typescript-eslint/no-deprecated - return translateLocal('common.done'); + return translate('common.done'); } if (stateNum === CONST.REPORT.STATE_NUM.APPROVED && statusNum === CONST.REPORT.STATUS_NUM.APPROVED) { - // eslint-disable-next-line @typescript-eslint/no-deprecated - return translateLocal('iou.approved'); + return translate('iou.approved'); } if ( (stateNum === CONST.REPORT.STATE_NUM.APPROVED && statusNum === CONST.REPORT.STATUS_NUM.REIMBURSED) || (stateNum === CONST.REPORT.STATE_NUM.BILLING && statusNum === CONST.REPORT.STATUS_NUM.REIMBURSED) || (stateNum === CONST.REPORT.STATE_NUM.AUTOREIMBURSED && statusNum === CONST.REPORT.STATUS_NUM.REIMBURSED) ) { - // eslint-disable-next-line @typescript-eslint/no-deprecated - return translateLocal('iou.settledExpensify'); + return translate('iou.settledExpensify'); } return ''; From 570a2e2098f128ff7a6ee1c0cf25dcae1de68533 Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Mon, 3 Nov 2025 23:42:06 +0500 Subject: [PATCH 2/5] fix: pass translate param to getReportStatusTranslation --- src/components/AvatarWithDisplayName.tsx | 3 ++- .../MoneyRequestReportPreviewContent.tsx | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/AvatarWithDisplayName.tsx b/src/components/AvatarWithDisplayName.tsx index 3ff23c88a985..2b9378247359 100644 --- a/src/components/AvatarWithDisplayName.tsx +++ b/src/components/AvatarWithDisplayName.tsx @@ -180,6 +180,7 @@ function AvatarWithDisplayName({ const theme = useTheme(); const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); + const {translate} = useLocalize(); const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID}`, {canBeMissing: true}); const [invoiceReceiverPolicy] = useOnyx( `${ONYXKEYS.COLLECTION.POLICY}${parentReport?.invoiceReceiver && 'policyID' in parentReport.invoiceReceiver ? parentReport.invoiceReceiver.policyID : undefined}`, @@ -196,7 +197,7 @@ function AvatarWithDisplayName({ const ownerPersonalDetails = getPersonalDetailsForAccountIDs(report?.ownerAccountID ? [report.ownerAccountID] : [], personalDetails); const displayNamesWithTooltips = getDisplayNamesWithTooltips(Object.values(ownerPersonalDetails), false, localeCompare); const avatarBorderColor = avatarBorderColorProp ?? (isAnonymous ? theme.highlightBG : theme.componentBG); - const statusText = shouldDisplayStatus ? getReportStatusTranslation(report?.stateNum, report?.statusNum) : undefined; + const statusText = shouldDisplayStatus ? getReportStatusTranslation({stateNum: report?.stateNum, statusNum: report?.statusNum, translate}) : undefined; const reportStatusColorStyle = shouldDisplayStatus ? getReportStatusColorStyle(theme, report?.stateNum, report?.statusNum) : {}; const actorAccountID = useRef(null); diff --git a/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx index f9d905d1b037..26830e8db39b 100644 --- a/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx @@ -341,8 +341,13 @@ function MoneyRequestReportPreviewContent({ ); const reportStatus = useMemo( - () => getReportStatusTranslation(iouReport?.stateNum ?? action?.childStateNum, iouReport?.statusNum ?? action?.childStatusNum), - [action?.childStateNum, action?.childStatusNum, iouReport?.stateNum, iouReport?.statusNum], + () => + getReportStatusTranslation({ + stateNum: iouReport?.stateNum ?? action?.childStateNum, + statusNum: iouReport?.statusNum ?? action?.childStatusNum, + translate, + }), + [action?.childStateNum, action?.childStatusNum, iouReport?.stateNum, iouReport?.statusNum, translate], ); const reportStatusColorStyle = useMemo( From b2ba3c32153ad595dcfc338d8180e1cae4cfaa4d Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Mon, 3 Nov 2025 23:44:25 +0500 Subject: [PATCH 3/5] update getReportStatusTranslation tests to use translate param --- tests/unit/ReportUtilsTest.ts | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 026282b55984..bb0cd6d76450 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -4,6 +4,7 @@ import {renderHook} from '@testing-library/react-native'; import {addDays, format as formatDate} from 'date-fns'; import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; +import type {LocaleContextProps} from '@components/LocaleContextProvider'; import useReportIsArchived from '@hooks/useReportIsArchived'; import {putOnHold} from '@libs/actions/IOU'; import type {OnboardingTaskLinks} from '@libs/actions/Welcome/OnboardingFlow'; @@ -6951,38 +6952,47 @@ describe('ReportUtils', () => { }); describe('getReportStatusTranslation', () => { + const mockTranslate: LocaleContextProps['translate'] = (path, ...params) => translate(CONST.LOCALES.EN, path, ...params); + it('should return "Draft" for state 0, status 0', () => { - expect(getReportStatusTranslation(CONST.REPORT.STATE_NUM.OPEN, CONST.REPORT.STATUS_NUM.OPEN)).toBe(translate(CONST.LOCALES.EN, 'common.draft')); + const result = getReportStatusTranslation({stateNum: CONST.REPORT.STATE_NUM.OPEN, statusNum: CONST.REPORT.STATUS_NUM.OPEN, translate: mockTranslate}); + expect(result).toBe(mockTranslate('common.draft')); }); it('should return "Outstanding" for state 1, status 1', () => { - expect(getReportStatusTranslation(CONST.REPORT.STATE_NUM.SUBMITTED, CONST.REPORT.STATUS_NUM.SUBMITTED)).toBe(translate(CONST.LOCALES.EN, 'common.outstanding')); + const result = getReportStatusTranslation({stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, translate: mockTranslate}); + expect(result).toBe(mockTranslate('common.outstanding')); }); it('should return "Done" for state 2, status 2', () => { - expect(getReportStatusTranslation(CONST.REPORT.STATE_NUM.APPROVED, CONST.REPORT.STATUS_NUM.CLOSED)).toBe(translate(CONST.LOCALES.EN, 'common.done')); + const result = getReportStatusTranslation({stateNum: CONST.REPORT.STATE_NUM.APPROVED, statusNum: CONST.REPORT.STATUS_NUM.CLOSED, translate: mockTranslate}); + expect(result).toBe(mockTranslate('common.done')); }); it('should return "Approved" for state 2, status 3', () => { - expect(getReportStatusTranslation(CONST.REPORT.STATE_NUM.APPROVED, CONST.REPORT.STATUS_NUM.APPROVED)).toBe(translate(CONST.LOCALES.EN, 'iou.approved')); + const result = getReportStatusTranslation({stateNum: CONST.REPORT.STATE_NUM.APPROVED, statusNum: CONST.REPORT.STATUS_NUM.APPROVED, translate: mockTranslate}); + expect(result).toBe(mockTranslate('iou.approved')); }); it('should return "Paid" for state 2, status 4', () => { - expect(getReportStatusTranslation(CONST.REPORT.STATE_NUM.APPROVED, CONST.REPORT.STATUS_NUM.REIMBURSED)).toBe(translate(CONST.LOCALES.EN, 'iou.settledExpensify')); + const result = getReportStatusTranslation({stateNum: CONST.REPORT.STATE_NUM.APPROVED, statusNum: CONST.REPORT.STATUS_NUM.REIMBURSED, translate: mockTranslate}); + expect(result).toBe(mockTranslate('iou.settledExpensify')); }); it('should return "Paid" for state 3, status 4', () => { - expect(getReportStatusTranslation(CONST.REPORT.STATE_NUM.BILLING, CONST.REPORT.STATUS_NUM.REIMBURSED)).toBe(translate(CONST.LOCALES.EN, 'iou.settledExpensify')); + const result = getReportStatusTranslation({stateNum: CONST.REPORT.STATE_NUM.BILLING, statusNum: CONST.REPORT.STATUS_NUM.REIMBURSED, translate: mockTranslate}); + expect(result).toBe(mockTranslate('iou.settledExpensify')); }); it('should return "Paid" for state 6, status 4', () => { - expect(getReportStatusTranslation(CONST.REPORT.STATE_NUM.AUTOREIMBURSED, CONST.REPORT.STATUS_NUM.REIMBURSED)).toBe(translate(CONST.LOCALES.EN, 'iou.settledExpensify')); + const result = getReportStatusTranslation({stateNum: CONST.REPORT.STATE_NUM.AUTOREIMBURSED, statusNum: CONST.REPORT.STATUS_NUM.REIMBURSED, translate: mockTranslate}); + expect(result).toBe(mockTranslate('iou.settledExpensify')); }); it('should return an empty string when stateNum or statusNum is undefined', () => { - expect(getReportStatusTranslation(undefined, undefined)).toBe(''); - expect(getReportStatusTranslation(CONST.REPORT.STATE_NUM.OPEN, undefined)).toBe(''); - expect(getReportStatusTranslation(undefined, CONST.REPORT.STATUS_NUM.OPEN)).toBe(''); + expect(getReportStatusTranslation({stateNum: undefined, statusNum: undefined, translate: mockTranslate})).toBe(''); + expect(getReportStatusTranslation({stateNum: CONST.REPORT.STATE_NUM.OPEN, statusNum: undefined, translate: mockTranslate})).toBe(''); + expect(getReportStatusTranslation({stateNum: undefined, statusNum: CONST.REPORT.STATUS_NUM.OPEN, translate: mockTranslate})).toBe(''); }); }); From 442cd4eb87cf1c287a442944c62b088e6493552c Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Wed, 5 Nov 2025 13:06:14 +0500 Subject: [PATCH 4/5] fix prettier --- tests/unit/ReportUtilsTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index fbe3e8d13fe9..9e889ccdd080 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -4,9 +4,9 @@ import {renderHook} from '@testing-library/react-native'; import {addDays, format as formatDate} from 'date-fns'; import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; +import type {LocaleContextProps} from '@components/LocaleContextProvider'; import OnyxListItemProvider from '@components/OnyxListItemProvider'; import usePolicyData from '@hooks/usePolicyData'; -import type {LocaleContextProps} from '@components/LocaleContextProvider'; import useReportIsArchived from '@hooks/useReportIsArchived'; import {putOnHold} from '@libs/actions/IOU'; import initOnyxDerivedValues from '@libs/actions/OnyxDerived'; From 483be620f1f9aaa1e1269bdd984372e3286ffa14 Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Thu, 6 Nov 2025 16:41:16 +0500 Subject: [PATCH 5/5] chore: add eslint-disable for deprecated warning --- tests/unit/ReportUtilsTest.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 07c63ca0b528..e6a949858446 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -8398,6 +8398,7 @@ describe('ReportUtils', () => { describe('getReportOrDraftReport', () => { const mockReportIDIndex = 1; const mockReportID = mockReportIDIndex.toString(); + // eslint-disable-next-line @typescript-eslint/no-deprecated const mockSearchReport: SearchReport = { ...createRandomReport(mockReportIDIndex, undefined), reportName: 'Search Report', @@ -8427,6 +8428,7 @@ describe('ReportUtils', () => { }); test('returns onyx report when search report is not found but onyx report exists', async () => { + // eslint-disable-next-line @typescript-eslint/no-deprecated const searchReports: SearchReport[] = []; await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${mockReportID}`, mockOnyxReport); const result = getReportOrDraftReport(mockReportID, searchReports); @@ -8434,6 +8436,7 @@ describe('ReportUtils', () => { }); test('returns draft report when neither search nor onyx report exists but draft exists', async () => { + // eslint-disable-next-line @typescript-eslint/no-deprecated const searchReports: SearchReport[] = []; await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_DRAFT}${mockReportID}`, mockDraftReport); const result = getReportOrDraftReport(mockReportID, searchReports); @@ -8441,12 +8444,14 @@ describe('ReportUtils', () => { }); test('returns fallback report when no other reports exist', () => { + // eslint-disable-next-line @typescript-eslint/no-deprecated const searchReports: SearchReport[] = []; const result = getReportOrDraftReport('unknownReportID', searchReports, mockFallbackReport); expect(result).toEqual(mockFallbackReport); }); test('returns undefined when no reports exist and no fallback provided', () => { + // eslint-disable-next-line @typescript-eslint/no-deprecated const searchReports: SearchReport[] = []; const result = getReportOrDraftReport(mockReportID, searchReports); expect(result).toBeUndefined(); @@ -8478,6 +8483,7 @@ describe('ReportUtils', () => { }); test('prioritizes onyx report over draft report when both exist', async () => { + // eslint-disable-next-line @typescript-eslint/no-deprecated const searchReports: SearchReport[] = []; await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${mockReportID}`, mockOnyxReport); await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_DRAFT}${mockReportID}`, mockDraftReport); @@ -8487,6 +8493,7 @@ describe('ReportUtils', () => { }); test('prioritizes draft report over fallback when both exist', async () => { + // eslint-disable-next-line @typescript-eslint/no-deprecated const searchReports: SearchReport[] = []; await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_DRAFT}${mockReportID}`, mockDraftReport); const result = getReportOrDraftReport(mockReportID, searchReports, mockFallbackReport);