Skip to content

Commit 61ea101

Browse files
authored
Merge pull request #36941 from callstack-internal/audit/implementation/localeCompare-global-replacement
[Audit][Implementation] Replace localeCompare with static Collator implementation
2 parents 449d011 + 485ca04 commit 61ea101

8 files changed

+18
-10
lines changed

src/libs/GroupChatUtils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {OnyxEntry} from 'react-native-onyx';
22
import type {Report} from '@src/types/onyx';
3+
import localeCompare from './LocaleCompare';
34
import * as ReportUtils from './ReportUtils';
45

56
/**
@@ -11,7 +12,7 @@ function getGroupChatName(report: OnyxEntry<Report>): string | undefined {
1112

1213
return participants
1314
.map((participant) => ReportUtils.getDisplayNameForParticipant(participant, isMultipleParticipantReport))
14-
.sort((first, second) => first?.localeCompare(second ?? '') ?? 0)
15+
.sort((first, second) => localeCompare(first ?? '', second ?? ''))
1516
.filter(Boolean)
1617
.join(', ');
1718
}

src/libs/KeyboardShortcut/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Str from 'expensify-common/lib/str';
22
import * as KeyCommand from 'react-native-key-command';
33
import getOperatingSystem from '@libs/getOperatingSystem';
4+
import localeCompare from '@libs/LocaleCompare';
45
import CONST from '@src/CONST';
56
import bindHandlerToKeydownEvent from './bindHandlerToKeydownEvent';
67

@@ -32,7 +33,7 @@ type Shortcut = {
3233
const documentedShortcuts: Record<string, Shortcut> = {};
3334

3435
function getDocumentedShortcuts(): Shortcut[] {
35-
return Object.values(documentedShortcuts).sort((a, b) => a.displayName.localeCompare(b.displayName));
36+
return Object.values(documentedShortcuts).sort((a, b) => localeCompare(a.displayName, b.displayName));
3637
}
3738

3839
const keyInputEnter = KeyCommand?.constants?.keyInputEnter?.toString() ?? 'keyInputEnter';

src/libs/OptionsListUtils.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import times from '@src/utils/times';
3434
import Timing from './actions/Timing';
3535
import * as CollectionUtils from './CollectionUtils';
3636
import * as ErrorUtils from './ErrorUtils';
37+
import localeCompare from './LocaleCompare';
3738
import * as LocalePhoneNumber from './LocalePhoneNumber';
3839
import * as Localize from './Localize';
3940
import * as LoginUtils from './LoginUtils';
@@ -871,9 +872,9 @@ function sortTags(tags: Record<string, Tag> | Tag[]) {
871872
let sortedTags;
872873

873874
if (Array.isArray(tags)) {
874-
sortedTags = tags.sort((a, b) => a.name.localeCompare(b.name));
875+
sortedTags = tags.sort((a, b) => localeCompare(a.name, b.name));
875876
} else {
876-
sortedTags = Object.values(tags).sort((a, b) => a.name.localeCompare(b.name));
877+
sortedTags = Object.values(tags).sort((a, b) => localeCompare(a.name, b.name));
877878
}
878879

879880
return sortedTags;

src/libs/ReportUtils.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import * as CollectionUtils from './CollectionUtils';
5252
import * as CurrencyUtils from './CurrencyUtils';
5353
import DateUtils from './DateUtils';
5454
import isReportMessageAttachment from './isReportMessageAttachment';
55+
import localeCompare from './LocaleCompare';
5556
import * as LocalePhoneNumber from './LocalePhoneNumber';
5657
import * as Localize from './Localize';
5758
import linkingConfig from './Navigation/linkingConfig';
@@ -1441,7 +1442,7 @@ function getIconsForParticipants(participants: number[], personalDetails: OnyxCo
14411442

14421443
const sortedParticipantDetails = participantDetails.sort((first, second) => {
14431444
// First sort by displayName/login
1444-
const displayNameLoginOrder = first[1].localeCompare(second[1]);
1445+
const displayNameLoginOrder = localeCompare(first[1], second[1]);
14451446
if (displayNameLoginOrder !== 0) {
14461447
return displayNameLoginOrder;
14471448
}
@@ -1699,7 +1700,7 @@ function getDisplayNamesWithTooltips(
16991700
})
17001701
.sort((first, second) => {
17011702
// First sort by displayName/login
1702-
const displayNameLoginOrder = first.displayName.localeCompare(second.displayName);
1703+
const displayNameLoginOrder = localeCompare(first.displayName, second.displayName);
17031704
if (displayNameLoginOrder !== 0) {
17041705
return displayNameLoginOrder;
17051706
}

src/pages/ReportParticipantsPage.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import OptionsList from '@components/OptionsList';
88
import ScreenWrapper from '@components/ScreenWrapper';
99
import useLocalize from '@hooks/useLocalize';
1010
import useThemeStyles from '@hooks/useThemeStyles';
11+
import localeCompare from '@libs/LocaleCompare';
1112
import * as LocalePhoneNumber from '@libs/LocalePhoneNumber';
1213
import type * as Localize from '@libs/Localize';
1314
import Navigation from '@libs/Navigation/Navigation';
@@ -69,7 +70,7 @@ const getAllParticipants = (
6970
reportID: report?.reportID ?? '',
7071
};
7172
})
72-
.sort((a, b) => a.displayName.localeCompare(b.displayName.toLowerCase()));
73+
.sort((a, b) => localeCompare(a.displayName, b.displayName));
7374

7475
function ReportParticipantsPage({report, personalDetails}: ReportParticipantsPageProps) {
7576
const {translate} = useLocalize();

src/pages/RoomMembersPage.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalD
1717
import useLocalize from '@hooks/useLocalize';
1818
import useThemeStyles from '@hooks/useThemeStyles';
1919
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
20+
import localeCompare from '@libs/LocaleCompare';
2021
import Log from '@libs/Log';
2122
import Navigation from '@libs/Navigation/Navigation';
2223
import type {RoomMembersNavigatorParamList} from '@libs/Navigation/types';
@@ -201,7 +202,7 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) {
201202
});
202203
});
203204

204-
result = result.sort((value1, value2) => value1.text.localeCompare(value2.text.toLowerCase()));
205+
result = result.sort((value1, value2) => localeCompare(value1.text, value2.text));
205206

206207
return result;
207208
};

src/pages/workspace/WorkspaceNewRoomPage.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import usePrevious from '@hooks/usePrevious';
2323
import useThemeStyles from '@hooks/useThemeStyles';
2424
import useWindowDimensions from '@hooks/useWindowDimensions';
2525
import * as ErrorUtils from '@libs/ErrorUtils';
26+
import localeCompare from '@libs/LocaleCompare';
2627
import Navigation from '@libs/Navigation/Navigation';
2728
import * as PolicyUtils from '@libs/PolicyUtils';
2829
import * as ReportUtils from '@libs/ReportUtils';
@@ -77,7 +78,7 @@ function WorkspaceNewRoomPage({policies, reports, formState, session, activePoli
7778
label: policy.name,
7879
value: policy.id,
7980
}))
80-
.sort((a, b) => a.label.toLowerCase().localeCompare(b.label.toLowerCase())) ?? [],
81+
.sort((a, b) => localeCompare(a.label, b.label)) ?? [],
8182
[policies],
8283
);
8384
const [policyID, setPolicyID] = useState<string>(() => {

src/pages/workspace/WorkspacesListPage.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import useNetwork from '@hooks/useNetwork';
2323
import useTheme from '@hooks/useTheme';
2424
import useThemeStyles from '@hooks/useThemeStyles';
2525
import useWindowDimensions from '@hooks/useWindowDimensions';
26+
import localeCompare from '@libs/LocaleCompare';
2627
import Navigation from '@libs/Navigation/Navigation';
2728
import * as PolicyUtils from '@libs/PolicyUtils';
2829
import * as ReportUtils from '@libs/ReportUtils';
@@ -308,7 +309,7 @@ function WorkspacesListPage({policies, allPolicyMembers, reimbursementAccount, r
308309
type: policy.type,
309310
}),
310311
)
311-
.sort((a, b) => a.title.toLowerCase().localeCompare(b.title.toLowerCase()));
312+
.sort((a, b) => localeCompare(a.title, b.title));
312313
}, [reimbursementAccount?.errors, policies, isOffline, theme.textLight, allPolicyMembers, policyRooms]);
313314

314315
if (isEmptyObject(workspaces)) {

0 commit comments

Comments
 (0)