Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/hooks/useContactImport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import useContactPermissions from '@libs/ContactPermission/useContactPermissions
import getContacts from '@libs/ContactUtils';
import type {SearchOption} from '@libs/OptionsListUtils';
import type {PersonalDetails} from '@src/types/onyx';
import useLocalize from './useLocalize';

/**
* Return type of the useContactImport hook.
Expand All @@ -26,14 +27,15 @@ type UseContactImportResult = {
function useContactImport(): UseContactImportResult {
const [contactPermissionState, setContactPermissionState] = useState<PermissionStatus>(RESULTS.UNAVAILABLE);
const [contacts, setContacts] = useState<Array<SearchOption<PersonalDetails>>>([]);
const {localeCompare} = useLocalize();

const importAndSaveContacts = useCallback(() => {
contactImport().then(({contactList, permissionStatus}: ContactImportResult) => {
setContactPermissionState(permissionStatus);
const usersFromContact = getContacts(contactList);
const usersFromContact = getContacts(contactList, localeCompare);
setContacts(usersFromContact);
});
}, []);
}, [localeCompare]);

useContactPermissions({
importAndSaveContacts,
Expand Down
9 changes: 5 additions & 4 deletions src/libs/ContactUtils.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import type {LocaleContextProps} from '@components/LocaleContextProvider';
import CONST from '@src/CONST';
import type {PersonalDetails} from '@src/types/onyx';
import type {DeviceContact, StringHolder} from './ContactImport/types';
import localeCompare from './LocaleCompare';
import {getUserToInviteContactOption} from './OptionsListUtils';
import type {SearchOption} from './OptionsListUtils';
import RandomAvatarUtils from './RandomAvatarUtils';

function sortEmailObjects(emails?: StringHolder[]): string[] {
function sortEmailObjects(emails: StringHolder[], localeCompare: LocaleContextProps['localeCompare']): string[] {
if (!emails?.length) {
return [];
}
Expand All @@ -28,10 +28,10 @@ function sortEmailObjects(emails?: StringHolder[]): string[] {
});
}

const getContacts = (deviceContacts: DeviceContact[] | []): Array<SearchOption<PersonalDetails>> => {
const getContacts = (deviceContacts: DeviceContact[] | [], localeCompare: LocaleContextProps['localeCompare']): Array<SearchOption<PersonalDetails>> => {
return deviceContacts
.map((contact) => {
const email = sortEmailObjects(contact?.emailAddresses ?? [])?.at(0) ?? '';
const email = sortEmailObjects(contact?.emailAddresses ?? [], localeCompare)?.at(0) ?? '';
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
const avatarSource = (contact?.imageData || RandomAvatarUtils.getAvatarForContact(`${contact?.firstName}${email}${contact?.lastName}`)) ?? '';
const phoneNumber = contact.phoneNumbers?.[0]?.value ?? '';
Expand All @@ -53,3 +53,4 @@ const getContacts = (deviceContacts: DeviceContact[] | []): Array<SearchOption<P
};

export default getContacts;
export {sortEmailObjects};
12 changes: 12 additions & 0 deletions tests/unit/ContactUtilsTest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import {sortEmailObjects} from '@src/libs/ContactUtils';
import {localeCompare} from '../utils/TestHelper';

describe('ContactUtils', () => {
describe('sortEmailObjects', () => {
it('Should sort email objects with Expensify emails first', () => {
const emails = [{value: 'user2@gmail.com'}, {value: 'user2@expensify.com'}, {value: 'user1@gmail.com'}, {value: 'user1@expensify.com'}];
const sortedEmails = sortEmailObjects(emails, localeCompare);
expect(sortedEmails).toEqual(['user1@expensify.com', 'user2@expensify.com', 'user1@gmail.com', 'user2@gmail.com']);
});
});
});
Loading