Skip to content

Commit 96846d8

Browse files
authored
Merge pull request Expensify#81057 from ShridharGoel/issue79396
Use alphabetical order for delegates and delegators
2 parents 892aed5 + cc6adec commit 96846d8

3 files changed

Lines changed: 41 additions & 27 deletions

File tree

src/CONST/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8293,6 +8293,9 @@ const CONST = {
82938293
TOGGLE_SETTINGS_ROW: 'Workspace-ToggleSettingsRow',
82948294
WORKSPACE_MENU_ITEM: 'Workspace-WorkspaceMenuItem',
82958295
},
8296+
ACCOUNT_SWITCHER: {
8297+
SHOW_ACCOUNTS: 'AccountSwitcher-ShowAccounts',
8298+
},
82968299
},
82978300

82988301
DOMAIN: {

src/components/AccountSwitcher.tsx

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import useWindowDimensions from '@hooks/useWindowDimensions';
1414
import {clearDelegatorErrors, connect, disconnect} from '@libs/actions/Delegate';
1515
import {close} from '@libs/actions/Modal';
1616
import {getLatestError} from '@libs/ErrorUtils';
17+
import {sortAlphabetically} from '@libs/OptionsListUtils';
1718
import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
1819
import TextWithEmojiFragment from '@pages/inbox/report/comment/TextWithEmojiFragment';
1920
import variables from '@styles/variables';
@@ -43,7 +44,7 @@ function AccountSwitcher({isScreenFocused}: AccountSwitcherProps) {
4344
const currentUserPersonalDetails = useCurrentUserPersonalDetails();
4445
const styles = useThemeStyles();
4546
const theme = useTheme();
46-
const {translate, formatPhoneNumber} = useLocalize();
47+
const {localeCompare, translate, formatPhoneNumber} = useLocalize();
4748
const {isOffline} = useNetwork();
4849
const {shouldUseNarrowLayout} = useResponsiveLayout();
4950
const [account] = useOnyx(ONYXKEYS.ACCOUNT, {canBeMissing: true});
@@ -153,23 +154,27 @@ function AccountSwitcher({isScreenFocused}: AccountSwitcherProps) {
153154
];
154155
}
155156

156-
const delegatorMenuItems: PopoverMenuItem[] = delegators
157-
.filter(({email}) => email !== currentUserPersonalDetails.login)
158-
.map(({email, role}) => {
159-
const errorFields = account?.delegatedAccess?.errorFields ?? {};
160-
const error = getLatestError(errorFields?.connect?.[email]);
161-
const personalDetails = getPersonalDetailByEmail(email);
162-
return createBaseMenuItem(personalDetails, error, {
163-
badgeText: translate('delegate.role', {role}),
164-
onSelected: () => {
165-
if (isOffline) {
166-
close(() => setShouldShowOfflineModal(true));
167-
return;
168-
}
169-
connect({email, delegatedAccess: account?.delegatedAccess, credentials, session, activePolicyID});
170-
},
171-
});
172-
});
157+
const delegatorMenuItems: PopoverMenuItem[] = sortAlphabetically(
158+
delegators
159+
.filter(({email}) => email !== currentUserPersonalDetails.login)
160+
.map(({email, role}) => {
161+
const errorFields = account?.delegatedAccess?.errorFields ?? {};
162+
const error = getLatestError(errorFields?.connect?.[email]);
163+
const personalDetails = getPersonalDetailByEmail(email);
164+
return createBaseMenuItem(personalDetails, error, {
165+
badgeText: translate('delegate.role', {role}),
166+
onSelected: () => {
167+
if (isOffline) {
168+
close(() => setShouldShowOfflineModal(true));
169+
return;
170+
}
171+
connect({email, delegatedAccess: account?.delegatedAccess, credentials, session, activePolicyID});
172+
},
173+
});
174+
}),
175+
'text',
176+
localeCompare,
177+
);
173178

174179
return [currentUserMenuItem, ...delegatorMenuItems];
175180
};
@@ -191,6 +196,7 @@ function AccountSwitcher({isScreenFocused}: AccountSwitcherProps) {
191196
interactive={canSwitchAccounts}
192197
pressDimmingValue={canSwitchAccounts ? undefined : 1}
193198
wrapperStyle={[styles.flexGrow1, styles.flex1, styles.mnw0, styles.justifyContentCenter]}
199+
sentryLabel={CONST.SENTRY_LABEL.ACCOUNT_SWITCHER.SHOW_ACCOUNTS}
194200
>
195201
<View style={[styles.flexRow, styles.gap3, styles.alignItemsCenter]}>
196202
<Avatar

src/pages/settings/Security/SecuritySettingsPage.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {clearDelegateErrorsByField, openSecuritySettingsPage, removeDelegate} fr
3333
import {getLatestError} from '@libs/ErrorUtils';
3434
import getClickedTargetLocation from '@libs/getClickedTargetLocation';
3535
import Navigation from '@libs/Navigation/Navigation';
36+
import {sortAlphabetically} from '@libs/OptionsListUtils';
3637
import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
3738
import type {AnchorPosition} from '@styles/index';
3839
import colors from '@styles/theme/colors';
@@ -60,7 +61,7 @@ function SecuritySettingsPage() {
6061
const illustrations = useMemoizedLazyIllustrations(['LockClosed']);
6162
const securitySettingsIllustration = useSecuritySettingsSectionIllustration();
6263
const styles = useThemeStyles();
63-
const {translate, formatPhoneNumber} = useLocalize();
64+
const {localeCompare, translate, formatPhoneNumber} = useLocalize();
6465
const waitForNavigate = useWaitForNavigation();
6566
const {shouldUseNarrowLayout} = useResponsiveLayout();
6667
const {windowWidth} = useWindowDimensions();
@@ -240,8 +241,8 @@ function SecuritySettingsPage() {
240241
]);
241242

242243
const delegateMenuItems: MenuItemProps[] = useMemo(
243-
() =>
244-
delegates
244+
() => {
245+
const menuItems = delegates
245246
.filter((d) => !d.optimisticAccountID)
246247
.map(({email, role, pendingAction, pendingFields}) => {
247248
const personalDetail = getPersonalDetailByEmail(email);
@@ -284,14 +285,16 @@ function SecuritySettingsPage() {
284285
onPress,
285286
success: selectedEmail === email,
286287
};
287-
}),
288+
});
289+
return sortAlphabetically(menuItems, 'title', localeCompare);
290+
},
288291
// eslint-disable-next-line react-hooks/exhaustive-deps
289-
[delegates, translate, styles, personalDetails, errorFields, windowWidth, selectedEmail, icons.FallbackAvatar, icons.ThreeDots],
292+
[delegates, translate, styles, personalDetails, errorFields, windowWidth, selectedEmail, icons.FallbackAvatar, icons.ThreeDots, localeCompare],
290293
);
291294

292295
const delegatorMenuItems: MenuItemProps[] = useMemo(
293-
() =>
294-
delegators.map(({email, role}) => {
296+
() => {
297+
const menuItems = delegators.map(({email, role}) => {
295298
const personalDetail = getPersonalDetailByEmail(email);
296299
const formattedEmail = formatPhoneNumber(email);
297300

@@ -306,9 +309,11 @@ function SecuritySettingsPage() {
306309
wrapperStyle: [styles.sectionMenuItemTopDescription],
307310
interactive: false,
308311
};
309-
}),
312+
});
313+
return sortAlphabetically(menuItems, 'title', localeCompare);
314+
},
310315
// eslint-disable-next-line react-hooks/exhaustive-deps
311-
[delegators, styles, translate, personalDetails, icons.FallbackAvatar],
316+
[delegators, styles, translate, personalDetails, icons.FallbackAvatar, localeCompare],
312317
);
313318

314319
const delegatePopoverMenuItems: PopoverMenuItem[] = [

0 commit comments

Comments
 (0)