Skip to content

Commit c6f94d6

Browse files
committed
fix: update already overkill sorting logic for members sorting
1 parent 48d5275 commit c6f94d6

File tree

2 files changed

+42
-11
lines changed

2 files changed

+42
-11
lines changed

ts/components/dialog/UpdateGroupMembersDialog.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ const MemberList = (props: {
5656
const isV2Group = useSelectedIsGroupV2();
5757

5858
const groupAdmins = useGroupAdmins(convoId);
59-
const groupMembers = useSortedGroupMembers(convoId);
59+
const groupMembersLegacy = useSortedGroupMembers(convoId);
6060
const groupMembers03Group = useStateOf03GroupMembers(convoId);
6161

6262
const sortedMembersNon03 = useMemo(
63-
() => [...groupMembers].sort(m => (groupAdmins?.includes(m) ? -1 : 0)),
64-
[groupMembers, groupAdmins]
63+
() => [...groupMembersLegacy].sort(m => (groupAdmins?.includes(m) ? -1 : 0)),
64+
[groupMembersLegacy, groupAdmins]
6565
);
6666

6767
const sortedMembers = isV2Group ? groupMembers03Group.map(m => m.pubkeyHex) : sortedMembersNon03;

ts/state/selectors/groups.ts

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import { type GroupMemberGetRedux } from '../ducks/types/groupReduxTypes';
99
import { StateType } from '../reducer';
1010
import { assertUnreachable } from '../../types/sqlSharedTypes';
1111
import { UserUtils } from '../../session/utils';
12-
import { useConversationsNicknameRealNameOrShortenPubkey } from '../../hooks/useParamSelector';
12+
import {
13+
useConversationsNicknameRealNameOrShortenPubkey,
14+
useWeAreAdmin,
15+
} from '../../hooks/useParamSelector';
1316

1417
const selectLibGroupsState = (state: StateType): GroupState => state.groups;
1518

@@ -266,7 +269,22 @@ export function useGroupAvatarChangeFromUIPending() {
266269
return useSelector(selectGroupAvatarChangeFromUIPending);
267270
}
268271

269-
function getSortingOrderForStatus(memberStatus: MemberStateGroupV2) {
272+
function getSortingOrderForStatus(memberStatus: MemberStateGroupV2, weAreAdmin: boolean) {
273+
// Non-admins don't need to see the details as they cannot do anything to change their state.
274+
// so we only group members by You, Members,
275+
if (!weAreAdmin) {
276+
switch (memberStatus) {
277+
case 'PROMOTION_FAILED':
278+
case 'PROMOTION_NOT_SENT':
279+
case 'PROMOTION_SENDING':
280+
case 'PROMOTION_SENT':
281+
case 'PROMOTION_UNKNOWN':
282+
case 'PROMOTION_ACCEPTED':
283+
return 0;
284+
default:
285+
return 10;
286+
}
287+
}
270288
switch (memberStatus) {
271289
case 'INVITE_FAILED':
272290
return 0;
@@ -305,23 +323,35 @@ function getSortingOrderForStatus(memberStatus: MemberStateGroupV2) {
305323
export function useStateOf03GroupMembers(convoId?: string) {
306324
const us = UserUtils.getOurPubKeyStrFromCache();
307325
const unsortedMembers = useSelector((state: StateType) => selectMembersOfGroup(state, convoId));
326+
const weAreAdmin = useWeAreAdmin(convoId);
308327

309328
const names = useConversationsNicknameRealNameOrShortenPubkey(
310329
unsortedMembers.map(m => m.pubkeyHex)
311330
);
312331

332+
// Damn this sorting logic is overkill x2.
333+
// The sorting logic is as follows:
334+
// - when we are an admin, we want to sort by the following order:
335+
// - Each states of invite/promotion/etc separate, but You always at the top **per section**
336+
// - when we are **not** an admin, we want to sort by the following order:
337+
// - You
338+
// - Admins (without You as it is already at the top)
339+
// - Others (same as above)
313340
const sorted = useMemo(() => {
314-
// damn this is overkill
315341
return sortBy(
316342
unsortedMembers,
317343
item => {
318-
const sortingOrder = getSortingOrderForStatus(item.memberStatus);
344+
// when we are not an admin, we want the current user (You) to be always be at the top
345+
if (!weAreAdmin && item.pubkeyHex === us) {
346+
return -1;
347+
}
348+
349+
const sortingOrder = getSortingOrderForStatus(item.memberStatus, weAreAdmin);
319350
return sortingOrder;
320351
},
321352
item => {
322-
// per section, we want "us" first, then "nickname || displayName || pubkey"
323-
324-
if (item.pubkeyHex === us) {
353+
// when we are an admin, we want to sort "You" at the top per sections
354+
if (weAreAdmin && item.pubkeyHex === us) {
325355
return -1;
326356
}
327357
const index = unsortedMembers.findIndex(p => p.pubkeyHex === item.pubkeyHex);
@@ -332,6 +362,7 @@ export function useStateOf03GroupMembers(convoId?: string) {
332362
return names[index].toLowerCase();
333363
}
334364
);
335-
}, [unsortedMembers, us, names]);
365+
}, [unsortedMembers, us, names, weAreAdmin]);
366+
336367
return sorted;
337368
}

0 commit comments

Comments
 (0)