Skip to content
3 changes: 2 additions & 1 deletion src/components/AddExistingExpenseFooter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ type AddExistingExpenseFooterProps = {
};

function AddExistingExpenseFooter({selectedIds, report, reportToConfirm, policy, policyCategories, errorMessage, setErrorMessage}: AddExistingExpenseFooterProps) {
const {translate} = useLocalize();
const {translate, formatPhoneNumber} = useLocalize();
const styles = useThemeStyles();
const {isBetaEnabled} = usePermissions();
const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
Expand Down Expand Up @@ -92,6 +92,7 @@ function AddExistingExpenseFooter({selectedIds, report, reportToConfirm, policy,
selfDMReportActions,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
});
} else {
changeTransactionsReport({
Expand Down
4 changes: 4 additions & 0 deletions src/hooks/useDeleteTransactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import {useCurrencyListActions} from './useCurrencyList';
import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails';
import useDelegateAccountID from './useDelegateAccountID';
import useEnvironment from './useEnvironment';
import useLocalize from './useLocalize';
import useNetwork from './useNetwork';
import useOnyx from './useOnyx';
import usePermissions from './usePermissions';
Expand Down Expand Up @@ -110,6 +111,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
const restrictedActionPolicyID = useRestrictedActionPolicyID(policy);
const {isOffline} = useNetwork();
const {isProduction} = useEnvironment();
const {formatPhoneNumber} = useLocalize();

const getSplitExpenseEditTransactionOnDelete = useCallback(
(transactionIDs: string[]): Transaction | undefined => {
Expand Down Expand Up @@ -342,6 +344,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
isOffline,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
});
}

Expand Down Expand Up @@ -420,6 +423,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
personalPolicy?.outputCurrency,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
getCurrencyDecimals,
getCurrencySymbol,
],
Expand Down
5 changes: 4 additions & 1 deletion src/libs/IOUAmountSubmission.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type {LocalizedTranslate} from '@components/LocaleContextProvider';
import type {LocaleContextProps, LocalizedTranslate} from '@components/LocaleContextProvider';

import CONST from '@src/CONST';
import type {IOUAction, IOUType} from '@src/CONST';
Expand Down Expand Up @@ -78,6 +78,7 @@ type SubmitAmountArgs = {
amount: string;
paymentMethod?: PaymentMethodType;
translate: LocalizedTranslate;
formatPhoneNumber: LocaleContextProps['formatPhoneNumber'];

// Submit-time Onyx data — supplied by the screen via AmountSubmitDataSync so this module owns no subscriptions.
allPersonalDetails: OnyxEntry<OnyxTypes.PersonalDetailsList>;
Expand Down Expand Up @@ -324,6 +325,7 @@ function submitSkipConfirmationExpense(args: SubmitAmountArgs, ctx: SubmitAmount
action,
currentUserPersonalDetails,
isTrackIntentUser,
formatPhoneNumber,
} = args;
const {currentUserAccountID, currentUserEmail, existingTransactionID, isASAPSubmitBetaEnabled, newAmount: backendAmount} = ctx;

Expand Down Expand Up @@ -409,6 +411,7 @@ function submitSkipConfirmationExpense(args: SubmitAmountArgs, ctx: SubmitAmount
optimisticTransactionID,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
});
}
cleanupAfterSkipConfirmSubmit(overrides.shouldHandleNavigation, {
Expand Down
2 changes: 2 additions & 0 deletions src/libs/actions/IOU/Duplicate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -855,6 +855,7 @@ function duplicateExpenseTransaction({
shouldDeferAutoSubmit,
isTrackIntentUser,
delegateAccountID,
formatPhoneNumber,
};

// If no workspace is provided the expense should be unreported
Expand Down Expand Up @@ -1071,6 +1072,7 @@ function duplicateReport({
shouldDeferAutoSubmit: !isLastExpense,
isTrackIntentUser,
delegateAccountID,
formatPhoneNumber,
};

const result = createExpenseByType({
Expand Down
5 changes: 4 additions & 1 deletion src/libs/actions/IOU/MoneyRequest.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type {LocalizedTranslate} from '@components/LocaleContextProvider';
import type {LocaleContextProps, LocalizedTranslate} from '@components/LocaleContextProvider';

import type {CurrencyListActionsContextType} from '@hooks/useCurrencyList';

Expand Down Expand Up @@ -102,6 +102,7 @@ type CreateTransactionParams = {
currentUserLocalCurrency: string | undefined;
isTrackIntentUser: boolean | undefined;
delegateAccountID: number | undefined;
formatPhoneNumber: LocaleContextProps['formatPhoneNumber'];
};

function createTransaction({
Expand Down Expand Up @@ -132,6 +133,7 @@ function createTransaction({
currentUserLocalCurrency,
isTrackIntentUser,
delegateAccountID,
formatPhoneNumber,
}: CreateTransactionParams) {
const draftTransactionIDs = Object.keys(allTransactionDrafts ?? {});

Expand Down Expand Up @@ -240,6 +242,7 @@ function createTransaction({
optimisticTransactionID,
isTrackIntentUser,
delegateAccountID,
formatPhoneNumber,
});
}
}
Expand Down
6 changes: 5 additions & 1 deletion src/libs/actions/IOU/MoneyRequestBuilder.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import type {LocaleContextProps} from '@components/LocaleContextProvider';

import DateUtils from '@libs/DateUtils';
import {getMicroSecondOnyxErrorObject, getMicroSecondOnyxErrorWithTranslationKey} from '@libs/ErrorUtils';
import {isLocalFile} from '@libs/fileDownload/FileUtils';
import type {MinimalTransaction} from '@libs/Formula';
import {updateIOUOwnerAndTotal} from '@libs/IOUUtils';
import {formatPhoneNumber} from '@libs/LocalePhoneNumber';
import {translateLocal} from '@libs/Localize';
import {buildOptimisticNextStep} from '@libs/NextStepUtils';
import {rand64} from '@libs/NumberUtils';
Expand Down Expand Up @@ -190,6 +191,7 @@ type RequestMoneyInformation = {
shouldDeferAutoSubmit?: boolean;
delegateAccountID: number | undefined;
isTrackIntentUser: boolean | undefined;
formatPhoneNumber: LocaleContextProps['formatPhoneNumber'];
};

type MoneyRequestInformationParams = {
Expand Down Expand Up @@ -225,6 +227,7 @@ type MoneyRequestInformationParams = {
personalDetails: OnyxEntry<OnyxTypes.PersonalDetailsList>;
isTrackIntentUser: boolean | undefined;
delegateAccountID: number | undefined;
formatPhoneNumber: LocaleContextProps['formatPhoneNumber'];
};

type MoneyRequestOptimisticParams = {
Expand Down Expand Up @@ -1267,6 +1270,7 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma
betas,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
} = moneyRequestInformation;
const {payeeAccountID = currentUserAccountIDParam, payeeEmail = currentUserEmailParam, participant} = participantParams;
const {policy, policyCategories, policyTagList, policyRecentlyUsedCategories, policyRecentlyUsedTags} = policyParams;
Expand Down
1 change: 1 addition & 0 deletions src/libs/actions/IOU/Split.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2178,6 +2178,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest
delegateAccountID,
isTrackIntentUser,
optimisticChatReportID,
formatPhoneNumber,
});

onyxData = moneyRequestOnyxData;
Expand Down
5 changes: 5 additions & 0 deletions src/libs/actions/IOU/SplitTransactionUpdate.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type {LocaleContextProps} from '@components/LocaleContextProvider';
import type {SearchActionsContextValue, SearchStateContextValue} from '@components/Search/types';

import {write as apiWrite} from '@libs/API';
Expand Down Expand Up @@ -118,6 +119,7 @@ type UpdateSplitTransactionsParams = {
isOffline: boolean;
delegateAccountID: number | undefined;
isTrackIntentUser: boolean | undefined;
formatPhoneNumber: LocaleContextProps['formatPhoneNumber'];
};

/**
Expand Down Expand Up @@ -198,6 +200,7 @@ function updateSplitTransactions({
isOffline,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
}: UpdateSplitTransactionsParams) {
const parentTransactionReport = getReportOrDraftReport(transactionReport?.parentReportID);
// For selfDM-origin splits the caller can't resolve a real `expenseReport` (the draft/source
Expand Down Expand Up @@ -660,6 +663,7 @@ function updateSplitTransactions({
personalDetails,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
} as MoneyRequestInformationParams;

if (isReverseSplitOperation) {
Expand Down Expand Up @@ -774,6 +778,7 @@ function updateSplitTransactions({
personalDetails,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
});

let updateMoneyRequestParamsOnyxData: OnyxData<UpdateMoneyRequestDataKeys> = {};
Expand Down
7 changes: 7 additions & 0 deletions src/libs/actions/IOU/TrackExpense.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import ReceiptGeneric from '@assets/images/receipt-generic.png';

import type {LocaleContextProps} from '@components/LocaleContextProvider';

import * as API from '@libs/API';
import type {AddTrackedExpenseToPolicyParams, CreateWorkspaceParams, DeleteMoneyRequestParams, RequestMoneyParams, ShareTrackedExpenseParams, TrackExpenseParams} from '@libs/API/parameters';
import {WRITE_COMMANDS} from '@libs/API/types';
Expand Down Expand Up @@ -1654,6 +1656,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation): {iouRep
shouldDeferAutoSubmit,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
} = requestMoneyInformation;
const {payeeAccountID} = participantParams;
const parsedComment = getParsedComment(transactionParams.comment ?? '');
Expand Down Expand Up @@ -1764,6 +1767,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation): {iouRep
personalDetails,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
});
const activeReportID = isMoneyRequestReport ? report?.reportID : chatReport.reportID;

Expand Down Expand Up @@ -1956,6 +1960,7 @@ function convertBulkTrackedExpensesToIOU({
selfDMReportActions,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
}: {
transactions: OnyxTypes.Transaction[];
iouReport: OnyxEntry<OnyxTypes.Report>;
Expand All @@ -1972,6 +1977,7 @@ function convertBulkTrackedExpensesToIOU({
selfDMReportActions: OnyxEntry<OnyxTypes.ReportActions>;
delegateAccountID: number | undefined;
isTrackIntentUser: boolean | undefined;
formatPhoneNumber: LocaleContextProps['formatPhoneNumber'];
}) {
const iouReportID = iouReport?.reportID;

Expand Down Expand Up @@ -2092,6 +2098,7 @@ function convertBulkTrackedExpensesToIOU({
},
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
});

const isDistanceRequest = isDistanceRequestTransactionUtils(transaction);
Expand Down
3 changes: 2 additions & 1 deletion src/pages/Share/SubmitDetailsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ function SubmitDetailsPage({
},
}: ShareDetailsPageProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const {translate, formatPhoneNumber} = useLocalize();
const delegateAccountID = useDelegateAccountID();
const [unknownUserDetails] = useOnyx(ONYXKEYS.SHARE_UNKNOWN_USER_DETAILS);
const [personalDetails] = useOnyx(`${ONYXKEYS.PERSONAL_DETAILS_LIST}`);
Expand Down Expand Up @@ -376,6 +376,7 @@ function SubmitDetailsPage({
optimisticTransactionID,
isTrackIntentUser,
delegateAccountID,
formatPhoneNumber,
});
}
cleanupAndNavigateAfterExpenseCreate({
Expand Down
3 changes: 2 additions & 1 deletion src/pages/iou/SplitExpensePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ const TAB_NAVIGATOR_HEIGHT_LANDSCAPE = variables.tabSelectorButtonHeight + varia

function SplitExpensePage({route}: SplitExpensePageProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const {translate, formatPhoneNumber} = useLocalize();
const delegateAccountID = useDelegateAccountID();

const {reportID, transactionID, splitExpenseTransactionID, backTo} = route.params;
Expand Down Expand Up @@ -400,6 +400,7 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
isOffline,
delegateAccountID,
isTrackIntentUser,
formatPhoneNumber,
});
};

Expand Down
3 changes: 2 additions & 1 deletion src/pages/iou/request/step/IOURequestStepAmount.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ function IOURequestStepAmount({
transaction,
shouldKeepUserInput = false,
}: IOURequestStepAmountProps) {
const {translate} = useLocalize();
const {translate, formatPhoneNumber} = useLocalize();
const {getCurrencyDecimals} = useCurrencyListActions();
const currentUserPersonalDetails = useCurrentUserPersonalDetails();
const [isCurrencyPickerVisible, setIsCurrencyPickerVisible] = useState(false);
Expand Down Expand Up @@ -251,6 +251,7 @@ function IOURequestStepAmount({
navigateBack: saveAndNavigateBack,
amount,
paymentMethod,
formatPhoneNumber,
isTrackIntentUser,
policyTags,
reportPolicyTags,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,7 @@ function ScanSkipConfirmation({report, action, iouType, reportID, transactionID,
currentUserLocalCurrency: currentUserPersonalDetails.localCurrencyCode ?? CONST.CURRENCY.USD,
isTrackIntentUser,
delegateAccountID,
formatPhoneNumber,
};

const scanDestinationReportID = iouType === CONST.IOU.TYPE.TRACK ? (report?.reportID ?? selfDMReport?.reportID) : report?.reportID;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,7 @@ function useExpenseSubmission(params: UseExpenseSubmissionParams) {
personalDetails,
isTrackIntentUser,
delegateAccountID,
formatPhoneNumber,
});
existingIOUReport = iouReport;
if (!iouReport) {
Expand Down
39 changes: 38 additions & 1 deletion tests/actions/IOU/BuildOnyxDataForMoneyRequestTest.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {buildOnyxDataForMoneyRequest} from '@libs/actions/IOU/MoneyRequestBuilder';
import {buildOnyxDataForMoneyRequest, getMoneyRequestInformation} from '@libs/actions/IOU/MoneyRequestBuilder';
import {getOriginalMessage} from '@libs/ReportActionsUtils';
import type {OptimisticCreatedReportAction, OptimisticIOUReportAction} from '@libs/ReportUtils';

Expand Down Expand Up @@ -475,4 +475,41 @@ describe('buildOnyxDataForMoneyRequest', () => {
expect((chatReportEntry?.value as Partial<Report>)?.iouReportID).toBeUndefined();
});
});

it('uses the injected formatter for optimistic new-chat personal detail display name', () => {
const mockFormatPhoneNumber = jest.fn((phoneNumber: string) => `formatted:${phoneNumber}`);
const result = getMoneyRequestInformation({
parentChatReport: undefined,
participantParams: {
payeeAccountID: CURRENT_USER_ACCOUNT_ID,
payeeEmail: CURRENT_USER_EMAIL,
participant: {
accountID: PAYER_ACCOUNT_ID,
login: '+15551234567',
},
},
transactionParams: {
amount: 1000,
currency: CONST.CURRENCY.USD,
created: '2024-01-01',
merchant: 'Test Merchant',
},
betas: [],
isASAPSubmitBetaEnabled: false,
currentUserAccountIDParam: CURRENT_USER_ACCOUNT_ID,
currentUserEmailParam: CURRENT_USER_EMAIL,
transactionViolations: {},
quickAction: undefined,
policyRecentlyUsedCurrencies: [],
personalDetails: {},
delegateAccountID: undefined,
isTrackIntentUser: false,
formatPhoneNumber: mockFormatPhoneNumber,
});

const personalDetailsEntry = result.onyxData.optimisticData?.find((entry) => entry.key === ONYXKEYS.PERSONAL_DETAILS_LIST);

expect(mockFormatPhoneNumber).toHaveBeenCalledWith('+15551234567');
expect((personalDetailsEntry?.value as Record<number, {displayName: string}>)?.[PAYER_ACCOUNT_ID]?.displayName).toBe('formatted:+15551234567');
});
});
2 changes: 2 additions & 0 deletions tests/actions/IOU/GetMoneyRequestInformationTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type {Beta, PolicyTagLists, Report} from '@src/types/onyx';

import Onyx from 'react-native-onyx';

import {formatPhoneNumber} from '../../utils/TestHelper';
import waitForBatchedUpdates from '../../utils/waitForBatchedUpdates';

jest.mock('@src/libs/Navigation/Navigation', () => ({
Expand Down Expand Up @@ -70,6 +71,7 @@ const baseParams = {
personalDetails: {},
delegateAccountID: undefined,
isTrackIntentUser: false,
formatPhoneNumber,
} as const;

describe('getMoneyRequestInformation', () => {
Expand Down
Loading
Loading