From 946d54055d29d2ecfe71ac61dede7a70ec7ac1e5 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Mon, 20 Jul 2026 23:58:15 +0300 Subject: [PATCH 1/4] fix attendee merge issue --- src/hooks/useReceiptScanDrop.tsx | 2 -- src/hooks/useResetIOUType.ts | 3 --- src/hooks/useSearchBulkActions.ts | 14 +++++++++++- src/hooks/useSelectedTransactionsActions.ts | 3 +++ src/libs/MergeTransactionUtils.ts | 9 ++++++-- src/libs/actions/IOU/MoneyRequest.ts | 9 ++------ src/libs/actions/MergeTransaction.ts | 22 ++++++++++++++++++- src/libs/actions/TransactionEdit.ts | 7 ++---- src/pages/Share/SubmitDetailsPage.tsx | 1 - .../TransactionMerge/DetailsReviewPage.tsx | 4 ++++ .../MergeTransactionsListContent.tsx | 17 ++++++++++---- .../TransactionMerge/ReceiptReviewPage.tsx | 5 +++++ .../ReportActionCompose/useReceiptDrop.ts | 2 -- .../utils/buildReceiptFiles.ts | 1 - tests/actions/IOU/MoneyRequestSettersTest.ts | 6 ----- 15 files changed, 70 insertions(+), 35 deletions(-) diff --git a/src/hooks/useReceiptScanDrop.tsx b/src/hooks/useReceiptScanDrop.tsx index 5e411efe86a4..3909f553b5e3 100644 --- a/src/hooks/useReceiptScanDrop.tsx +++ b/src/hooks/useReceiptScanDrop.tsx @@ -58,7 +58,6 @@ function useReceiptScanDrop() { parentReport: undefined, newIouRequestType: CONST.IOU.REQUEST_TYPE.SCAN, currentDate, - currentUserPersonalDetails, hasOnlyPersonalPolicies, draftTransactionIDs, }); @@ -72,7 +71,6 @@ function useReceiptScanDrop() { ? (initialTransaction as Partial) : buildOptimisticTransactionAndCreateDraft({ initialTransaction: initialTransaction as Partial, - currentUserPersonalDetails, reportID: newReportID, }); const transactionID = transaction.transactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID; diff --git a/src/hooks/useResetIOUType.ts b/src/hooks/useResetIOUType.ts index 13ae257fc4ed..7053681b8baa 100644 --- a/src/hooks/useResetIOUType.ts +++ b/src/hooks/useResetIOUType.ts @@ -17,7 +17,6 @@ import {validTransactionDraftIDsSelector} from '@selectors/TransactionDraft'; import {useRef} from 'react'; import {Keyboard} from 'react-native'; -import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails'; import useDefaultParticipants from './useDefaultParticipants'; import useOdometerDraftHydrator from './useOdometerDraftHydrator'; import useOnyx from './useOnyx'; @@ -84,7 +83,6 @@ function useResetIOUType({ const [draftTransactionIDs] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, {selector: validTransactionDraftIDsSelector}); const personalPolicy = usePersonalPolicy(); - const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const hydrateOdometerOnLanding = useOdometerDraftHydrator({ transaction, @@ -135,7 +133,6 @@ function useResetIOUType({ parentReport, currentDate, lastSelectedDistanceRates, - currentUserPersonalDetails, hasOnlyPersonalPolicies: hasOnlyPersonalPolicies ?? true, draftTransactionIDs, defaultParticipants: isSelfDMDefault ? undefined : defaultParticipants, diff --git a/src/hooks/useSearchBulkActions.ts b/src/hooks/useSearchBulkActions.ts index 6e70828aa668..0f8ff20303a5 100644 --- a/src/hooks/useSearchBulkActions.ts +++ b/src/hooks/useSearchBulkActions.ts @@ -2024,7 +2024,19 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) { text: translate('common.merge'), icon: expensifyIcons.ArrowCollapse, value: CONST.SEARCH.BULK_ACTION_TYPES.MERGE, - onSelected: () => setupMergeTransactionDataAndNavigate(transactionID, searchedTransactions, localeCompare, getCurrencyDecimals, reports, false, true), + onSelected: () => + setupMergeTransactionDataAndNavigate( + transactionID, + searchedTransactions, + localeCompare, + getCurrencyDecimals, + reports, + false, + true, + undefined, + accountID, + personalDetails, + ), }); } } diff --git a/src/hooks/useSelectedTransactionsActions.ts b/src/hooks/useSelectedTransactionsActions.ts index 4c282f351f99..830123e7bbe4 100644 --- a/src/hooks/useSelectedTransactionsActions.ts +++ b/src/hooks/useSelectedTransactionsActions.ts @@ -128,6 +128,7 @@ function useSelectedTransactionsActions({ const {isBetaEnabled} = usePermissions(); const {deleteTransactions, shouldOpenSplitExpenseEditFlowOnDelete} = useDeleteTransactions({report, reportActions, policy}); const {login, accountID: currentUserAccountID} = useCurrentUserPersonalDetails(); + const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); const defaultExpensePolicy = useDefaultExpensePolicy(); const {isProduction} = useEnvironment(); @@ -472,6 +473,8 @@ function useSelectedTransactionsActions({ false, isOnSearch, selectedTransactionsList.length > 1 ? [policy, policy] : undefined, + currentUserAccountID, + personalDetails, ), }); } diff --git a/src/libs/MergeTransactionUtils.ts b/src/libs/MergeTransactionUtils.ts index 8f5bf7215178..a5cf273c0872 100644 --- a/src/libs/MergeTransactionUtils.ts +++ b/src/libs/MergeTransactionUtils.ts @@ -225,12 +225,17 @@ function getMergeableDataAndConflictFields( searchReports: Array> = [], targetTransactionPolicy?: OnyxEntry, sourceTransactionPolicy?: OnyxEntry, + targetReportOwnerAsAttendee?: Attendee, + sourceReportOwnerAsAttendee?: Attendee, ) { const conflictFields: string[] = []; const mergeableData: Record = {}; - const targetTransactionDetails = getTransactionDetails(targetTransaction); - const sourceTransactionDetails = getTransactionDetails(sourceTransaction); + // Resolve the report-owner fallback the same way the display path (buildMergeFieldsData) does, so an expense + // with no stored attendee is compared as [owner] instead of [] and doesn't produce a false attendee conflict + // against an expense whose attendee is that same owner. + const targetTransactionDetails = getTransactionDetails(targetTransaction, undefined, undefined, undefined, undefined, targetReportOwnerAsAttendee); + const sourceTransactionDetails = getTransactionDetails(sourceTransaction, undefined, undefined, undefined, undefined, sourceReportOwnerAsAttendee); for (const field of getMergeFields(targetTransaction)) { const targetValue = getMergeFieldValue(targetTransactionDetails, targetTransaction, field); diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index f5e26f4eb45e..d692e9707a6f 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -4,7 +4,7 @@ import {WRITE_COMMANDS} from '@libs/API/types'; import DateUtils from '@libs/DateUtils'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; import {getGPSRoutes, getGPSWaypoints} from '@libs/GPSDraftDetailsUtils'; -import {formatCurrentUserToAttendee, getExistingTransactionID} from '@libs/IOUUtils'; +import {getExistingTransactionID} from '@libs/IOUUtils'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils'; @@ -55,7 +55,6 @@ import type { } from '@src/types/onyx'; import type {ReportAttributesDerivedValue} from '@src/types/onyx/DerivedValues'; import type {Accountant, Attendee, Participant} from '@src/types/onyx/IOU'; -import type {CurrentUserPersonalDetails} from '@src/types/onyx/PersonalDetails'; import type {Unit} from '@src/types/onyx/Policy'; import type {Comment, Receipt} from '@src/types/onyx/Transaction'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; @@ -271,7 +270,6 @@ type InitMoneyRequestParams = { parentReport: OnyxEntry; currentDate: string | undefined; lastSelectedDistanceRates?: OnyxEntry; - currentUserPersonalDetails: CurrentUserPersonalDetails; isTrackDistanceExpense?: boolean; hasOnlyPersonalPolicies: boolean; draftTransactionIDs?: string[]; @@ -302,7 +300,6 @@ function initMoneyRequest({ parentReport, currentDate, lastSelectedDistanceRates, - currentUserPersonalDetails, hasOnlyPersonalPolicies, draftTransactionIDs, defaultParticipants, @@ -331,9 +328,7 @@ function initMoneyRequest({ return; } - const comment: Comment = { - attendees: formatCurrentUserToAttendee(currentUserPersonalDetails), - }; + const comment: Comment = {}; let requestCategory: string | null = null; // Set up initial distance expense state diff --git a/src/libs/actions/MergeTransaction.ts b/src/libs/actions/MergeTransaction.ts index c9c8b6d94906..25779d1f0ba0 100644 --- a/src/libs/actions/MergeTransaction.ts +++ b/src/libs/actions/MergeTransaction.ts @@ -28,12 +28,13 @@ import { } from '@libs/ReportUtils'; import CONST from '@src/CONST'; -import {isDistanceRequest, isTransactionPendingDelete} from '@src/libs/TransactionUtils'; +import {getReportOwnerAccountIDAsAttendee, getReportOwnerAsAttendee, isDistanceRequest, isTransactionPendingDelete} from '@src/libs/TransactionUtils'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type { CardList, MergeTransaction, + PersonalDetailsList, Policy, PolicyCategories, PolicyTagLists, @@ -43,6 +44,7 @@ import type { Transaction, TransactionViolations, } from '@src/types/onyx'; +import type {Attendee} from '@src/types/onyx/IOU'; import type {OnyxCollection, OnyxEntry, OnyxMergeInput, OnyxUpdate} from 'react-native-onyx'; @@ -55,6 +57,20 @@ import {getCleanUpTransactionThreadReportOnyxData} from './IOU/DeleteMoneyReques import {getDeleteTrackExpenseInformation} from './IOU/TrackExpense'; import {getUpdateMoneyRequestParams, getUpdateTrackExpenseParams} from './IOU/UpdateMoneyRequest'; +/** + * Resolve a transaction's report owner as a default attendee, mirroring the `useReportOwnerAsAttendee` hook so the + * non-React merge entry point can apply the same empty-attendee fallback the details/receipt pages use. The Onyx data + * is passed in by the caller rather than read from a module subscription. + */ +function getReportOwnerAsAttendeeForTransaction( + transaction: OnyxEntry, + currentUserAccountID: number | undefined, + personalDetails: OnyxEntry, +): Attendee | undefined { + const ownerAccountID = getReportOwnerAccountIDAsAttendee(transaction, currentUserAccountID); + return getReportOwnerAsAttendee(ownerAccountID ? (personalDetails?.[ownerAccountID] ?? undefined) : undefined); +} + /** * Setup merge transaction data for merging flow */ @@ -78,6 +94,8 @@ function setupMergeTransactionDataAndNavigate( isSelectingSourceTransaction?: boolean, isOnSearch?: boolean, policies?: Array>, + currentUserAccountID?: number, + personalDetails?: OnyxEntry, ) { if (!transactions.length || transactions.length > 2) { return; @@ -126,6 +144,8 @@ function setupMergeTransactionDataAndNavigate( searchReports, targetTransactionPolicy, sourceTransactionPolicy, + getReportOwnerAsAttendeeForTransaction(targetTransaction, currentUserAccountID, personalDetails), + getReportOwnerAsAttendeeForTransaction(sourceTransaction, currentUserAccountID, personalDetails), ); if (!conflictFields.length) { // If there are no conflict fields, we should set mergeable data and navigate to the confirmation page diff --git a/src/libs/actions/TransactionEdit.ts b/src/libs/actions/TransactionEdit.ts index adee65d7fefe..52d6f73bc2a4 100644 --- a/src/libs/actions/TransactionEdit.ts +++ b/src/libs/actions/TransactionEdit.ts @@ -1,9 +1,8 @@ -import {formatCurrentUserToAttendee} from '@libs/IOUUtils'; import revokeOdometerImageUri from '@libs/OdometerUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {PersonalDetails, Transaction} from '@src/types/onyx'; +import type {Transaction} from '@src/types/onyx'; import type {Connection, OnyxEntry} from 'react-native-onyx'; @@ -170,18 +169,16 @@ function removeTransactionReceipt(transactionID: string | undefined) { type BuildOptimisticTransactionParams = { initialTransaction: Partial; - currentUserPersonalDetails: PersonalDetails; reportID: string; }; -function buildOptimisticTransactionAndCreateDraft({initialTransaction, currentUserPersonalDetails, reportID}: BuildOptimisticTransactionParams): Transaction { +function buildOptimisticTransactionAndCreateDraft({initialTransaction, reportID}: BuildOptimisticTransactionParams): Transaction { const newTransactionID = generateTransactionID(); const {currency, iouRequestType, isFromGlobalCreate, isFromFloatingActionButton} = initialTransaction ?? {}; const newTransaction = { amount: 0, created: format(new Date(), 'yyyy-MM-dd'), currency, - comment: {attendees: formatCurrentUserToAttendee(currentUserPersonalDetails)}, iouRequestType, reportID, transactionID: newTransactionID, diff --git a/src/pages/Share/SubmitDetailsPage.tsx b/src/pages/Share/SubmitDetailsPage.tsx index 03ffde5e6c1b..2e4dfd39de9b 100644 --- a/src/pages/Share/SubmitDetailsPage.tsx +++ b/src/pages/Share/SubmitDetailsPage.tsx @@ -173,7 +173,6 @@ function SubmitDetailsPage({ report, parentReport, currentDate, - currentUserPersonalDetails, hasOnlyPersonalPolicies, draftTransactionIDs, }); diff --git a/src/pages/TransactionMerge/DetailsReviewPage.tsx b/src/pages/TransactionMerge/DetailsReviewPage.tsx index ea1cfbd92617..89bc4cf5d5de 100644 --- a/src/pages/TransactionMerge/DetailsReviewPage.tsx +++ b/src/pages/TransactionMerge/DetailsReviewPage.tsx @@ -74,6 +74,8 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) { [targetTransactionReport, sourceTransactionReport], targetTransactionPolicy, sourceTransactionPolicy, + targetReportOwnerAsAttendee, + sourceReportOwnerAsAttendee, ); setMergeTransactionKey(transactionID, mergeableData); @@ -88,6 +90,8 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) { targetTransactionPolicy, sourceTransactionPolicy, getCurrencyDecimals, + targetReportOwnerAsAttendee, + sourceReportOwnerAsAttendee, ]); // Handle selection diff --git a/src/pages/TransactionMerge/MergeTransactionsListContent.tsx b/src/pages/TransactionMerge/MergeTransactionsListContent.tsx index bd299a0b1f60..7e84ce4a9897 100644 --- a/src/pages/TransactionMerge/MergeTransactionsListContent.tsx +++ b/src/pages/TransactionMerge/MergeTransactionsListContent.tsx @@ -48,6 +48,7 @@ function MergeTransactionsListContent({transactionID, mergeTransaction}: MergeTr const [searchValue, debouncedSearchValue, setSearchValue] = useDebouncedState(''); const [session] = useOnyx(ONYXKEYS.SESSION); + const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); const currentUserLogin = session?.email; const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION); const {isOffline} = useNetwork(); @@ -163,10 +164,18 @@ function MergeTransactionsListContent({transactionID, mergeTransaction}: MergeTr } const reports = targetTransactionReport && sourceTransactionReport ? [targetTransactionReport, sourceTransactionReport] : undefined; - setupMergeTransactionDataAndNavigate(transactionID, [targetTransaction, sourceTransaction], localeCompare, getCurrencyDecimals, reports, true, undefined, [ - targetTransactionPolicy, - sourceTransactionPolicy, - ]); + setupMergeTransactionDataAndNavigate( + transactionID, + [targetTransaction, sourceTransaction], + localeCompare, + getCurrencyDecimals, + reports, + true, + undefined, + [targetTransactionPolicy, sourceTransactionPolicy], + session?.accountID, + personalDetails, + ); }; const confirmButtonOptions = { diff --git a/src/pages/TransactionMerge/ReceiptReviewPage.tsx b/src/pages/TransactionMerge/ReceiptReviewPage.tsx index 3ee2da873d06..f967f4d87b02 100644 --- a/src/pages/TransactionMerge/ReceiptReviewPage.tsx +++ b/src/pages/TransactionMerge/ReceiptReviewPage.tsx @@ -11,6 +11,7 @@ import {useCurrencyListActions} from '@hooks/useCurrencyList'; import useLocalize from '@hooks/useLocalize'; import useMergeTransactions from '@hooks/useMergeTransactions'; import useOnyx from '@hooks/useOnyx'; +import useReportOwnerAsAttendee from '@hooks/useReportOwnerAsAttendee'; import useThemeStyles from '@hooks/useThemeStyles'; import {setMergeTransactionKey} from '@libs/actions/MergeTransaction'; @@ -43,6 +44,8 @@ function ReceiptReviewPage({route}: ReceiptReviewPageProps) { const [mergeTransaction, mergeTransactionMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.MERGE_TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`); const {targetTransaction, sourceTransaction, targetTransactionPolicy, sourceTransactionPolicy} = useMergeTransactions({mergeTransaction}); + const targetReportOwnerAsAttendee = useReportOwnerAsAttendee(targetTransaction); + const sourceReportOwnerAsAttendee = useReportOwnerAsAttendee(sourceTransaction); const transactions = [targetTransaction, sourceTransaction].filter((transaction): transaction is Transaction => !!transaction); @@ -63,6 +66,8 @@ function ReceiptReviewPage({route}: ReceiptReviewPageProps) { [], targetTransactionPolicy, sourceTransactionPolicy, + targetReportOwnerAsAttendee, + sourceReportOwnerAsAttendee, ); if (!conflictFields.length) { // If there are no conflict fields, we should set mergeable data and navigate to the confirmation page diff --git a/src/pages/inbox/report/ReportActionCompose/useReceiptDrop.ts b/src/pages/inbox/report/ReportActionCompose/useReceiptDrop.ts index 1f385749dc74..c670e620d5b0 100644 --- a/src/pages/inbox/report/ReportActionCompose/useReceiptDrop.ts +++ b/src/pages/inbox/report/ReportActionCompose/useReceiptDrop.ts @@ -74,7 +74,6 @@ function useReceiptDrop({reportID, report, shouldAddOrReplaceReceipt, transactio report, parentReport: newParentReport, currentDate, - currentUserPersonalDetails, hasOnlyPersonalPolicies, draftTransactionIDs, }); @@ -86,7 +85,6 @@ function useReceiptDrop({reportID, report, shouldAddOrReplaceReceipt, transactio ? (initialTransaction as Partial) : buildOptimisticTransactionAndCreateDraft({ initialTransaction: initialTransaction as Partial, - currentUserPersonalDetails, reportID, }); const newTransactionID = newTransaction?.transactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID; diff --git a/src/pages/iou/request/step/IOURequestStepScan/utils/buildReceiptFiles.ts b/src/pages/iou/request/step/IOURequestStepScan/utils/buildReceiptFiles.ts index a9689a1fb4c2..f1abde6a86fa 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/utils/buildReceiptFiles.ts +++ b/src/pages/iou/request/step/IOURequestStepScan/utils/buildReceiptFiles.ts @@ -67,7 +67,6 @@ function buildReceiptFiles({ ? initialTransaction : buildOptimisticTransactionAndCreateDraft({ initialTransaction: initialTransaction as Partial, - currentUserPersonalDetails, reportID, }); diff --git a/tests/actions/IOU/MoneyRequestSettersTest.ts b/tests/actions/IOU/MoneyRequestSettersTest.ts index 94fd54d88c8c..c168228cde12 100644 --- a/tests/actions/IOU/MoneyRequestSettersTest.ts +++ b/tests/actions/IOU/MoneyRequestSettersTest.ts @@ -562,7 +562,6 @@ describe('actions/IOU', () => { report: fakeReport, parentReport: fakeParentReport, currentDate, - currentUserPersonalDetails, hasOnlyPersonalPolicies: false, draftTransactionIDs: [], }); @@ -585,7 +584,6 @@ describe('actions/IOU', () => { report: fakeReport, parentReport: fakeParentReport, currentDate, - currentUserPersonalDetails, hasOnlyPersonalPolicies: false, draftTransactionIDs: [], }); @@ -609,7 +607,6 @@ describe('actions/IOU', () => { report: fakeReport, parentReport: fakeParentReport, currentDate, - currentUserPersonalDetails, hasOnlyPersonalPolicies: false, draftTransactionIDs: [], }); @@ -643,7 +640,6 @@ describe('actions/IOU', () => { report: fakeReport, parentReport: fakeParentReport, currentDate, - currentUserPersonalDetails, hasOnlyPersonalPolicies: false, draftTransactionIDs: [otherDraftTransactionID], }); @@ -682,7 +678,6 @@ describe('actions/IOU', () => { report: fakeReport, parentReport: fakeParentReport, currentDate, - currentUserPersonalDetails, hasOnlyPersonalPolicies: false, draftTransactionIDs: [otherDraftTransactionID, CONST.IOU.OPTIMISTIC_TRANSACTION_ID], }); @@ -722,7 +717,6 @@ describe('actions/IOU', () => { report: fakeReport, parentReport: fakeParentReport, currentDate, - currentUserPersonalDetails, hasOnlyPersonalPolicies: false, draftTransactionIDs: [draftTransactionID1, draftTransactionID2], }); From 529b8a790e55459266d42d79c900e8d97bf252cf Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Tue, 21 Jul 2026 16:12:20 +0300 Subject: [PATCH 2/4] fix lint --- tests/actions/IOU/MoneyRequestSettersTest.ts | 20 +------------------ .../useSelectedTransactionsActions.test.ts | 13 +++++++++++- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/tests/actions/IOU/MoneyRequestSettersTest.ts b/tests/actions/IOU/MoneyRequestSettersTest.ts index c168228cde12..5f7a0274a7d2 100644 --- a/tests/actions/IOU/MoneyRequestSettersTest.ts +++ b/tests/actions/IOU/MoneyRequestSettersTest.ts @@ -20,14 +20,12 @@ import OnyxUpdateManager from '@src/libs/actions/OnyxUpdateManager'; import DateUtils from '@src/libs/DateUtils'; import ONYXKEYS from '@src/ONYXKEYS'; import type {LastSelectedDistanceRates, Policy, Report} from '@src/types/onyx'; -import type {CurrentUserPersonalDetails} from '@src/types/onyx/PersonalDetails'; import type Transaction from '@src/types/onyx/Transaction'; import type {OnyxEntry} from 'react-native-onyx'; /* eslint-disable @typescript-eslint/no-unsafe-assignment */ import {format} from 'date-fns'; -import {SafeString} from 'expensify-common'; import Onyx from 'react-native-onyx'; import currencyList from '../../unit/currencyList.json'; @@ -127,14 +125,6 @@ const RORY_ACCOUNT_ID = 3; OnyxUpdateManager(); describe('actions/IOU', () => { - const currentUserPersonalDetails: CurrentUserPersonalDetails = { - ...createPersonalDetails(RORY_ACCOUNT_ID), - login: RORY_EMAIL, - email: RORY_EMAIL, - displayName: RORY_EMAIL, - avatar: 'https://example.com/avatar.jpg', - }; - beforeAll(() => { Onyx.init({ keys: ONYXKEYS, @@ -523,15 +513,7 @@ describe('actions/IOU', () => { }; const transactionResult: Transaction = { amount: 0, - comment: { - attendees: [ - { - email: currentUserPersonalDetails.email ?? '', - avatarUrl: SafeString(currentUserPersonalDetails.avatar) ?? '', - displayName: currentUserPersonalDetails.displayName ?? '', - }, - ], - }, + comment: {}, created: '2025-04-01', currency: 'USD', iouRequestType: 'manual', diff --git a/tests/unit/hooks/useSelectedTransactionsActions.test.ts b/tests/unit/hooks/useSelectedTransactionsActions.test.ts index c342d5671dff..d88d0c78aa31 100644 --- a/tests/unit/hooks/useSelectedTransactionsActions.test.ts +++ b/tests/unit/hooks/useSelectedTransactionsActions.test.ts @@ -959,6 +959,17 @@ describe('useSelectedTransactionsActions', () => { mergeOption?.onSelected?.(); - expect(setupMergeTransactionDataAndNavigate).toHaveBeenCalledWith(transaction.transactionID, [transaction], mockLocalCompare, mockGetCurrencyDecimals, [], false, false, undefined); + expect(setupMergeTransactionDataAndNavigate).toHaveBeenCalledWith( + transaction.transactionID, + [transaction], + mockLocalCompare, + mockGetCurrencyDecimals, + [], + false, + false, + undefined, + CURRENT_USER_ACCOUNT_ID, + undefined, + ); }); }); From 8373d0cc5ca6fab0d3b161bd97ed094d1b99facb Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Tue, 21 Jul 2026 16:48:37 +0300 Subject: [PATCH 3/4] lint fix --- .../step/IOURequestStepScan/components/ScanFromReport.tsx | 1 - .../step/IOURequestStepScan/components/ScanGlobalCreate.tsx | 3 +-- .../IOURequestStepScan/components/ScanSkipConfirmation.tsx | 1 - .../request/step/IOURequestStepScan/utils/buildReceiptFiles.ts | 3 --- tests/actions/IOU/MoneyRequestSettersTest.ts | 1 - 5 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepScan/components/ScanFromReport.tsx b/src/pages/iou/request/step/IOURequestStepScan/components/ScanFromReport.tsx index 8b23e8b949b7..4c8a3dbc278f 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/components/ScanFromReport.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/components/ScanFromReport.tsx @@ -69,7 +69,6 @@ function ScanFromReport({report, iouType, reportID, transactionID, transaction, getFileSource, initialTransaction: transaction, initialTransactionID: transactionID, - currentUserPersonalDetails, reportID, shouldAcceptMultipleFiles: true, isMultiScanEnabled, diff --git a/src/pages/iou/request/step/IOURequestStepScan/components/ScanGlobalCreate.tsx b/src/pages/iou/request/step/IOURequestStepScan/components/ScanGlobalCreate.tsx index cee4ed5dd559..28a68ada5e65 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/components/ScanGlobalCreate.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/components/ScanGlobalCreate.tsx @@ -58,7 +58,7 @@ function ScanGlobalCreate({iouType, backToReport, ...innerProps}: ScanGlobalCrea type ScanGlobalCreateInnerProps = Omit; -function ScanGlobalCreateInner({reportID, transactionID, transaction, currentUserPersonalDetails}: ScanGlobalCreateInnerProps) { +function ScanGlobalCreateInner({reportID, transactionID, transaction}: ScanGlobalCreateInnerProps) { const navigateGlobalCreate = useNavigateGlobalCreate(); const [draftTransactionIDs] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, { selector: validTransactionDraftIDsSelector, @@ -76,7 +76,6 @@ function ScanGlobalCreateInner({reportID, transactionID, transaction, currentUse getFileSource, initialTransaction: transaction, initialTransactionID: transactionID, - currentUserPersonalDetails, reportID, shouldAcceptMultipleFiles: true, isMultiScanEnabled, diff --git a/src/pages/iou/request/step/IOURequestStepScan/components/ScanSkipConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepScan/components/ScanSkipConfirmation.tsx index a3e90a130f0e..e988db56b20e 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/components/ScanSkipConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/components/ScanSkipConfirmation.tsx @@ -373,7 +373,6 @@ function ScanSkipConfirmation({report, action, iouType, reportID, transactionID, getFileSource, initialTransaction: transaction, initialTransactionID: transactionID, - currentUserPersonalDetails, reportID, shouldAcceptMultipleFiles: true, isMultiScanEnabled, diff --git a/src/pages/iou/request/step/IOURequestStepScan/utils/buildReceiptFiles.ts b/src/pages/iou/request/step/IOURequestStepScan/utils/buildReceiptFiles.ts index f1abde6a86fa..975ea2c48826 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/utils/buildReceiptFiles.ts +++ b/src/pages/iou/request/step/IOURequestStepScan/utils/buildReceiptFiles.ts @@ -7,7 +7,6 @@ import type {ReceiptFile} from '@pages/iou/request/step/IOURequestStepScan/types import {setMoneyRequestReceipt} from '@userActions/IOU/Receipt'; import {buildOptimisticTransactionAndCreateDraft, removeDraftTransactionsByIDs} from '@userActions/TransactionEdit'; -import type {CurrentUserPersonalDetails} from '@src/types/onyx/PersonalDetails'; import type Transaction from '@src/types/onyx/Transaction'; import type {FileObject} from '@src/types/utils/Attachment'; @@ -18,7 +17,6 @@ type BuildReceiptFilesParams = { getFileSource: (file: FileObject) => string; initialTransaction: OnyxEntry; initialTransactionID: string; - currentUserPersonalDetails: CurrentUserPersonalDetails; reportID: string; shouldAcceptMultipleFiles: boolean; isMultiScanEnabled: boolean; @@ -43,7 +41,6 @@ function buildReceiptFiles({ getFileSource, initialTransaction, initialTransactionID, - currentUserPersonalDetails, reportID, shouldAcceptMultipleFiles, isMultiScanEnabled, diff --git a/tests/actions/IOU/MoneyRequestSettersTest.ts b/tests/actions/IOU/MoneyRequestSettersTest.ts index 5f7a0274a7d2..0f0be99d87c6 100644 --- a/tests/actions/IOU/MoneyRequestSettersTest.ts +++ b/tests/actions/IOU/MoneyRequestSettersTest.ts @@ -29,7 +29,6 @@ import {format} from 'date-fns'; import Onyx from 'react-native-onyx'; import currencyList from '../../unit/currencyList.json'; -import createPersonalDetails from '../../utils/collections/personalDetails'; import createRandomPolicy, {createCategoryTaxExpenseRules} from '../../utils/collections/policies'; import {createRandomReport} from '../../utils/collections/reports'; import createRandomTransaction from '../../utils/collections/transaction'; From 3ff0afa17d646aef1eaf90f70ef31f83b27fdba0 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Tue, 21 Jul 2026 17:00:53 +0300 Subject: [PATCH 4/4] fix lint --- src/pages/Share/SubmitDetailsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Share/SubmitDetailsPage.tsx b/src/pages/Share/SubmitDetailsPage.tsx index 2e4dfd39de9b..c48ebcf42568 100644 --- a/src/pages/Share/SubmitDetailsPage.tsx +++ b/src/pages/Share/SubmitDetailsPage.tsx @@ -179,7 +179,7 @@ function SubmitDetailsPage({ // Populate transaction.participants so IOURequestStepReport can highlight the destination (mirrors other expense flows). setMoneyRequestParticipantsFromReport(CONST.IOU.OPTIMISTIC_TRANSACTION_ID, report, currentUserPersonalDetails.accountID); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [reportOrAccountID, policy, personalPolicy, report, parentReport, currentDate, currentUserPersonalDetails, hasOnlyPersonalPolicies]); + }, [reportOrAccountID, policy, personalPolicy, report, parentReport, currentDate, currentUserPersonalDetails.accountID, hasOnlyPersonalPolicies]); const sharedFileSource = currentAttachment?.content ?? fileUri; const sharedFileName = getFileName(currentAttachment?.content ?? '') || fileName;