Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
import useDynamicBackPath from '@hooks/useDynamicBackPath';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePersonalDetailByLogin from '@hooks/usePersonalDetailByLogin';
import usePersonalDetailSearchSelector from '@hooks/usePersonalDetailSearchSelector';
import useThemeStyles from '@hooks/useThemeStyles';

import {setDraftValues} from '@libs/actions/FormActions';
import {searchInServer} from '@libs/actions/Report';
import Navigation from '@libs/Navigation/Navigation';
import {getHeaderMessage, getUserToInviteOption} from '@libs/PersonalDetailOptionsListUtils';
import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';

import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand All @@ -39,7 +39,7 @@ function WorkspaceConfirmationOwnerSelectorPageContent({currentOwner}: Workspace
const [isSearchingForReports] = useOnyx(ONYXKEYS.RAM_ONLY_IS_SEARCHING_FOR_REPORTS);
const backPath = useDynamicBackPath(DYNAMIC_ROUTES.OWNER_SELECTOR.path);

const ownerPersonalDetails = getPersonalDetailByEmail(currentOwner);
const ownerPersonalDetails = usePersonalDetailByLogin(currentOwner);

// When the current owner isn't in the personal details list (e.g. an external email), build an optimistic option to seed the selection
const ownerExtraOption =
Expand Down
9 changes: 3 additions & 6 deletions src/pages/workspace/categories/CategorySettingsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import useNetwork from '@hooks/useNetwork';
import useOnboardingTaskInformation from '@hooks/useOnboardingTaskInformation';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import usePersonalDetailByLogin from '@hooks/usePersonalDetailByLogin';
import usePolicyData from '@hooks/usePolicyData';
import usePolicyFeatureWriteAccess from '@hooks/usePolicyFeatureWriteAccess';
import useThemeStyles from '@hooks/useThemeStyles';
Expand All @@ -39,7 +40,6 @@ import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/crea
import Navigation from '@libs/Navigation/Navigation';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
import {isDisablingOrDeletingLastEnabledCategory} from '@libs/OptionsListUtils';
import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
import {arePolicyRulesEnabled, getWorkflowApprovalsUnavailable, hasTags, isAttendeeTrackingEnabled, isControlPolicy, tryNavigateToControlPolicyUpgrade} from '@libs/PolicyUtils';

import type {SettingsNavigatorParamList} from '@navigation/types';
Expand Down Expand Up @@ -147,11 +147,8 @@ function CategorySettingsPage({route: {params, name}, navigation}: CategorySetti
)}`;
}, [convertToDisplayString, policyCategory?.maxExpenseAmount, policyCategoryExpenseLimitType, policyCurrency, translate]);

const approverText = useMemo(() => {
const categoryApprover = getCategoryApproverRule(policy?.rules?.approvalRules ?? [], categoryName)?.approver ?? '';
const approver = getPersonalDetailByEmail(categoryApprover);
return formatPhoneNumber(approver?.displayName ?? categoryApprover);
}, [categoryName, policy?.rules?.approvalRules, formatPhoneNumber]);
const categoryApprover = getCategoryApproverRule(policy?.rules?.approvalRules ?? [], categoryName)?.approver ?? '';
const approverText = usePersonalDetailByLogin(categoryApprover, (personalDetails) => formatPhoneNumber(personalDetails?.displayName ?? categoryApprover));

const defaultTaxRateText = useMemo(() => {
const taxID = getCategoryDefaultTaxRate(policy?.rules?.expenseRules ?? [], categoryName, policy?.taxRates?.defaultExternalID);
Expand Down
6 changes: 4 additions & 2 deletions src/pages/workspace/categories/WorkspaceCategoriesPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import useNetwork from '@hooks/useNetwork';
import useOnboardingTaskInformation from '@hooks/useOnboardingTaskInformation';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import {usePersonalDetailsByLogins} from '@hooks/usePersonalDetailByLogin';
import usePolicyData from '@hooks/usePolicyData';
import usePolicyFeatureWriteAccess from '@hooks/usePolicyFeatureWriteAccess';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
Expand All @@ -40,7 +41,6 @@ import Navigation from '@libs/Navigation/Navigation';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
import type {WorkspaceSplitNavigatorParamList} from '@libs/Navigation/types';
import {isDisablingOrDeletingLastEnabledCategory} from '@libs/OptionsListUtils';
import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
import {arePolicyRulesEnabled, getConnectedIntegration, hasAccountingConnections, hasTags, isControlPolicy, shouldShowSyncError} from '@libs/PolicyUtils';

import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
Expand Down Expand Up @@ -76,6 +76,7 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) {
const isMobileSelectionModeEnabled = useMobileSelectionMode();
const policyData = usePolicyData(policyId);
const {policy, categories: policyCategories} = policyData;
const employeePersonalDetails = usePersonalDetailsByLogins(Object.keys(policy.employeeList ?? {}));
useWorkspaceDocumentTitle(policy?.name, 'workspace.common.categories');
const [connectionSyncProgress] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policy?.id}`);
const isSyncInProgress = isConnectionInProgress(connectionSyncProgress, policy);
Expand Down Expand Up @@ -272,7 +273,7 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) {
}

const approverEmail = shouldShowApproverColumn ? categoryApproverEmails[value.name] : undefined;
const approverPersonalDetail = getPersonalDetailByEmail(approverEmail);
const approverPersonalDetail = employeePersonalDetails[approverEmail ?? ''];
const {avatar: approverAvatar, displayName = approverEmail, accountID: approverAccountID} = approverPersonalDetail ?? {};
const approverDisplayName = displayName ? formatPhoneNumber(displayName) : '';

Expand Down Expand Up @@ -306,6 +307,7 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) {
navigateToCategory,
handleCategoryToggle,
policyId,
employeePersonalDetails,
formatPhoneNumber,
]);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import TextInput from '@components/TextInput';
import useAutoFocusInput from '@hooks/useAutoFocusInput';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePersonalDetailByLogin from '@hooks/usePersonalDetailByLogin';
import useThemeStyles from '@hooks/useThemeStyles';

import {clearDraftValues} from '@libs/actions/FormActions';
Expand All @@ -23,7 +24,7 @@ import {setWorkspaceInviteMessageDraft} from '@libs/actions/Policy/Policy';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils';
import {getNewAccountIDsAndLogins, getPersonalDetailByEmail, getPersonalDetailsOnyxDataForOptimisticUsers, temporaryGetDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
import {getNewAccountIDsAndLogins, getPersonalDetailsOnyxDataForOptimisticUsers, temporaryGetDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
import {
canMemberAssignElevatedRole,
canMemberAssignRole,
Expand Down Expand Up @@ -114,7 +115,7 @@ function WorkspaceInviteMessageComponent({
const defaultApprover = getDefaultApprover(policy);
const [approverDraft] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_INVITE_APPROVER_DRAFT}${policyID}`);
const workspaceInviteApproverDraft = approverDraft ?? defaultApprover;
const approverDetails = getPersonalDetailByEmail(workspaceInviteApproverDraft);
const approverDetails = usePersonalDetailByLogin(workspaceInviteApproverDraft);

const isControl = isControlPolicy(policy);
const shouldShowApproverRow = isControl && policy?.approvalMode === CONST.POLICY.APPROVAL_MODE.ADVANCED && policy?.areWorkflowsEnabled;
Expand Down Expand Up @@ -247,7 +248,7 @@ function WorkspaceInviteMessageComponent({
};

const invitingMemberEmail = Object.keys(invitedEmailsToAccountIDsDraft ?? {}).at(0) ?? '';
const invitingMemberDetails = getPersonalDetailByEmail(invitingMemberEmail);
const invitingMemberDetails = usePersonalDetailByLogin(invitingMemberEmail);
const invitingMemberName = Str.removeSMSDomain(invitingMemberDetails?.displayName ?? '');

useEffect(() => {
Expand Down
5 changes: 3 additions & 2 deletions src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import useExpensifyCardFeeds from '@hooks/useExpensifyCardFeeds';
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePersonalDetailByLogin from '@hooks/usePersonalDetailByLogin';
import usePrevious from '@hooks/usePrevious';
import useRuleBotGuardModal from '@hooks/useRuleBotGuardModal';
import useStyleUtils from '@hooks/useStyleUtils';
Expand All @@ -33,7 +34,7 @@ import {isRuleBotEnforcingRules} from '@libs/AgentRulesUtils';
import {getAllCardsForWorkspace, getCardFeedIcon, getCardFeedWithDomainID, getPlaidInstitutionIconUrl, lastFourNumbersFromCardName, maskCardNumber} from '@libs/CardUtils';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
import {getPersonalDetailByEmail, getPhoneNumber, temporaryGetDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
import {getPhoneNumber, temporaryGetDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
import {
canMemberAssignRole,
canMemberManageMemberWithRole,
Expand Down Expand Up @@ -125,7 +126,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM

const routeAccountID = Number(route.params.accountID);
const memberLogin = personalDetails?.[routeAccountID]?.login ?? getMemberLoginByOptimisticAccountID(policy, routeAccountID);
const memberPersonalDetails = personalDetails?.[routeAccountID] ?? getPersonalDetailByEmail(memberLogin);
const memberPersonalDetails = usePersonalDetailByLogin(memberLogin);
Comment thread
bernhardoj marked this conversation as resolved.
const accountID = memberPersonalDetails?.accountID ?? routeAccountID;
const member = policy?.employeeList?.[memberLogin];
const prevMember = usePrevious(member);
Expand Down
5 changes: 2 additions & 3 deletions src/pages/workspace/tags/DynamicTagSettingsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import useEnvironment from '@hooks/useEnvironment';
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import usePermissions from '@hooks/usePermissions';
import usePersonalDetailByLogin from '@hooks/usePersonalDetailByLogin';
import usePolicyData from '@hooks/usePolicyData';
import usePolicyFeatureWriteAccess from '@hooks/usePolicyFeatureWriteAccess';
import useThemeStyles from '@hooks/useThemeStyles';
Expand All @@ -23,7 +24,6 @@ import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/crea
import Navigation from '@libs/Navigation/Navigation';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
import {isDisablingOrDeletingLastEnabledTag} from '@libs/OptionsListUtils';
import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
import {
arePolicyRulesEnabled,
getCleanedTagName,
Expand Down Expand Up @@ -73,8 +73,7 @@ function DynamicTagSettingsPage({route, navigation}: DynamicTagSettingsPageProps
const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_SETTINGS;
const backPath = useDynamicBackPath(DYNAMIC_ROUTES.SETTINGS_TAG_SETTINGS.path);
const tagApprover = getTagApproverRule(policy, route.params?.tagName)?.approver ?? '';
const approver = getPersonalDetailByEmail(tagApprover);
const approverText = formatPhoneNumber(approver?.displayName ?? tagApprover);
const approverText = usePersonalDetailByLogin(tagApprover, (personalDetails) => formatPhoneNumber(personalDetails?.displayName ?? tagApprover));
const hasDependentTags = hasDependentTagsPolicyUtils(policy, policyTags);
const currentPolicyTag = hasDependentTags
? Object.values(policyTag.tags ?? {}).find((tag) => tag?.name === tagName && tag.rules?.parentTagsFilter === parentTagsFilter)
Expand Down
6 changes: 4 additions & 2 deletions src/pages/workspace/tags/WorkspaceTagsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import useMobileSelectionMode from '@hooks/useMobileSelectionMode';
import useNetwork from '@hooks/useNetwork';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import {usePersonalDetailsByLogins} from '@hooks/usePersonalDetailByLogin';
import usePolicyData from '@hooks/usePolicyData';
import usePolicyFeatureWriteAccess from '@hooks/usePolicyFeatureWriteAccess';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
Expand All @@ -47,7 +48,6 @@ import Navigation from '@libs/Navigation/Navigation';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
import type {WorkspaceSplitNavigatorParamList} from '@libs/Navigation/types';
import {isDisablingOrDeletingLastEnabledTag, isMakingLastRequiredTagListOptional} from '@libs/OptionsListUtils';
import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
import {
arePolicyRulesEnabled,
getCleanedTagName,
Expand Down Expand Up @@ -100,6 +100,7 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) {
const {environmentURL} = useEnvironment();
const [connectionSyncProgress] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policy?.id}`);
const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policy?.id}`);
const employeePersonalDetails = usePersonalDetailsByLogins(Object.keys(policy.employeeList ?? {}));
const isSyncInProgress = isConnectionInProgress(connectionSyncProgress, policy);
const syncingAccountingIntegration = CONST.POLICY.CONNECTIONS.ACCOUNTING_CONNECTION_NAMES.find((connectionName) => connectionName === connectionSyncProgress?.connectionName);
const hasSyncError = shouldShowSyncError(policy, isSyncInProgress, CONST.POLICY.CONNECTIONS.ACCOUNTING_CONNECTION_NAMES);
Expand Down Expand Up @@ -388,7 +389,7 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) {
}

const approverEmail = shouldShowApproverColumn ? tagApproverEmails[tag.name] : undefined;
const approverPersonalDetail = getPersonalDetailByEmail(approverEmail);
const approverPersonalDetail = employeePersonalDetails[approverEmail ?? ''];
const {avatar: approverAvatar, displayName = approverEmail, accountID: approverAccountID} = approverPersonalDetail ?? {};
const approverDisplayName = displayName ? formatPhoneNumber(displayName) : '';
const isLastEnabledTagAndEnabled = isLastEnabledTagLocked && tag.enabled;
Expand Down Expand Up @@ -429,6 +430,7 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) {
policyTags,
shouldShowApproverColumn,
tagApproverEmails,
employeePersonalDetails,
formatPhoneNumber,
]);

Expand Down
3 changes: 2 additions & 1 deletion tests/ui/WorkspaceMemberDetailsPageTest.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import HTMLEngineProvider from '@components/HTMLEngineProvider';
import {LocaleContextProvider} from '@components/LocaleContextProvider';
import {ModalProvider} from '@components/Modal/Global/ModalContext';
import OnyxListItemProvider from '@components/OnyxListItemProvider';
import PersonalDetailsByLoginProvider from '@components/PersonalDetailsByLoginProvider';

import {CurrentReportIDContextProvider} from '@hooks/useCurrentReportID';
import * as useResponsiveLayoutModule from '@hooks/useResponsiveLayout';
Expand Down Expand Up @@ -38,7 +39,7 @@ const Stack = createPlatformStackNavigator<SettingsNavigatorParamList>();

const renderPage = (initialParams: SettingsNavigatorParamList[typeof SCREENS.WORKSPACE.MEMBER_DETAILS]) => {
return render(
<ComposeProviders components={[OnyxListItemProvider, LocaleContextProvider, HTMLEngineProvider, CurrentReportIDContextProvider, ModalProvider]}>
<ComposeProviders components={[OnyxListItemProvider, LocaleContextProvider, HTMLEngineProvider, CurrentReportIDContextProvider, ModalProvider, PersonalDetailsByLoginProvider]}>
<PortalProvider>
<NavigationContainer>
<Stack.Navigator initialRouteName={SCREENS.WORKSPACE.MEMBER_DETAILS}>
Expand Down
Loading