Skip to content
Open
Show file tree
Hide file tree
Changes from 5 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
5 changes: 3 additions & 2 deletions src/hooks/useAssignCard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {
} from '@libs/CardUtils';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
import {getDomainNameForPolicy, getMemberAccountIDsForWorkspace, isDeletedPolicyEmployee} from '@libs/PolicyUtils';

import {clearAddNewCardFlow, clearAssignCardStepAndData, openPolicyCompanyCardsPage, setAddNewCompanyCardStepAndData, setAssignCardStepAndData} from '@userActions/CompanyCards';
Expand All @@ -33,6 +32,7 @@ import useIsAllowedToIssueCompanyCard from './useIsAllowedToIssueCompanyCard';
import useLocalize from './useLocalize';
import useNetwork from './useNetwork';
import useOnyx from './useOnyx';
import {usePersonalDetailsByLogins} from './usePersonalDetailByLogin';
import usePolicy from './usePolicy';

type UseAssignCardProps = {
Expand Down Expand Up @@ -146,6 +146,7 @@ function useInitialAssignCardStep({policyID, selectedFeed}: UseInitialAssignCard
const {currencyList} = useCurrencyListState();

const [countryByIp] = useOnyx(ONYXKEYS.COUNTRY);
const employeePersonalDetails = usePersonalDetailsByLogins(Object.keys(policy?.employeeList ?? {}));

const [cardFeeds] = useCardFeeds(policyID);
const companyCards = getCompanyFeeds(cardFeeds);
Expand Down Expand Up @@ -204,7 +205,7 @@ function useInitialAssignCardStep({policyID, selectedFeed}: UseInitialAssignCard
if (activeEmployees.length === 1) {
const userEmail = activeEmployees.at(0)?.[0] ?? '';
cardToAssign.email = userEmail;
const personalDetails = getPersonalDetailByEmail(userEmail);
const personalDetails = employeePersonalDetails[userEmail];
const memberName = personalDetails?.firstName ? personalDetails.firstName : personalDetails?.login;
cardToAssign.customCardName = getDefaultCardName(memberName);

Expand Down
9 changes: 0 additions & 9 deletions src/libs/PersonalDetailsUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -495,14 +495,6 @@ function extractFirstAndLastNameFromAvailableDetails({login, displayName, firstN
return {firstName: '', lastName: ''};
}

function getUserNameByEmail(email: string, nameToDisplay: 'firstName' | 'displayName') {
const userDetails = getPersonalDetailByEmail(email);
if (userDetails) {
return userDetails[nameToDisplay] ? Str.removeSMSDomain(userDetails[nameToDisplay]) : Str.removeSMSDomain(userDetails.login ?? '');
}
return Str.removeSMSDomain(email);
}

const getShortMentionIfFound = (displayText: string, userAccountID: string, currentUserPersonalDetails: OnyxEntry<PersonalDetails>, userLogin = '') => {
// If the userAccountID does not exist, this is an email-based mention so the displayText must be an email.
// If the userAccountID exists but userLogin is different from displayText, this means the displayText is either user display name, Hidden, or phone number, in which case we should return it as is.
Expand Down Expand Up @@ -597,7 +589,6 @@ export {
createDisplayName,
extractFirstAndLastNameFromAvailableDetails,
getNewAccountIDsAndLogins,
getUserNameByEmail,
getShortMentionIfFound,
getLoginByAccountID,
getPhoneNumber,
Expand Down
16 changes: 12 additions & 4 deletions src/pages/workspace/expensifyCard/issueNew/AssigneeStep.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useOnyx from '@hooks/useOnyx';
import usePersonalDetailByLogin, {usePersonalDetailsByLogins} from '@hooks/usePersonalDetailByLogin';
import usePersonalDetailSearchSelector from '@hooks/usePersonalDetailSearchSelector';
import useThemeStyles from '@hooks/useThemeStyles';

Expand All @@ -18,7 +19,6 @@ import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigat
import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
import {getSearchValueForPhoneOrEmail, sortAlphabetically} from '@libs/OptionsListUtils';
import {getHeaderMessage} from '@libs/PersonalDetailOptionsListUtils';
import {getPersonalDetailByEmail, getUserNameByEmail} from '@libs/PersonalDetailsUtils';
import {canMemberWrite, filterGuideAndAccountManager, getGuideAndAccountManagerInfo, getIneligibleInvitees, isDeletedPolicyEmployee} from '@libs/PolicyUtils';
import tokenizedSearch from '@libs/tokenizedSearch';

Expand All @@ -34,6 +34,7 @@ import type {IssueNewCardData} from '@src/types/onyx/Card';

import type {OnyxEntry} from 'react-native-onyx';

import {Str} from 'expensify-common';
import React, {useEffect, useMemo, useState} from 'react';

type AssigneeStepProps = {
Expand Down Expand Up @@ -63,6 +64,11 @@ function AssigneeStep({policy, stepNames, startStepIndex, route}: AssigneeStepPr
const [didScreenTransitionEnd, setDidScreenTransitionEnd] = useState(false);
const [isSearchingForReports] = useOnyx(ONYXKEYS.RAM_ONLY_IS_SEARCHING_FOR_REPORTS);
const canInviteMembers = canMemberWrite(policy, session?.email ?? '', CONST.POLICY.POLICY_FEATURE.MEMBERS);
const employeePersonalDetails = usePersonalDetailsByLogins(Object.keys(policy?.employeeList ?? {}));
const currentAssigneeFirstName = usePersonalDetailByLogin(issueNewCard?.data?.assigneeEmail, (personalDetail) => {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
return Str.removeSMSDomain(personalDetail?.firstName || issueNewCard?.data?.assigneeEmail || '');
Comment thread
bernhardoj marked this conversation as resolved.
Outdated
});

const ineligibleInvites = getIneligibleInvitees(policy?.employeeList);
const excludedUsers: Record<string, boolean> = {};
Expand Down Expand Up @@ -95,9 +101,11 @@ function AssigneeStep({policy, stepNames, startStepIndex, route}: AssigneeStepPr
currency,
};

if (isEditing && issueNewCard?.data?.cardTitle === getCardDefaultName(getUserNameByEmail(issueNewCard?.data?.assigneeEmail, 'firstName'))) {
if (isEditing && issueNewCard?.data?.cardTitle === getCardDefaultName(currentAssigneeFirstName)) {
// If the card title is the default card title, update it with the new assignee's name
data.cardTitle = getCardDefaultName(getUserNameByEmail(assignee?.login ?? '', 'firstName'));
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
const newAssigneeFirstName = Str.removeSMSDomain(employeePersonalDetails[assignee?.login ?? '']?.firstName || assignee?.login || '');
data.cardTitle = getCardDefaultName(newAssigneeFirstName);
}

if (!policy?.employeeList?.[assignee?.login ?? '']) {
Expand Down Expand Up @@ -141,7 +149,7 @@ function AssigneeStep({policy, stepNames, startStepIndex, route}: AssigneeStepPr
continue;
}

const personalDetail = getPersonalDetailByEmail(email);
const personalDetail = employeePersonalDetails[email];
membersDetails.push({
keyForList: email,
text: personalDetail?.displayName,
Expand Down
8 changes: 6 additions & 2 deletions src/pages/workspace/expensifyCard/issueNew/CardNameStep.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ import useAutoFocusInput from '@hooks/useAutoFocusInput';
import useIsInLandscapeMode from '@hooks/useIsInLandscapeMode';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePersonalDetailByLogin from '@hooks/usePersonalDetailByLogin';
import useThemeStyles from '@hooks/useThemeStyles';

import {getDefaultCardName} from '@libs/CardUtils';
import {addErrorMessage} from '@libs/ErrorUtils';
import {getUserNameByEmail} from '@libs/PersonalDetailsUtils';
import {isPolicyFeatureEnabled} from '@libs/PolicyUtils';
import {getFieldRequiredErrors, isValidInputLength} from '@libs/ValidationUtils';

Expand All @@ -24,6 +24,7 @@ import ONYXKEYS from '@src/ONYXKEYS';
import INPUT_IDS from '@src/types/form/IssueNewExpensifyCardForm';
import KeyboardUtils from '@src/utils/keyboard';

import {Str} from 'expensify-common';
import React, {useCallback} from 'react';

type CardNameStepProps = {
Expand All @@ -49,10 +50,13 @@ function CardNameStep({policyID, stepNames, startStepIndex}: CardNameStepProps)

const isEditing = issueNewCard?.isEditing;
const data = issueNewCard?.data;
const userName = usePersonalDetailByLogin(data?.assigneeEmail, (personalDetail) => {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
return Str.removeSMSDomain(personalDetail?.firstName || data?.assigneeEmail || '');
Comment thread
bernhardoj marked this conversation as resolved.
Outdated
});
const isVirtualCard = data?.cardType === CONST.EXPENSIFY_CARD.CARD_TYPE.VIRTUAL;
const areSpendRulesAvailable = isPolicyFeatureEnabled(policy, CONST.POLICY.MORE_FEATURES.ARE_RULES_ENABLED, policyCategories);

const userName = getUserNameByEmail(data?.assigneeEmail ?? '', 'firstName');
const defaultCardTitle = !isVirtualCard ? getDefaultCardName(userName) : '';

const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.ISSUE_NEW_EXPENSIFY_CARD_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.ISSUE_NEW_EXPENSIFY_CARD_FORM> => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import usePersonalDetailByLogin from '@hooks/usePersonalDetailByLogin';
import useThemeStyles from '@hooks/useThemeStyles';

import AccountUtils from '@libs/AccountUtils';
import {clearIssueNewCardError, clearIssueNewCardFlow, issueExpensifyCard, setIssueNewCardStepAndData} from '@libs/actions/Card';
import {getTranslationKeyForLimitType} from '@libs/CardUtils';
import {convertToShortDisplayString} from '@libs/CurrencyUtils';
import {getLatestErrorMessage} from '@libs/ErrorUtils';
import {getUserNameByEmail} from '@libs/PersonalDetailsUtils';
import {isPolicyFeatureEnabled} from '@libs/PolicyUtils';

import createDynamicRoute from '@navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
Expand All @@ -29,6 +29,7 @@ import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
import type {IssueNewCardStep} from '@src/types/onyx/Card';

import {Str} from 'expensify-common';
import React, {useCallback, useEffect, useRef} from 'react';
import {View} from 'react-native';

Expand Down Expand Up @@ -56,6 +57,10 @@ function ConfirmationStep({policyID, stepNames, startStepIndex}: ConfirmationSte
const {cardRules} = useExpensifyCardRules(policyID);

const data = issueNewCard?.data;
const cardholder = usePersonalDetailByLogin(data?.assigneeEmail, (personalDetail) => {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
return Str.removeSMSDomain(personalDetail?.displayName || data?.assigneeEmail || '');
Comment thread
bernhardoj marked this conversation as resolved.
Outdated
});
const isSuccessful = issueNewCard?.isSuccessful;
const hasApprovalError = !!policy?.errorFields?.approvalMode;
const isSpendRuleApplied = !!issueNewCard?.data.spendRuleEnabled;
Expand Down Expand Up @@ -186,7 +191,7 @@ function ConfirmationStep({policyID, stepNames, startStepIndex}: ConfirmationSte
<Text style={[styles.textSupporting, styles.ph5, styles.mv3]}>{translate(cardReadyTranslationKey)}</Text>
<MenuItemWithTopDescription
description={translate('workspace.card.issueNewCard.cardholder')}
title={getUserNameByEmail(data?.assigneeEmail ?? '', 'displayName')}
title={cardholder}
shouldShowRightIcon={!issueNewCard?.isChangeAssigneeDisabled}
interactive={!issueNewCard?.isChangeAssigneeDisabled}
onPress={() => editStep(CONST.EXPENSIFY_CARD.STEP.ASSIGNEE)}
Expand Down
Loading