diff --git a/src/libs/PersonalDetailsUtils.ts b/src/libs/PersonalDetailsUtils.ts index 7568be651762..06d00b844836 100644 --- a/src/libs/PersonalDetailsUtils.ts +++ b/src/libs/PersonalDetailsUtils.ts @@ -328,9 +328,9 @@ function getFormattedAddress(privatePersonalDetails: OnyxEntry, g const mentionElements = targetAccountIDs.map((accountID): MemberChangeMessageUserMentionElement => { const personalDetail = personalDetails.find((personal) => personal.accountID === accountID); - const handleText = getEffectiveDisplayName(personalDetail) ?? translateLocal('common.hidden'); + const handleText = getEffectiveDisplayName(formatPhoneNumber, personalDetail) ?? translateLocal('common.hidden'); return { kind: 'userMention', @@ -1888,7 +1888,7 @@ function getActionableMentionWhisperMessage(reportAction: OnyxEntry { const personalDetail = personalDetails.find((personal) => personal.accountID === accountID); - const displayName = getEffectiveDisplayName(personalDetail); + const displayName = getEffectiveDisplayName(formatPhoneNumber, personalDetail); const handleText = isEmpty(displayName) ? translateLocal('common.hidden') : displayName; return `@${handleText}`; }); diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index d5a6faada348..536ee85087c7 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4818,7 +4818,7 @@ function getAdminRoomInvitedParticipants(parentReportAction: OnyxEntry { - const name = getEffectiveDisplayName(personalDetail); + const name = getEffectiveDisplayName(formatPhoneNumber, personalDetail); if (name && name?.length > 0) { return name; } diff --git a/tests/unit/libs/PersonalDetailsUtilsTest.ts b/tests/unit/libs/PersonalDetailsUtilsTest.ts index 49115a87cff2..5511066460b3 100644 --- a/tests/unit/libs/PersonalDetailsUtilsTest.ts +++ b/tests/unit/libs/PersonalDetailsUtilsTest.ts @@ -1,9 +1,98 @@ import Onyx from 'react-native-onyx'; -import {getPersonalDetailsOnyxDataForOptimisticUsers} from '@libs/PersonalDetailsUtils'; +import {getEffectiveDisplayName, getPersonalDetailsOnyxDataForOptimisticUsers} from '@libs/PersonalDetailsUtils'; import ONYXKEYS from '@src/ONYXKEYS'; +import type {PersonalDetails} from '@src/types/onyx'; import {formatPhoneNumber} from '../../utils/TestHelper'; describe('PersonalDetailsUtils', () => { + describe('getEffectiveDisplayName', () => { + test('should return undefined when personalDetail is undefined', () => { + const result = getEffectiveDisplayName(formatPhoneNumber, undefined); + expect(result).toBeUndefined(); + }); + + test('should return undefined when personalDetail has neither login nor displayName', () => { + const personalDetail: PersonalDetails = {accountID: 123}; + const result = getEffectiveDisplayName(formatPhoneNumber, personalDetail); + expect(result).toBeUndefined(); + }); + + test('should return displayName when login is empty or null but displayName exists', () => { + const personalDetail1: PersonalDetails = {accountID: 123, displayName: 'John Doe', login: ''}; + const personalDetail2: PersonalDetails = {accountID: 456, displayName: 'Jane Smith', login: null as unknown as string}; // Simulate null login + + let result = getEffectiveDisplayName(formatPhoneNumber, personalDetail1); + expect(result).toBe('John Doe'); + + result = getEffectiveDisplayName(formatPhoneNumber, personalDetail2); + expect(result).toBe('Jane Smith'); + }); + + test('should return login (email) when only login exists (not a phone number)', () => { + const personalDetail: PersonalDetails = {accountID: 123, login: 'john.doe@example.com'}; + const result = getEffectiveDisplayName(formatPhoneNumber, personalDetail); + expect(result).toBe('john.doe@example.com'); + }); + + test('should return national format for phone login if from the same region (US)', () => { + const personalDetail: PersonalDetails = {accountID: 123, login: '+15551234567'}; + const result = getEffectiveDisplayName(formatPhoneNumber, personalDetail); + expect(result).toBe('+1 555-123-4567'); + }); + + test('should return international format for phone login if from a different region (GB)', () => { + const personalDetail: PersonalDetails = {accountID: 123, login: '+442079460000'}; + const result = getEffectiveDisplayName(formatPhoneNumber, personalDetail); + expect(result).toBe('+44 20 7946 0000'); + }); + + test('should return formatted login (email) when both login and displayName exist (login takes precedence)', () => { + const personalDetail: PersonalDetails = { + accountID: 123, + login: 'john.doe@example.com', + displayName: 'John Doe Full Name', + }; + const result = getEffectiveDisplayName(formatPhoneNumber, personalDetail); + expect(result).toBe('john.doe@example.com'); + }); + + test('should return formatted login (phone) when both login (same region) and displayName exist', () => { + const personalDetail: PersonalDetails = { + accountID: 123, + login: '+15551234567', + displayName: 'John Doe Full Name', + }; + const result = getEffectiveDisplayName(formatPhoneNumber, personalDetail); + expect(result).toBe('+1 555-123-4567'); + }); + + test('should return formatted login (phone) when both login (different region) and displayName exist', () => { + const personalDetail: PersonalDetails = { + accountID: 123, + login: '+442079460000', + displayName: 'Jane Smith Full Name', + }; + const result = getEffectiveDisplayName(formatPhoneNumber, personalDetail); + expect(result).toBe('+44 20 7946 0000'); + }); + + test('should correctly handle login with SMS domain', () => { + const personalDetail: PersonalDetails = { + accountID: 123, + login: `+18005550000`, + displayName: 'SMS User', + }; + const result = getEffectiveDisplayName(formatPhoneNumber, personalDetail); + expect(result).toBe('(800) 555-0000'); + }); + + test('should fall back to displayName if formatted login is an empty string and displayName exists', () => { + const personalDetail: PersonalDetails = {accountID: 123, login: '', displayName: 'Fallback Name'}; + const result = getEffectiveDisplayName(formatPhoneNumber, personalDetail); + expect(result).toBe('Fallback Name'); + }); + }); + describe('getPersonalDetailsOnyxDataForOptimisticUsers', () => { test('should return correct optimistic and finally data', () => { const newLogins = ['3322076524', 'test2@test.com', '+14185438090'];