From 25c0f3cf2025656be3bad9cd92d1dcb258e0c142 Mon Sep 17 00:00:00 2001 From: allgandalf Date: Wed, 23 Jul 2025 15:29:41 +0530 Subject: [PATCH 1/9] Padd formatPhoneNumber as Prop to getPersonalDetailsOnyxDataForOptimisticUsers --- src/components/LocaleContextProvider.tsx | 4 +++- src/libs/PersonalDetailsUtils.ts | 13 ++++++++---- src/libs/actions/IOU.ts | 4 ++-- src/libs/actions/Policy/Member.ts | 21 ++++++++++++++++--- src/libs/actions/Report.ts | 20 ++++++++++-------- src/pages/InviteReportParticipantsPage.tsx | 4 ++-- .../BaseOnboardingWorkspaceInvite.tsx | 6 +++--- src/pages/ReportChangeWorkspacePage.tsx | 8 +++---- src/pages/RoomInvitePage.tsx | 6 +++--- .../workspace/WorkspaceInviteMessagePage.tsx | 11 ++++++++-- tests/actions/PolicyMemberTest.ts | 10 ++++----- tests/actions/ReportTest.ts | 11 +++++++--- tests/utils/TestHelper.ts | 8 +++++++ 13 files changed, 85 insertions(+), 41 deletions(-) diff --git a/src/components/LocaleContextProvider.tsx b/src/components/LocaleContextProvider.tsx index 4ef2453a6005..fc4f455a1323 100644 --- a/src/components/LocaleContextProvider.tsx +++ b/src/components/LocaleContextProvider.tsx @@ -53,6 +53,8 @@ type LocaleContextProps = { preferredLocale: Locale | undefined; }; +type FormatPhoneNumberType = LocaleContextProps['formatPhoneNumber']; + const LocaleContext = createContext({ translate: () => '', numberFormat: () => '', @@ -166,4 +168,4 @@ LocaleContextProvider.displayName = 'LocaleContextProvider'; export {LocaleContext, LocaleContextProvider}; -export type {Locale, LocaleContextProps}; +export type {Locale, LocaleContextProps, FormatPhoneNumberType}; diff --git a/src/libs/PersonalDetailsUtils.ts b/src/libs/PersonalDetailsUtils.ts index 4dfe2bf7f07b..4e139fb700d7 100644 --- a/src/libs/PersonalDetailsUtils.ts +++ b/src/libs/PersonalDetailsUtils.ts @@ -1,13 +1,14 @@ import {Str} from 'expensify-common'; import type {OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; +import type {FormatPhoneNumberType} from '@components/LocaleContextProvider'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {OnyxInputOrEntry, PersonalDetails, PersonalDetailsList, PrivatePersonalDetails} from '@src/types/onyx'; import type {Address} from '@src/types/onyx/PrivatePersonalDetails'; import type {OnyxData} from '@src/types/onyx/Request'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import {formatPhoneNumber} from './LocalePhoneNumber'; +import {formatPhoneNumber as formatPhoneNumberUtils} from './LocalePhoneNumber'; import {translateLocal} from './Localize'; import {areEmailsFromSamePrivateDomain} from './LoginUtils'; import {parsePhoneNumber} from './PhoneNumber'; @@ -219,7 +220,11 @@ function getNewAccountIDsAndLogins(logins: string[], accountIDs: number[]) { * Given a list of logins and accountIDs, return Onyx data for users with no existing personal details stored. These users might be brand new or unknown. * They will have an "optimistic" accountID that must be cleaned up later. */ -function getPersonalDetailsOnyxDataForOptimisticUsers(newLogins: string[], newAccountIDs: number[]): Required> { +function getPersonalDetailsOnyxDataForOptimisticUsers( + newLogins: string[], + newAccountIDs: number[], + formatPhoneNumber: FormatPhoneNumberType, +): Required> { const personalDetailsNew: PersonalDetailsList = {}; const personalDetailsCleanup: PersonalDetailsList = {}; @@ -325,7 +330,7 @@ function getFormattedAddress(privatePersonalDetails: OnyxEntry | OnyxInputOrEntry): string { // If we have a number like +15857527441@expensify.sms then let's remove @expensify.sms and format it // so that the option looks cleaner in our UI. - const userLogin = formatPhoneNumber(login); + const userLogin = formatPhoneNumberUtils(login); if (!passedPersonalDetails) { return userLogin; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 53a321417c26..7696c0b0ec07 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -5313,7 +5313,7 @@ function shareTrackedExpense(trackedExpenseParams: TrackedExpenseParams) { optimisticData: addAccountantToWorkspaceOptimisticData, successData: addAccountantToWorkspaceSuccessData, failureData: addAccountantToWorkspaceFailureData, - } = buildAddMembersToWorkspaceOnyxData({[accountantEmail]: accountantAccountID}, policyID, policyMemberAccountIDs, CONST.POLICY.ROLE.ADMIN); + } = buildAddMembersToWorkspaceOnyxData({[accountantEmail]: accountantAccountID}, policyID, policyMemberAccountIDs, CONST.POLICY.ROLE.ADMIN, formatPhoneNumber); optimisticData?.push(...addAccountantToWorkspaceOptimisticData); successData?.push(...addAccountantToWorkspaceSuccessData); failureData?.push(...addAccountantToWorkspaceFailureData); @@ -5334,7 +5334,7 @@ function shareTrackedExpense(trackedExpenseParams: TrackedExpenseParams) { optimisticData: inviteAccountantToRoomOptimisticData, successData: inviteAccountantToRoomSuccessData, failureData: inviteAccountantToRoomFailureData, - } = buildInviteToRoomOnyxData(chatReportID, {[accountantEmail]: accountantAccountID}); + } = buildInviteToRoomOnyxData(chatReportID, {[accountantEmail]: accountantAccountID}, formatPhoneNumber); optimisticData?.push(...inviteAccountantToRoomOptimisticData); successData?.push(...inviteAccountantToRoomSuccessData); failureData?.push(...inviteAccountantToRoomFailureData); diff --git a/src/libs/actions/Policy/Member.ts b/src/libs/actions/Policy/Member.ts index fc4c83cb92b5..ad1516158b1a 100644 --- a/src/libs/actions/Policy/Member.ts +++ b/src/libs/actions/Policy/Member.ts @@ -1,6 +1,7 @@ import type {NullishDeep, OnyxCollection, OnyxCollectionInputValue, OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; +import type {FormatPhoneNumberType} from '@components/LocaleContextProvider'; import * as API from '@libs/API'; import type { AddMembersToWorkspaceParams, @@ -873,14 +874,20 @@ function clearWorkspaceOwnerChangeFlow(policyID: string) { }); } -function buildAddMembersToWorkspaceOnyxData(invitedEmailsToAccountIDs: InvitedEmailsToAccountIDs, policyID: string, policyMemberAccountIDs: number[], role: string) { +function buildAddMembersToWorkspaceOnyxData( + invitedEmailsToAccountIDs: InvitedEmailsToAccountIDs, + policyID: string, + policyMemberAccountIDs: number[], + role: string, + formatPhoneNumber: FormatPhoneNumberType, +) { const logins = Object.keys(invitedEmailsToAccountIDs).map((memberLogin) => PhoneNumber.addSMSDomainIfPhoneNumber(memberLogin)); const accountIDs = Object.values(invitedEmailsToAccountIDs); const policyKey = `${ONYXKEYS.COLLECTION.POLICY}${policyID}` as const; const {newAccountIDs, newLogins} = PersonalDetailsUtils.getNewAccountIDsAndLogins(logins, accountIDs); - const newPersonalDetailsOnyxData = PersonalDetailsUtils.getPersonalDetailsOnyxDataForOptimisticUsers(newLogins, newAccountIDs); + const newPersonalDetailsOnyxData = PersonalDetailsUtils.getPersonalDetailsOnyxDataForOptimisticUsers(newLogins, newAccountIDs, formatPhoneNumber); const announceRoomMembers = buildRoomMembersOnyxData(CONST.REPORT.CHAT_TYPE.POLICY_ANNOUNCE, policyID, accountIDs); const adminRoomMembers = buildRoomMembersOnyxData( @@ -967,12 +974,20 @@ function buildAddMembersToWorkspaceOnyxData(invitedEmailsToAccountIDs: InvitedEm * Adds members to the specified workspace/policyID * Please see https://github.com/Expensify/App/blob/main/README.md#Security for more details */ -function addMembersToWorkspace(invitedEmailsToAccountIDs: InvitedEmailsToAccountIDs, welcomeNote: string, policyID: string, policyMemberAccountIDs: number[], role: string) { +function addMembersToWorkspace( + invitedEmailsToAccountIDs: InvitedEmailsToAccountIDs, + welcomeNote: string, + policyID: string, + policyMemberAccountIDs: number[], + role: string, + formatPhoneNumber: FormatPhoneNumberType, +) { const {optimisticData, successData, failureData, optimisticAnnounceChat, membersChats, logins} = buildAddMembersToWorkspaceOnyxData( invitedEmailsToAccountIDs, policyID, policyMemberAccountIDs, role, + formatPhoneNumber, ); const params: AddMembersToWorkspaceParams = { diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 08647148b8bc..d61c761f96be 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -7,6 +7,7 @@ import type {NullishDeep, OnyxCollection, OnyxCollectionInputValue, OnyxEntry, O import Onyx from 'react-native-onyx'; import type {PartialDeep, ValueOf} from 'type-fest'; import type {Emoji} from '@assets/emojis/types'; +import type {FormatPhoneNumberType} from '@components/LocaleContextProvider'; import * as ActiveClientManager from '@libs/ActiveClientManager'; import addEncryptedAuthTokenToURL from '@libs/addEncryptedAuthTokenToURL'; import * as API from '@libs/API'; @@ -3690,7 +3691,7 @@ function leaveRoom(reportID: string, isWorkspaceMemberLeavingWorkspaceRoom = fal navigateToMostRecentReport(report); } -function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs) { +function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, formatPhoneNumber: FormatPhoneNumberType) { const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; const reportMetadata = getReportMetadata(reportID); const isGroupChat = isGroupChatReportUtils(report); @@ -3716,7 +3717,7 @@ function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs: {...report?.participants}, ); - const newPersonalDetailsOnyxData = PersonalDetailsUtils.getPersonalDetailsOnyxDataForOptimisticUsers(newLogins, newAccountIDs); + const newPersonalDetailsOnyxData = PersonalDetailsUtils.getPersonalDetailsOnyxDataForOptimisticUsers(newLogins, newAccountIDs, formatPhoneNumber); const pendingChatMembers = getPendingChatMembers(inviteeAccountIDs, reportMetadata?.pendingChatMembers ?? [], CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD); const newParticipantAccountCleanUp = newAccountIDs.reduce>((participantCleanUp, newAccountID) => { @@ -3789,8 +3790,8 @@ function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs: } /** Invites people to a room */ -function inviteToRoom(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs) { - const {optimisticData, successData, failureData, isGroupChat, inviteeEmails, newAccountIDs} = buildInviteToRoomOnyxData(reportID, inviteeEmailsToAccountIDs); +function inviteToRoom(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, formatPhoneNumber: FormatPhoneNumberType) { + const {optimisticData, successData, failureData, isGroupChat, inviteeEmails, newAccountIDs} = buildInviteToRoomOnyxData(reportID, inviteeEmailsToAccountIDs, formatPhoneNumber); if (isGroupChat) { const parameters: InviteToGroupChatParams = { @@ -3870,8 +3871,8 @@ function updateGroupChatMemberRoles(reportID: string, accountIDList: number[], r } /** Invites people to a group chat */ -function inviteToGroupChat(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs) { - inviteToRoom(reportID, inviteeEmailsToAccountIDs); +function inviteToGroupChat(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, formatPhoneNumber: FormatPhoneNumberType) { + inviteToRoom(reportID, inviteeEmailsToAccountIDs, formatPhoneNumber); } /** Removes people from a room @@ -5157,7 +5158,7 @@ function moveIOUReportToPolicy(reportID: string, policyID: string) { * @param reportID - The ID of the IOU report to move * @param policyID - The ID of the policy to move the report to */ -function moveIOUReportToPolicyAndInviteSubmitter(reportID: string, policyID: string) { +function moveIOUReportToPolicyAndInviteSubmitter(reportID: string, policyID: string, formatPhoneNumber: FormatPhoneNumberType) { const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850 // eslint-disable-next-line deprecation/deprecation @@ -5199,7 +5200,7 @@ function moveIOUReportToPolicyAndInviteSubmitter(reportID: string, policyID: str // Get personal details onyx data (similar to addMembersToWorkspace) const {newAccountIDs, newLogins} = PersonalDetailsUtils.getNewAccountIDsAndLogins([submitterLogin], [submitterAccountID]); - const newPersonalDetailsOnyxData = PersonalDetailsUtils.getPersonalDetailsOnyxDataForOptimisticUsers(newLogins, newAccountIDs); + const newPersonalDetailsOnyxData = PersonalDetailsUtils.getPersonalDetailsOnyxDataForOptimisticUsers(newLogins, newAccountIDs, formatPhoneNumber); // Build announce room members data for the new member const announceRoomMembers = buildRoomMembersOnyxData(CONST.REPORT.CHAT_TYPE.POLICY_ANNOUNCE, policyID, [submitterAccountID]); @@ -5721,7 +5722,7 @@ function changeReportPolicy(report: Report, policyID: string, reportNextStep?: R /** * Invites the submitter to the new report policy, changes the policy of a report and all its child reports, and moves the report to the new policy's expense chat */ -function changeReportPolicyAndInviteSubmitter(report: Report, policyID: string, employeeList: PolicyEmployeeList | undefined) { +function changeReportPolicyAndInviteSubmitter(report: Report, policyID: string, employeeList: PolicyEmployeeList | undefined, formatPhoneNumber: FormatPhoneNumberType) { if (!report.reportID || !policyID || report.policyID === policyID || !isExpenseReport(report) || !report.ownerAccountID) { return; } @@ -5737,6 +5738,7 @@ function changeReportPolicyAndInviteSubmitter(report: Report, policyID: string, policyID, policyMemberAccountIDs, CONST.POLICY.ROLE.USER, + formatPhoneNumber, ); const optimisticPolicyExpenseChatReportID = membersChats.reportCreationData[submitterEmail].reportID; const optimisticPolicyExpenseChatCreatedReportActionID = membersChats.reportCreationData[submitterEmail].reportActionID; diff --git a/src/pages/InviteReportParticipantsPage.tsx b/src/pages/InviteReportParticipantsPage.tsx index 71f77826c7ed..85f1e613e454 100644 --- a/src/pages/InviteReportParticipantsPage.tsx +++ b/src/pages/InviteReportParticipantsPage.tsx @@ -55,7 +55,7 @@ function InviteReportParticipantsPage({betas, report, didScreenTransitionEnd}: I }); const styles = useThemeStyles(); - const {translate} = useLocalize(); + const {translate, formatPhoneNumber} = useLocalize(); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); const [userSearchPhrase] = useOnyx(ONYXKEYS.ROOM_MEMBERS_USER_SEARCH_PHRASE, {canBeMissing: true}); const [searchValue, debouncedSearchTerm, setSearchValue] = useDebouncedState(userSearchPhrase ?? ''); @@ -198,7 +198,7 @@ function InviteReportParticipantsPage({betas, report, didScreenTransitionEnd}: I } invitedEmailsToAccountIDs[login] = accountID; }); - inviteToGroupChat(reportID, invitedEmailsToAccountIDs); + inviteToGroupChat(reportID, invitedEmailsToAccountIDs, formatPhoneNumber); goBack(); }, [selectedOptions, goBack, reportID, validate]); diff --git a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx index 7f34bd4d484e..ec8e3df2eaeb 100644 --- a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx +++ b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx @@ -43,7 +43,7 @@ type MembersSection = SectionListData>; function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWorkspaceInviteProps) { const styles = useThemeStyles(); - const {translate} = useLocalize(); + const {translate, formatPhoneNumber} = useLocalize(); const [onboardingPolicyID] = useOnyx(ONYXKEYS.ONBOARDING_POLICY_ID, {canBeMissing: true}); const [onboardingAdminsChatReportID] = useOnyx(ONYXKEYS.ONBOARDING_ADMINS_CHAT_REPORT_ID, {canBeMissing: true}); const policy = usePolicy(onboardingPolicyID); @@ -271,9 +271,9 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo invitedEmailsToAccountIDs[login] = Number(accountID); }); const policyMemberAccountIDs = Object.values(getMemberAccountIDsForWorkspace(policy?.employeeList, false, false)); - addMembersToWorkspace(invitedEmailsToAccountIDs, `${welcomeNoteSubject}\n\n${welcomeNote}`, onboardingPolicyID, policyMemberAccountIDs, CONST.POLICY.ROLE.USER); + addMembersToWorkspace(invitedEmailsToAccountIDs, `${welcomeNoteSubject}\n\n${welcomeNote}`, onboardingPolicyID, policyMemberAccountIDs, CONST.POLICY.ROLE.USER, formatPhoneNumber); completeOnboarding(); - }, [completeOnboarding, onboardingPolicyID, policy?.employeeList, selectedOptions, welcomeNote, welcomeNoteSubject]); + }, [completeOnboarding, onboardingPolicyID, policy?.employeeList, selectedOptions, welcomeNote, welcomeNoteSubject, formatPhoneNumber]); useEffect(() => { searchInServer(debouncedSearchTerm); diff --git a/src/pages/ReportChangeWorkspacePage.tsx b/src/pages/ReportChangeWorkspacePage.tsx index 80bf2a5375d0..9b8e0f61fe93 100644 --- a/src/pages/ReportChangeWorkspacePage.tsx +++ b/src/pages/ReportChangeWorkspacePage.tsx @@ -31,7 +31,7 @@ function ReportChangeWorkspacePage({report, route}: ReportChangeWorkspacePagePro const {isOffline} = useNetwork(); const styles = useThemeStyles(); const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState(''); - const {translate} = useLocalize(); + const {translate, formatPhoneNumber} = useLocalize(); const [policies, fetchStatus] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true}); const [reportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${reportID}`, {canBeMissing: true}); @@ -49,19 +49,19 @@ function ReportChangeWorkspacePage({report, route}: ReportChangeWorkspacePagePro // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850 // eslint-disable-next-line deprecation/deprecation if (isIOUReport(reportID) && isPolicyAdmin(getPolicy(policyID)) && report.ownerAccountID && !isPolicyMember(getLoginByAccountID(report.ownerAccountID), policyID)) { - moveIOUReportToPolicyAndInviteSubmitter(reportID, policyID); + moveIOUReportToPolicyAndInviteSubmitter(reportID, policyID, formatPhoneNumber); } else if (isIOUReport(reportID) && isPolicyMember(session?.email, policyID)) { moveIOUReportToPolicy(reportID, policyID); // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850 // eslint-disable-next-line deprecation/deprecation } else if (isExpenseReport(report) && isPolicyAdmin(getPolicy(policyID)) && report.ownerAccountID && !isPolicyMember(getLoginByAccountID(report.ownerAccountID), policyID)) { const employeeList = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.employeeList; - changeReportPolicyAndInviteSubmitter(report, policyID, employeeList); + changeReportPolicyAndInviteSubmitter(report, policyID, employeeList, formatPhoneNumber); } else { changeReportPolicy(report, policyID, reportNextStep); } }, - [session?.email, route.params, report, reportID, reportNextStep, policies], + [session?.email, route.params, report, reportID, reportNextStep, policies, formatPhoneNumber], ); const {sections, shouldShowNoResultsFoundMessage, shouldShowSearchInput} = useWorkspaceList({ diff --git a/src/pages/RoomInvitePage.tsx b/src/pages/RoomInvitePage.tsx index c45dee1f7d80..6499e08d5810 100644 --- a/src/pages/RoomInvitePage.tsx +++ b/src/pages/RoomInvitePage.tsx @@ -53,7 +53,7 @@ function RoomInvitePage({ }, }: RoomInvitePageProps) { const styles = useThemeStyles(); - const {translate} = useLocalize(); + const {translate, formatPhoneNumber} = useLocalize(); const [userSearchPhrase] = useOnyx(ONYXKEYS.ROOM_MEMBERS_USER_SEARCH_PHRASE, {canBeMissing: true}); const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState(userSearchPhrase ?? ''); const [selectedOptions, setSelectedOptions] = useState([]); @@ -203,11 +203,11 @@ function RoomInvitePage({ invitedEmailsToAccountIDs[login] = Number(accountID); }); if (reportID) { - inviteToRoom(reportID, invitedEmailsToAccountIDs); + inviteToRoom(reportID, invitedEmailsToAccountIDs, formatPhoneNumber); } clearUserSearchPhrase(); Navigation.goBack(backRoute); - }, [selectedOptions, backRoute, reportID, validate]); + }, [selectedOptions, backRoute, reportID, validate, formatPhoneNumber]); const goBack = useCallback(() => { Navigation.goBack(backRoute); diff --git a/src/pages/workspace/WorkspaceInviteMessagePage.tsx b/src/pages/workspace/WorkspaceInviteMessagePage.tsx index 6276855e1435..a1b8b40e90f1 100644 --- a/src/pages/workspace/WorkspaceInviteMessagePage.tsx +++ b/src/pages/workspace/WorkspaceInviteMessagePage.tsx @@ -48,7 +48,7 @@ type WorkspaceInviteMessagePageProps = WithPolicyAndFullscreenLoadingProps & function WorkspaceInviteMessagePage({policy, route, currentUserPersonalDetails}: WorkspaceInviteMessagePageProps) { const styles = useThemeStyles(); - const {translate} = useLocalize(); + const {translate, formatPhoneNumber} = useLocalize(); const [formData, formDataResult] = useOnyx(ONYXKEYS.FORMS.WORKSPACE_INVITE_MESSAGE_FORM_DRAFT, {canBeMissing: true}); const viewportOffsetTop = useViewportOffsetTop(); @@ -101,7 +101,14 @@ function WorkspaceInviteMessagePage({policy, route, currentUserPersonalDetails}: Keyboard.dismiss(); const policyMemberAccountIDs = Object.values(getMemberAccountIDsForWorkspace(policy?.employeeList, false, false)); // Please see https://github.com/Expensify/App/blob/main/README.md#Security for more details - addMembersToWorkspace(invitedEmailsToAccountIDsDraft ?? {}, `${welcomeNoteSubject}\n\n${welcomeNote}`, route.params.policyID, policyMemberAccountIDs, workspaceInviteRoleDraft); + addMembersToWorkspace( + invitedEmailsToAccountIDsDraft ?? {}, + `${welcomeNoteSubject}\n\n${welcomeNote}`, + route.params.policyID, + policyMemberAccountIDs, + workspaceInviteRoleDraft, + formatPhoneNumber, + ); setWorkspaceInviteMessageDraft(route.params.policyID, welcomeNote ?? null); clearDraftValues(ONYXKEYS.FORMS.WORKSPACE_INVITE_MESSAGE_FORM); if ((route.params?.backTo as string)?.endsWith('members')) { diff --git a/tests/actions/PolicyMemberTest.ts b/tests/actions/PolicyMemberTest.ts index f86100a41a71..92f4fe6e2fec 100644 --- a/tests/actions/PolicyMemberTest.ts +++ b/tests/actions/PolicyMemberTest.ts @@ -287,7 +287,7 @@ describe('actions/PolicyMember', () => { }); mockFetch?.pause?.(); - Member.addMembersToWorkspace({[newUserEmail]: 1234}, 'Welcome', policyID, [], CONST.POLICY.ROLE.USER); + Member.addMembersToWorkspace({[newUserEmail]: 1234}, 'Welcome', policyID, [], CONST.POLICY.ROLE.USER, TestHelper.formatPhoneNumber); await waitForBatchedUpdates(); @@ -337,9 +337,9 @@ describe('actions/PolicyMember', () => { }); // When adding a new admin, auditor, and user members - Member.addMembersToWorkspace({[adminEmail]: adminAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.ADMIN); - Member.addMembersToWorkspace({[auditorEmail]: auditorAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.AUDITOR); - Member.addMembersToWorkspace({[userEmail]: userAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.USER); + Member.addMembersToWorkspace({[adminEmail]: adminAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.ADMIN, TestHelper.formatPhoneNumber); + Member.addMembersToWorkspace({[auditorEmail]: auditorAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.AUDITOR, TestHelper.formatPhoneNumber); + Member.addMembersToWorkspace({[userEmail]: userAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.USER, TestHelper.formatPhoneNumber); await waitForBatchedUpdates(); @@ -388,7 +388,7 @@ describe('actions/PolicyMember', () => { }); // When adding the user to the workspace - Member.addMembersToWorkspace({[userEmail]: userAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.USER); + Member.addMembersToWorkspace({[userEmail]: userAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.USER, TestHelper.formatPhoneNumber); await waitForBatchedUpdates(); diff --git a/tests/actions/ReportTest.ts b/tests/actions/ReportTest.ts index d3e773a5cb19..eac2f8698fe8 100644 --- a/tests/actions/ReportTest.ts +++ b/tests/actions/ReportTest.ts @@ -1812,9 +1812,14 @@ describe('actions/Report', () => { }); // When moving to another workspace - Report.changeReportPolicyAndInviteSubmitter(expenseReport, '2', { - [adminEmail]: {role: CONST.POLICY.ROLE.ADMIN}, - }); + Report.changeReportPolicyAndInviteSubmitter( + expenseReport, + '2', + { + [adminEmail]: {role: CONST.POLICY.ROLE.ADMIN}, + }, + TestHelper.formatPhoneNumber, + ); await waitForBatchedUpdates(); // Then the expense report should not be archived anymore diff --git a/tests/utils/TestHelper.ts b/tests/utils/TestHelper.ts index 549b3ea97851..5a6ab8045756 100644 --- a/tests/utils/TestHelper.ts +++ b/tests/utils/TestHelper.ts @@ -4,6 +4,7 @@ import {Linking} from 'react-native'; import Onyx from 'react-native-onyx'; import type {ConnectOptions, OnyxKey} from 'react-native-onyx/dist/types'; import type {ApiCommand, ApiRequestCommandParameters} from '@libs/API/types'; +import {formatPhoneNumberWithCountryCode} from '@libs/LocalePhoneNumber'; import {translateLocal} from '@libs/Localize'; import Pusher from '@libs/Pusher'; import PusherConnectionManager from '@libs/PusherConnectionManager'; @@ -39,6 +40,12 @@ type FormData = { entries: () => Array<[string, string | Blob]>; }; +const countryCodeByIP = 1; + +function formatPhoneNumber(phoneNumber: string) { + return formatPhoneNumberWithCountryCode(phoneNumber, countryCodeByIP); +} + function setupApp() { beforeAll(() => { Linking.setInitialURL('https://new.expensify.com/'); @@ -363,4 +370,5 @@ export { navigateToSidebarOption, getOnyxData, getNavigateToChatHintRegex, + formatPhoneNumber, }; From d911f321ff0ba6a3aa5705b989af26e4e175164f Mon Sep 17 00:00:00 2001 From: allgandalf Date: Wed, 23 Jul 2025 16:10:44 +0530 Subject: [PATCH 2/9] add UT for getPersonalDetailsOnyxDataForOptimisticUsers --- tests/unit/libs/PersonalDetailsUtilsTest.ts | 58 +++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 tests/unit/libs/PersonalDetailsUtilsTest.ts diff --git a/tests/unit/libs/PersonalDetailsUtilsTest.ts b/tests/unit/libs/PersonalDetailsUtilsTest.ts new file mode 100644 index 000000000000..e185387a7223 --- /dev/null +++ b/tests/unit/libs/PersonalDetailsUtilsTest.ts @@ -0,0 +1,58 @@ +import Onyx from 'react-native-onyx'; +import {getPersonalDetailsOnyxDataForOptimisticUsers} from '@libs/PersonalDetailsUtils'; +import ONYXKEYS from '@src/ONYXKEYS'; +import {formatPhoneNumber} from '../../utils/TestHelper'; + +describe('PersonalDetailsUtils', () => { + beforeAll(() => { + Onyx.merge(ONYXKEYS.COUNTRY_CODE, 1); + }); + test('getPersonalDetailsOnyxDataForOptimisticUsers should return correct optimistic and finally data', () => { + const newLogins = ['3322076524', 'test2@test.com']; + const newAccountIDs = [1, 2]; + + // Call the function with the mock formatPhoneNumber + const result = getPersonalDetailsOnyxDataForOptimisticUsers(newLogins, newAccountIDs, formatPhoneNumber); + + // Construct the expected output based on the function's logic and the mock behavior. + const expected = { + optimisticData: [ + { + key: ONYXKEYS.PERSONAL_DETAILS_LIST, // Expecting 'personalDetailsList' + onyxMethod: 'merge', // Use string literal as expected + value: { + // eslint-disable-next-line @typescript-eslint/naming-convention + '1': { + // Use numeric key as per lint rule (no quotes) + accountID: 1, + displayName: '3322076524', // This comes from mockFormatPhoneNumber('test1@test.com') + isOptimisticPersonalDetail: true, + login: '3322076524', + }, + // eslint-disable-next-line @typescript-eslint/naming-convention + '2': { + accountID: 2, + displayName: 'test2@test.com', // This comes from mockFormatPhoneNumber('test2@test.com') + isOptimisticPersonalDetail: true, + login: 'test2@test.com', + }, + }, + }, + ], + finallyData: [ + { + key: ONYXKEYS.PERSONAL_DETAILS_LIST, // Expecting 'personalDetailsList' + onyxMethod: Onyx.METHOD.MERGE, // Expecting 'merge' + value: { + // eslint-disable-next-line @typescript-eslint/naming-convention + '1': null, // Cleanup for accountID 1 + // eslint-disable-next-line @typescript-eslint/naming-convention + '2': null, // Cleanup for accountID 2 + }, + }, + ], + }; + + expect(result).toEqual(expected); + }); +}); From 0320eb601c3e1a8934b693f69b51894e099b37b8 Mon Sep 17 00:00:00 2001 From: allgandalf Date: Wed, 23 Jul 2025 19:16:52 +0530 Subject: [PATCH 3/9] remove imports --- src/components/LocaleContextProvider.tsx | 4 +--- src/libs/PersonalDetailsUtils.ts | 4 ++-- src/libs/actions/Policy/Member.ts | 6 +++--- src/libs/actions/Report.ts | 12 ++++++------ 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/components/LocaleContextProvider.tsx b/src/components/LocaleContextProvider.tsx index fc4f455a1323..4ef2453a6005 100644 --- a/src/components/LocaleContextProvider.tsx +++ b/src/components/LocaleContextProvider.tsx @@ -53,8 +53,6 @@ type LocaleContextProps = { preferredLocale: Locale | undefined; }; -type FormatPhoneNumberType = LocaleContextProps['formatPhoneNumber']; - const LocaleContext = createContext({ translate: () => '', numberFormat: () => '', @@ -168,4 +166,4 @@ LocaleContextProvider.displayName = 'LocaleContextProvider'; export {LocaleContext, LocaleContextProvider}; -export type {Locale, LocaleContextProps, FormatPhoneNumberType}; +export type {Locale, LocaleContextProps}; diff --git a/src/libs/PersonalDetailsUtils.ts b/src/libs/PersonalDetailsUtils.ts index 4e139fb700d7..7568be651762 100644 --- a/src/libs/PersonalDetailsUtils.ts +++ b/src/libs/PersonalDetailsUtils.ts @@ -1,7 +1,7 @@ import {Str} from 'expensify-common'; import type {OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; -import type {FormatPhoneNumberType} from '@components/LocaleContextProvider'; +import type {LocaleContextProps} from '@components/LocaleContextProvider'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {OnyxInputOrEntry, PersonalDetails, PersonalDetailsList, PrivatePersonalDetails} from '@src/types/onyx'; @@ -223,7 +223,7 @@ function getNewAccountIDsAndLogins(logins: string[], accountIDs: number[]) { function getPersonalDetailsOnyxDataForOptimisticUsers( newLogins: string[], newAccountIDs: number[], - formatPhoneNumber: FormatPhoneNumberType, + formatPhoneNumber: LocaleContextProps['formatPhoneNumber'], ): Required> { const personalDetailsNew: PersonalDetailsList = {}; const personalDetailsCleanup: PersonalDetailsList = {}; diff --git a/src/libs/actions/Policy/Member.ts b/src/libs/actions/Policy/Member.ts index ad1516158b1a..8dc578a4abb6 100644 --- a/src/libs/actions/Policy/Member.ts +++ b/src/libs/actions/Policy/Member.ts @@ -1,7 +1,7 @@ import type {NullishDeep, OnyxCollection, OnyxCollectionInputValue, OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; -import type {FormatPhoneNumberType} from '@components/LocaleContextProvider'; +import type {LocaleContextProps} from '@components/LocaleContextProvider'; import * as API from '@libs/API'; import type { AddMembersToWorkspaceParams, @@ -879,7 +879,7 @@ function buildAddMembersToWorkspaceOnyxData( policyID: string, policyMemberAccountIDs: number[], role: string, - formatPhoneNumber: FormatPhoneNumberType, + formatPhoneNumber: LocaleContextProps['formatPhoneNumber'], ) { const logins = Object.keys(invitedEmailsToAccountIDs).map((memberLogin) => PhoneNumber.addSMSDomainIfPhoneNumber(memberLogin)); const accountIDs = Object.values(invitedEmailsToAccountIDs); @@ -980,7 +980,7 @@ function addMembersToWorkspace( policyID: string, policyMemberAccountIDs: number[], role: string, - formatPhoneNumber: FormatPhoneNumberType, + formatPhoneNumber: LocaleContextProps['formatPhoneNumber'], ) { const {optimisticData, successData, failureData, optimisticAnnounceChat, membersChats, logins} = buildAddMembersToWorkspaceOnyxData( invitedEmailsToAccountIDs, diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index d61c761f96be..b5f9b95cad74 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -7,7 +7,7 @@ import type {NullishDeep, OnyxCollection, OnyxCollectionInputValue, OnyxEntry, O import Onyx from 'react-native-onyx'; import type {PartialDeep, ValueOf} from 'type-fest'; import type {Emoji} from '@assets/emojis/types'; -import type {FormatPhoneNumberType} from '@components/LocaleContextProvider'; +import type {LocaleContextProps} from '@components/LocaleContextProvider'; import * as ActiveClientManager from '@libs/ActiveClientManager'; import addEncryptedAuthTokenToURL from '@libs/addEncryptedAuthTokenToURL'; import * as API from '@libs/API'; @@ -3691,7 +3691,7 @@ function leaveRoom(reportID: string, isWorkspaceMemberLeavingWorkspaceRoom = fal navigateToMostRecentReport(report); } -function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, formatPhoneNumber: FormatPhoneNumberType) { +function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, formatPhoneNumber: LocaleContextProps['formatPhoneNumber']) { const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; const reportMetadata = getReportMetadata(reportID); const isGroupChat = isGroupChatReportUtils(report); @@ -3790,7 +3790,7 @@ function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs: } /** Invites people to a room */ -function inviteToRoom(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, formatPhoneNumber: FormatPhoneNumberType) { +function inviteToRoom(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, formatPhoneNumber: LocaleContextProps['formatPhoneNumber']) { const {optimisticData, successData, failureData, isGroupChat, inviteeEmails, newAccountIDs} = buildInviteToRoomOnyxData(reportID, inviteeEmailsToAccountIDs, formatPhoneNumber); if (isGroupChat) { @@ -3871,7 +3871,7 @@ function updateGroupChatMemberRoles(reportID: string, accountIDList: number[], r } /** Invites people to a group chat */ -function inviteToGroupChat(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, formatPhoneNumber: FormatPhoneNumberType) { +function inviteToGroupChat(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, formatPhoneNumber: LocaleContextProps['formatPhoneNumber']) { inviteToRoom(reportID, inviteeEmailsToAccountIDs, formatPhoneNumber); } @@ -5158,7 +5158,7 @@ function moveIOUReportToPolicy(reportID: string, policyID: string) { * @param reportID - The ID of the IOU report to move * @param policyID - The ID of the policy to move the report to */ -function moveIOUReportToPolicyAndInviteSubmitter(reportID: string, policyID: string, formatPhoneNumber: FormatPhoneNumberType) { +function moveIOUReportToPolicyAndInviteSubmitter(reportID: string, policyID: string, formatPhoneNumber: LocaleContextProps['formatPhoneNumber']) { const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850 // eslint-disable-next-line deprecation/deprecation @@ -5722,7 +5722,7 @@ function changeReportPolicy(report: Report, policyID: string, reportNextStep?: R /** * Invites the submitter to the new report policy, changes the policy of a report and all its child reports, and moves the report to the new policy's expense chat */ -function changeReportPolicyAndInviteSubmitter(report: Report, policyID: string, employeeList: PolicyEmployeeList | undefined, formatPhoneNumber: FormatPhoneNumberType) { +function changeReportPolicyAndInviteSubmitter(report: Report, policyID: string, employeeList: PolicyEmployeeList | undefined, formatPhoneNumber: LocaleContextProps['formatPhoneNumber']) { if (!report.reportID || !policyID || report.policyID === policyID || !isExpenseReport(report) || !report.ownerAccountID) { return; } From bdda03e416066d4413892a18b1e875b81e767050 Mon Sep 17 00:00:00 2001 From: allgandalf Date: Wed, 23 Jul 2025 22:22:18 +0530 Subject: [PATCH 4/9] make Onyx merge call await and the function async --- tests/unit/libs/PersonalDetailsUtilsTest.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/unit/libs/PersonalDetailsUtilsTest.ts b/tests/unit/libs/PersonalDetailsUtilsTest.ts index e185387a7223..dd1dd75a3a00 100644 --- a/tests/unit/libs/PersonalDetailsUtilsTest.ts +++ b/tests/unit/libs/PersonalDetailsUtilsTest.ts @@ -4,9 +4,10 @@ import ONYXKEYS from '@src/ONYXKEYS'; import {formatPhoneNumber} from '../../utils/TestHelper'; describe('PersonalDetailsUtils', () => { - beforeAll(() => { - Onyx.merge(ONYXKEYS.COUNTRY_CODE, 1); + beforeAll(async () => { + await Onyx.merge(ONYXKEYS.COUNTRY_CODE, 1); }); + test('getPersonalDetailsOnyxDataForOptimisticUsers should return correct optimistic and finally data', () => { const newLogins = ['3322076524', 'test2@test.com']; const newAccountIDs = [1, 2]; From 4c3272277edd0d51259c37f0fdde2205c1f42a69 Mon Sep 17 00:00:00 2001 From: allgandalf Date: Wed, 23 Jul 2025 22:22:45 +0530 Subject: [PATCH 5/9] hardcode country code to 1 --- tests/utils/TestHelper.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/utils/TestHelper.ts b/tests/utils/TestHelper.ts index 5a6ab8045756..baa37128d567 100644 --- a/tests/utils/TestHelper.ts +++ b/tests/utils/TestHelper.ts @@ -40,10 +40,8 @@ type FormData = { entries: () => Array<[string, string | Blob]>; }; -const countryCodeByIP = 1; - function formatPhoneNumber(phoneNumber: string) { - return formatPhoneNumberWithCountryCode(phoneNumber, countryCodeByIP); + return formatPhoneNumberWithCountryCode(phoneNumber, 1); } function setupApp() { From 47f0e72027f25c59fb2b085c3275e6e274874f8c Mon Sep 17 00:00:00 2001 From: allgandalf Date: Wed, 23 Jul 2025 22:24:20 +0530 Subject: [PATCH 6/9] fix comments --- tests/unit/libs/PersonalDetailsUtilsTest.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/unit/libs/PersonalDetailsUtilsTest.ts b/tests/unit/libs/PersonalDetailsUtilsTest.ts index dd1dd75a3a00..c952423fce70 100644 --- a/tests/unit/libs/PersonalDetailsUtilsTest.ts +++ b/tests/unit/libs/PersonalDetailsUtilsTest.ts @@ -7,7 +7,7 @@ describe('PersonalDetailsUtils', () => { beforeAll(async () => { await Onyx.merge(ONYXKEYS.COUNTRY_CODE, 1); }); - + test('getPersonalDetailsOnyxDataForOptimisticUsers should return correct optimistic and finally data', () => { const newLogins = ['3322076524', 'test2@test.com']; const newAccountIDs = [1, 2]; @@ -19,21 +19,21 @@ describe('PersonalDetailsUtils', () => { const expected = { optimisticData: [ { - key: ONYXKEYS.PERSONAL_DETAILS_LIST, // Expecting 'personalDetailsList' - onyxMethod: 'merge', // Use string literal as expected + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + onyxMethod: 'merge', value: { // eslint-disable-next-line @typescript-eslint/naming-convention '1': { - // Use numeric key as per lint rule (no quotes) accountID: 1, - displayName: '3322076524', // This comes from mockFormatPhoneNumber('test1@test.com') + displayName: '3322076524', isOptimisticPersonalDetail: true, login: '3322076524', }, // eslint-disable-next-line @typescript-eslint/naming-convention '2': { accountID: 2, - displayName: 'test2@test.com', // This comes from mockFormatPhoneNumber('test2@test.com') + // This comes from mockFormatPhoneNumber('test2@test.com') + displayName: 'test2@test.com', isOptimisticPersonalDetail: true, login: 'test2@test.com', }, @@ -42,13 +42,13 @@ describe('PersonalDetailsUtils', () => { ], finallyData: [ { - key: ONYXKEYS.PERSONAL_DETAILS_LIST, // Expecting 'personalDetailsList' - onyxMethod: Onyx.METHOD.MERGE, // Expecting 'merge' + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + onyxMethod: Onyx.METHOD.MERGE, value: { // eslint-disable-next-line @typescript-eslint/naming-convention - '1': null, // Cleanup for accountID 1 + '1': null, // eslint-disable-next-line @typescript-eslint/naming-convention - '2': null, // Cleanup for accountID 2 + '2': null, }, }, ], From 92f80700198c9d85beab996e96f122960c92f02e Mon Sep 17 00:00:00 2001 From: allgandalf Date: Wed, 23 Jul 2025 22:26:16 +0530 Subject: [PATCH 7/9] fix prettier --- tests/unit/libs/PersonalDetailsUtilsTest.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/libs/PersonalDetailsUtilsTest.ts b/tests/unit/libs/PersonalDetailsUtilsTest.ts index c952423fce70..7ee452d5a1a5 100644 --- a/tests/unit/libs/PersonalDetailsUtilsTest.ts +++ b/tests/unit/libs/PersonalDetailsUtilsTest.ts @@ -42,13 +42,13 @@ describe('PersonalDetailsUtils', () => { ], finallyData: [ { - key: ONYXKEYS.PERSONAL_DETAILS_LIST, - onyxMethod: Onyx.METHOD.MERGE, + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + onyxMethod: Onyx.METHOD.MERGE, value: { // eslint-disable-next-line @typescript-eslint/naming-convention '1': null, // eslint-disable-next-line @typescript-eslint/naming-convention - '2': null, + '2': null, }, }, ], From 5e67fe13942286218f547872be9d2223fcccfec8 Mon Sep 17 00:00:00 2001 From: allgandalf Date: Thu, 24 Jul 2025 22:51:24 +0530 Subject: [PATCH 8/9] fix comments --- tests/unit/libs/PersonalDetailsUtilsTest.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/unit/libs/PersonalDetailsUtilsTest.ts b/tests/unit/libs/PersonalDetailsUtilsTest.ts index 7ee452d5a1a5..cfa6c8558557 100644 --- a/tests/unit/libs/PersonalDetailsUtilsTest.ts +++ b/tests/unit/libs/PersonalDetailsUtilsTest.ts @@ -12,10 +12,8 @@ describe('PersonalDetailsUtils', () => { const newLogins = ['3322076524', 'test2@test.com']; const newAccountIDs = [1, 2]; - // Call the function with the mock formatPhoneNumber const result = getPersonalDetailsOnyxDataForOptimisticUsers(newLogins, newAccountIDs, formatPhoneNumber); - // Construct the expected output based on the function's logic and the mock behavior. const expected = { optimisticData: [ { @@ -32,7 +30,6 @@ describe('PersonalDetailsUtils', () => { // eslint-disable-next-line @typescript-eslint/naming-convention '2': { accountID: 2, - // This comes from mockFormatPhoneNumber('test2@test.com') displayName: 'test2@test.com', isOptimisticPersonalDetail: true, login: 'test2@test.com', From 1a1ed1ce10de2484f5cd0cafbf92971f16e939f2 Mon Sep 17 00:00:00 2001 From: allgandalf Date: Sat, 26 Jul 2025 20:40:58 +0530 Subject: [PATCH 9/9] address reviewer comments --- tests/unit/libs/PersonalDetailsUtilsTest.ts | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/tests/unit/libs/PersonalDetailsUtilsTest.ts b/tests/unit/libs/PersonalDetailsUtilsTest.ts index cfa6c8558557..a521848ad961 100644 --- a/tests/unit/libs/PersonalDetailsUtilsTest.ts +++ b/tests/unit/libs/PersonalDetailsUtilsTest.ts @@ -4,16 +4,10 @@ import ONYXKEYS from '@src/ONYXKEYS'; import {formatPhoneNumber} from '../../utils/TestHelper'; describe('PersonalDetailsUtils', () => { - beforeAll(async () => { - await Onyx.merge(ONYXKEYS.COUNTRY_CODE, 1); - }); - test('getPersonalDetailsOnyxDataForOptimisticUsers should return correct optimistic and finally data', () => { - const newLogins = ['3322076524', 'test2@test.com']; - const newAccountIDs = [1, 2]; - + const newLogins = ['3322076524', 'test2@test.com', '+14185438090']; + const newAccountIDs = [1, 2, 3]; const result = getPersonalDetailsOnyxDataForOptimisticUsers(newLogins, newAccountIDs, formatPhoneNumber); - const expected = { optimisticData: [ { @@ -34,6 +28,13 @@ describe('PersonalDetailsUtils', () => { isOptimisticPersonalDetail: true, login: 'test2@test.com', }, + // eslint-disable-next-line @typescript-eslint/naming-convention + '3': { + accountID: 3, + displayName: '(418) 543-8090', + isOptimisticPersonalDetail: true, + login: '+14185438090', + }, }, }, ], @@ -46,11 +47,12 @@ describe('PersonalDetailsUtils', () => { '1': null, // eslint-disable-next-line @typescript-eslint/naming-convention '2': null, + // eslint-disable-next-line @typescript-eslint/naming-convention + '3': null, }, }, ], }; - expect(result).toEqual(expected); }); });