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>
This commit is contained in:
tlongwell-block
2026-06-17 21:11:06 -04:00
committed by GitHub
parent 25001eb741
commit aadbe67354

View File

@@ -105,6 +105,9 @@ export function MembersSidebar({
const [inviteSubmissionErrors, setInviteSubmissionErrors] = React.useState< const [inviteSubmissionErrors, setInviteSubmissionErrors] = React.useState<
AddChannelMembersResult["errors"] AddChannelMembersResult["errors"]
>([]); >([]);
const [addingMemberPubkeys, setAddingMemberPubkeys] = React.useState<
ReadonlySet<string>
>(() => new Set());
const membersQuery = useChannelMembersQuery(channelId, open); const membersQuery = useChannelMembersQuery(channelId, open);
const addMembersMutation = useAddChannelMembersMutation(channelId); const addMembersMutation = useAddChannelMembersMutation(channelId);
const changeRoleMutation = useMutation({ const changeRoleMutation = useMutation({
@@ -410,6 +413,7 @@ export function MembersSidebar({
if (!open) { if (!open) {
setSearchQuery(""); setSearchQuery("");
setInviteSubmissionErrors([]); setInviteSubmissionErrors([]);
setAddingMemberPubkeys(new Set());
return; return;
} }
@@ -421,13 +425,25 @@ export function MembersSidebar({
} }
async function handleAddSearchResult(user: UserSearchResult) { async function handleAddSearchResult(user: UserSearchResult) {
setInviteSubmissionErrors([]); if (addingMemberPubkeys.has(user.pubkey)) {
return;
}
const result = await addMembersMutation.mutateAsync({ setAddingMemberPubkeys((prev) => new Set(prev).add(user.pubkey));
pubkeys: [user.pubkey],
role: user.isAgent ? "bot" : "member", try {
}); const result = await addMembersMutation.mutateAsync({
setInviteSubmissionErrors(result.errors); 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) { function renderMemberCard(member: ChannelMember, memberIsBot: boolean) {
@@ -507,7 +523,7 @@ export function MembersSidebar({
autoCorrect="off" autoCorrect="off"
className={MODAL_SEARCH_INPUT_CLASS} className={MODAL_SEARCH_INPUT_CLASS}
data-testid="channel-management-search-users" data-testid="channel-management-search-users"
disabled={addMembersMutation.isPending || isArchived} disabled={isArchived}
id="channel-management-search-users" id="channel-management-search-users"
onChange={(event) => { onChange={(event) => {
setSearchQuery(event.target.value); setSearchQuery(event.target.value);
@@ -559,7 +575,7 @@ export function MembersSidebar({
{addSearchResults.map((user) => ( {addSearchResults.map((user) => (
<AddMemberSearchResultRow <AddMemberSearchResultRow
disabled={ disabled={
addMembersMutation.isPending || isArchived addingMemberPubkeys.has(user.pubkey) || isArchived
} }
key={user.pubkey} key={user.pubkey}
onSelect={(selectedUser) => { onSelect={(selectedUser) => {