From 82abfedad5bb7e87e2eb31e9250c91d7600ef7aa Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 9 Jan 2025 09:24:51 +1100 Subject: [PATCH] fix: sorting order for group depending on statuses --- ts/components/MemberListItem.tsx | 2 +- ts/state/ducks/metaGroups.ts | 5 +++++ ts/state/selectors/groups.ts | 32 ++++++++++++++++++++------------ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/ts/components/MemberListItem.tsx b/ts/components/MemberListItem.tsx index 3f54d4276..1bfc66f31 100644 --- a/ts/components/MemberListItem.tsx +++ b/ts/components/MemberListItem.tsx @@ -174,7 +174,7 @@ function localisedStatusFromMemberStatus(memberStatus: MemberStateGroupV2) { case 'REMOVED_UNKNOWN': // fallback, hopefully won't happen in production case 'REMOVED_MEMBER': // we want pending removal members at the end of the "invite" states case 'REMOVED_MEMBER_AND_MESSAGES': - return null; // no text for those 3 pending removal states + return window.i18n('groupPendingRemoval'); // no text for those 3 pending removal states case 'PROMOTION_FAILED': return window.i18n('adminPromotionFailed'); case 'PROMOTION_NOT_SENT': diff --git a/ts/state/ducks/metaGroups.ts b/ts/state/ducks/metaGroups.ts index 66499cacd..e0fe15256 100644 --- a/ts/state/ducks/metaGroups.ts +++ b/ts/state/ducks/metaGroups.ts @@ -423,6 +423,10 @@ const refreshGroupDetailsFromWrapper = createAsyncThunk( const infos = await MetaGroupWrapperActions.infoGet(groupPk); const members = await MetaGroupWrapperActions.memberGetAll(groupPk); + if (window.sessionFeatureFlags.debug.debugLibsessionDumps) { + window.log.info(`groupInfo after refreshGroupDetailsFromWrapper: ${stringify(infos)}`); + window.log.info(`groupMembers after refreshGroupDetailsFromWrapper: ${stringify(members)}`); + } return { groupPk, infos, members }; } catch (e) { window.log.warn('refreshGroupDetailsFromWrapper failed with ', e.message); @@ -748,6 +752,7 @@ async function handleMemberRemovedFromUI({ // We don't revoke the member's token right away. Instead we schedule a `GroupPendingRemovals` // which will deal with the revokes of all of them together. await GroupPendingRemovals.addJob({ groupPk }); + window.inboxStore?.dispatch(refreshGroupDetailsFromWrapper({ groupPk }) as any); // Build a GroupUpdateMessage to be sent if that member was kicked by us. const createAtNetworkTimestamp = NetworkTime.now(); diff --git a/ts/state/selectors/groups.ts b/ts/state/selectors/groups.ts index f5efbe451..ec3017f64 100644 --- a/ts/state/selectors/groups.ts +++ b/ts/state/selectors/groups.ts @@ -272,19 +272,27 @@ export function useStateOf03GroupMembers(convoId?: string) { ); const sorted = useMemo(() => { - // needing an index like this outside of lodash is not pretty, - // but sortBy doesn't provide the index in the callback - let index = 0; - return sortBy(unsortedMembers, item => { - const stateSortingOrder = getSortingOrderForStatus(item.memberStatus); - const sortingOrder = [ - stateSortingOrder, + // damn this is overkill + return sortBy( + unsortedMembers, + item => { + const sortingOrder = getSortingOrderForStatus(item.memberStatus); + return sortingOrder; + }, + item => { // per section, we want "us" first, then "nickname || displayName || pubkey" - item.pubkeyHex === us ? -1 : names[index], - ]; - index++; - return sortingOrder; - }); + + if (item.pubkeyHex === us) { + return -1; + } + const index = unsortedMembers.findIndex(p => p.pubkeyHex === item.pubkeyHex); + if (index < 0 || index >= names.length) { + throw new Error('this should never happen'); + } + + return names[index].toLowerCase(); + } + ); }, [unsortedMembers, us, names]); return sorted; }