Skip to content

Commit 1f364a3

Browse files
committed
Add email field to the workspace member details view
1 parent 3ffa779 commit 1f364a3

File tree

3 files changed

+47
-23
lines changed

3 files changed

+47
-23
lines changed

Diff for: src/libs/PersonalDetailsUtils.ts

+18
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject';
1010
import {formatPhoneNumber} from './LocalePhoneNumber';
1111
import {translateLocal} from './Localize';
1212
import {areEmailsFromSamePrivateDomain} from './LoginUtils';
13+
import {parsePhoneNumber} from './PhoneNumber';
1314
import {generateAccountID} from './UserUtils';
1415

1516
type FirstAndLastName = {
@@ -413,6 +414,22 @@ function getDefaultCountry() {
413414
return defaultCountry;
414415
}
415416

417+
/**
418+
* Gets the phone number to display for SMS logins
419+
*/
420+
const getPhoneNumber = (details: OnyxEntry<PersonalDetails>): string | undefined => {
421+
const {login = '', displayName = ''} = details ?? {};
422+
// If the user hasn't set a displayName, it is set to their phone number
423+
const parsedPhoneNumber = parsePhoneNumber(displayName);
424+
425+
if (parsedPhoneNumber.possible) {
426+
return parsedPhoneNumber?.number?.e164;
427+
}
428+
429+
// If the user has set a displayName, get the phone number from the SMS login
430+
return login ? Str.removeSMSDomain(login) : '';
431+
};
432+
416433
export {
417434
isPersonalDetailsEmpty,
418435
getDisplayNameOrDefault,
@@ -434,4 +451,5 @@ export {
434451
getShortMentionIfFound,
435452
getDefaultCountry,
436453
getLoginByAccountID,
454+
getPhoneNumber,
437455
};

Diff for: src/pages/ProfilePage.tsx

+1-18
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ import useLocalize from '@hooks/useLocalize';
2424
import useThemeStyles from '@hooks/useThemeStyles';
2525
import Navigation from '@libs/Navigation/Navigation';
2626
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
27-
import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
28-
import {parsePhoneNumber} from '@libs/PhoneNumber';
27+
import {getDisplayNameOrDefault, getPhoneNumber} from '@libs/PersonalDetailsUtils';
2928
import {
3029
findSelfDMReportID,
3130
getChatByParticipants,
@@ -53,22 +52,6 @@ import mapOnyxCollectionItems from '@src/utils/mapOnyxCollectionItems';
5352

5453
type ProfilePageProps = PlatformStackScreenProps<ProfileNavigatorParamList, typeof SCREENS.PROFILE_ROOT>;
5554

56-
/**
57-
* Gets the phone number to display for SMS logins
58-
*/
59-
const getPhoneNumber = (details: OnyxEntry<PersonalDetails>): string | undefined => {
60-
const {login = '', displayName = ''} = details ?? {};
61-
// If the user hasn't set a displayName, it is set to their phone number
62-
const parsedPhoneNumber = parsePhoneNumber(displayName);
63-
64-
if (parsedPhoneNumber.possible) {
65-
return parsedPhoneNumber?.number?.e164;
66-
}
67-
68-
// If the user has set a displayName, get the phone number from the SMS login
69-
return login ? Str.removeSMSDomain(login) : '';
70-
};
71-
7255
/**
7356
* This function narrows down the data from Onyx to just the properties that we want to trigger a re-render of the component. This helps minimize re-rendering
7457
* and makes the entire component more performant because it's not re-rendering when a bunch of properties change which aren't ever used in the UI.

Diff for: src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx

+28-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {Str} from 'expensify-common';
12
import React, {useCallback, useEffect, useMemo, useState} from 'react';
23
import {View} from 'react-native';
34
import {useOnyx} from 'react-native-onyx';
@@ -6,6 +7,7 @@ import type {ValueOf} from 'type-fest';
67
import Avatar from '@components/Avatar';
78
import Button from '@components/Button';
89
import ButtonDisabledWhenOffline from '@components/Button/ButtonDisabledWhenOffline';
10+
import CommunicationsLink from '@components/CommunicationsLink';
911
import ConfirmModal from '@components/ConfirmModal';
1012
import HeaderWithBackButton from '@components/HeaderWithBackButton';
1113
import * as Expensicons from '@components/Icon/Expensicons';
@@ -15,6 +17,7 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback';
1517
import ScreenWrapper from '@components/ScreenWrapper';
1618
import ScrollView from '@components/ScrollView';
1719
import Text from '@components/Text';
20+
import UserDetailsTooltip from '@components/UserDetailsTooltip';
1821
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
1922
import useLocalize from '@hooks/useLocalize';
2023
import usePrevious from '@hooks/usePrevious';
@@ -26,7 +29,7 @@ import {removeApprovalWorkflow as removeApprovalWorkflowAction, updateApprovalWo
2629
import {getAllCardsForWorkspace, getCardFeedIcon, getCompanyFeeds, isExpensifyCardFullySetUp, maskCardNumber} from '@libs/CardUtils';
2730
import {convertToDisplayString} from '@libs/CurrencyUtils';
2831
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
29-
import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
32+
import {getDisplayNameOrDefault, getPhoneNumber} from '@libs/PersonalDetailsUtils';
3033
import shouldRenderTransferOwnerButton from '@libs/shouldRenderTransferOwnerButton';
3134
import {convertPolicyEmployeesToApprovalWorkflows, updateWorkflowDataOnApproverRemoval} from '@libs/WorkflowUtils';
3235
import Navigation from '@navigation/Navigation';
@@ -93,6 +96,9 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
9396
const policyOwnerDisplayName = formatPhoneNumber(getDisplayNameOrDefault(ownerDetails)) ?? policy?.owner ?? '';
9497
const hasMultipleFeeds = Object.keys(getCompanyFeeds(cardFeeds, false, true)).length > 0;
9598
const workspaceCards = getAllCardsForWorkspace(workspaceAccountID, cardList);
99+
const isSMSLogin = Str.isSMSLogin(memberLogin);
100+
const phoneNumber = getPhoneNumber(details);
101+
const phoneOrEmail = isSMSLogin ? getPhoneNumber(details) : memberLogin;
96102

97103
const policyApproverEmail = policy?.approver;
98104
const {approvalWorkflows} = useMemo(
@@ -309,8 +315,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
309315
text={translate('workspace.people.transferOwner')}
310316
onPress={startChangeOwnershipFlow}
311317
icon={Expensicons.Transfer}
312-
iconStyles={StyleUtils.getTransformScaleStyle(0.8)}
313-
style={styles.mv5}
318+
style={styles.mb5}
314319
/>
315320
)
316321
) : (
@@ -319,8 +324,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
319324
onPress={askForConfirmationToRemove}
320325
isDisabled={isSelectedMemberOwner || isSelectedMemberCurrentUser}
321326
icon={Expensicons.RemoveMembers}
322-
iconStyles={StyleUtils.getTransformScaleStyle(0.8)}
323-
style={styles.mv5}
327+
style={styles.mb5}
324328
/>
325329
)}
326330
<ConfirmModal
@@ -335,6 +339,25 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
335339
/>
336340
</View>
337341
<View style={styles.w100}>
342+
<View style={[styles.ph5, styles.pv3]}>
343+
<Text
344+
style={[styles.textLabelSupporting, styles.mb1]}
345+
numberOfLines={1}
346+
>
347+
{translate(isSMSLogin ? 'common.phoneNumber' : 'common.email')}
348+
</Text>
349+
<CommunicationsLink value={phoneOrEmail ?? ''}>
350+
<UserDetailsTooltip accountID={details?.accountID ?? CONST.DEFAULT_NUMBER_ID}>
351+
<Text
352+
numberOfLines={1}
353+
style={styles.w100}
354+
>
355+
{isSMSLogin ? formatPhoneNumber(phoneNumber ?? '') : memberLogin}
356+
</Text>
357+
</UserDetailsTooltip>
358+
</CommunicationsLink>
359+
</View>
360+
338361
<MenuItemWithTopDescription
339362
disabled={isSelectedMemberOwner || isSelectedMemberCurrentUser}
340363
title={translate(`workspace.common.roleName`, {role: member?.role})}

0 commit comments

Comments
 (0)