From 4bb06b8aedd25cc35384b6acde9b5f023b18d310 Mon Sep 17 00:00:00 2001 From: Taylor Ho Date: Thu, 21 May 2026 22:34:35 -0700 Subject: [PATCH] feat: sort sidebar bots online-first, then alphabetical MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a sortedBots memo in MembersSidebar that prioritizes online agents at the top. Within each presence group (online vs not-online), agents sort alphabetically by display name. No more recency-based reordering — the list stays stable. --- .../features/channels/ui/MembersSidebar.tsx | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/desktop/src/features/channels/ui/MembersSidebar.tsx b/desktop/src/features/channels/ui/MembersSidebar.tsx index 22c052620d..19563834cc 100644 --- a/desktop/src/features/channels/ui/MembersSidebar.tsx +++ b/desktop/src/features/channels/ui/MembersSidebar.tsx @@ -96,6 +96,17 @@ export function MembersSidebar({ enabled: open && rawMembers.length > 0, }); + const presence = memberPresenceQuery.data; + const sortedBots = React.useMemo(() => { + if (!presence) return bots; + return [...bots].sort((a, b) => { + const aOnline = presence[normalizePubkey(a.pubkey)] === "online" ? 0 : 1; + const bOnline = presence[normalizePubkey(b.pubkey)] === "online" ? 0 : 1; + if (aOnline !== bOnline) return aOnline - bOnline; + return formatMemberName(a).localeCompare(formatMemberName(b)); + }); + }, [bots, presence]); + const selfMember = rawMembers.find((member) => member.pubkey === currentPubkey) ?? null; const canManageMembers = @@ -122,11 +133,11 @@ export function MembersSidebar({ ); const controllableManagedBots = React.useMemo( () => - bots.flatMap((member) => { + sortedBots.flatMap((member) => { const agent = managedAgentByPubkey.get(normalizePubkey(member.pubkey)); return agent ? [agent] : []; }), - [bots, managedAgentByPubkey], + [sortedBots, managedAgentByPubkey], ); const canRemoveMember = React.useCallback( (member: ChannelMember) => { @@ -141,7 +152,7 @@ export function MembersSidebar({ ); const removableManagedBots = React.useMemo( () => - bots.flatMap((member) => { + sortedBots.flatMap((member) => { if (!canRemoveMember(member)) { return []; } @@ -149,7 +160,7 @@ export function MembersSidebar({ const agent = managedAgentByPubkey.get(normalizePubkey(member.pubkey)); return agent ? [agent] : []; }), - [bots, canRemoveMember, managedAgentByPubkey], + [sortedBots, canRemoveMember, managedAgentByPubkey], ); const { actionErrorMessage, @@ -279,7 +290,7 @@ export function MembersSidebar({

Bots

- {bots.length} + {sortedBots.length}
{canAddAgents ? ( @@ -322,8 +333,8 @@ export function MembersSidebar({
- {bots.length > 0 ? ( - bots.map((member) => renderMemberCard(member, true)) + {sortedBots.length > 0 ? ( + sortedBots.map((member) => renderMemberCard(member, true)) ) : (

{membersQuery.isLoading