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({
{membersQuery.isLoading