From aadbe67354f407a31c913de87b3e3d698fc3dddf Mon Sep 17 00:00:00 2001 From: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com> Date: Wed, 17 Jun 2026 21:11:06 -0400 Subject: [PATCH] fix(desktop): keep MembersSidebar input usable while an add is in flight (#1106) Signed-off-by: npub1xhqc4cnnln86lqxk983qulu8yxusfxfhntwl75es2jkvy5zvz26qzr0685 <35c18ae273fccfaf80d629e20e7f8721b90499379addff533054acc2504c12b4@sprout-oss.stage.blox.sqprod.co> Co-authored-by: npub1jmc9dt2lyvzu3h0kxlwxt5zg4fxp9476awyxw6gwxn72g6cw7exqs64whm <96f056ad5f2305c8ddf637dc65d048aa4c12d7daeb8867690e34fca46b0ef64c@sprout-oss.stage.blox.sqprod.co> Co-authored-by: npub1xhqc4cnnln86lqxk983qulu8yxusfxfhntwl75es2jkvy5zvz26qzr0685 <35c18ae273fccfaf80d629e20e7f8721b90499379addff533054acc2504c12b4@sprout-oss.stage.blox.sqprod.co> --- .../features/channels/ui/MembersSidebar.tsx | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/desktop/src/features/channels/ui/MembersSidebar.tsx b/desktop/src/features/channels/ui/MembersSidebar.tsx index 4f74c03fe5..b29f19e75f 100644 --- a/desktop/src/features/channels/ui/MembersSidebar.tsx +++ b/desktop/src/features/channels/ui/MembersSidebar.tsx @@ -105,6 +105,9 @@ export function MembersSidebar({ const [inviteSubmissionErrors, setInviteSubmissionErrors] = React.useState< AddChannelMembersResult["errors"] >([]); + const [addingMemberPubkeys, setAddingMemberPubkeys] = React.useState< + ReadonlySet + >(() => new Set()); const membersQuery = useChannelMembersQuery(channelId, open); const addMembersMutation = useAddChannelMembersMutation(channelId); const changeRoleMutation = useMutation({ @@ -410,6 +413,7 @@ export function MembersSidebar({ if (!open) { setSearchQuery(""); setInviteSubmissionErrors([]); + setAddingMemberPubkeys(new Set()); return; } @@ -421,13 +425,25 @@ export function MembersSidebar({ } async function handleAddSearchResult(user: UserSearchResult) { - setInviteSubmissionErrors([]); + if (addingMemberPubkeys.has(user.pubkey)) { + return; + } - const result = await addMembersMutation.mutateAsync({ - pubkeys: [user.pubkey], - role: user.isAgent ? "bot" : "member", - }); - setInviteSubmissionErrors(result.errors); + setAddingMemberPubkeys((prev) => new Set(prev).add(user.pubkey)); + + try { + const result = await addMembersMutation.mutateAsync({ + pubkeys: [user.pubkey], + role: user.isAgent ? "bot" : "member", + }); + setInviteSubmissionErrors((prev) => [...prev, ...result.errors]); + } finally { + setAddingMemberPubkeys((prev) => { + const next = new Set(prev); + next.delete(user.pubkey); + return next; + }); + } } function renderMemberCard(member: ChannelMember, memberIsBot: boolean) { @@ -507,7 +523,7 @@ export function MembersSidebar({ autoCorrect="off" className={MODAL_SEARCH_INPUT_CLASS} data-testid="channel-management-search-users" - disabled={addMembersMutation.isPending || isArchived} + disabled={isArchived} id="channel-management-search-users" onChange={(event) => { setSearchQuery(event.target.value); @@ -559,7 +575,7 @@ export function MembersSidebar({ {addSearchResults.map((user) => ( {