From 1a961358f0fe7956cefc246281960c9761f500ae Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Jan 2020 14:40:25 -0700 Subject: [PATCH] Don't show recents and suggestions for users already in the room --- src/components/views/dialogs/InviteDialog.js | 28 +++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index 7448b1a5a3..e176d3b105 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -300,12 +300,24 @@ export default class InviteDialog extends React.PureComponent { throw new Error("When using KIND_INVITE a roomId is required for an InviteDialog"); } + let alreadyInvited = []; + if (props.roomId) { + const room = MatrixClientPeg.get().getRoom(props.roomId); + if (!room) throw new Error("Room ID given to InviteDialog does not look like a room"); + alreadyInvited = [ + ...room.getMembersWithMembership('invite'), + ...room.getMembersWithMembership('join'), + ...room.getMembersWithMembership('ban'), // so we don't try to invite them + ].map(m => m.userId); + } + + this.state = { targets: [], // array of Member objects (see interface above) filterText: "", - recents: this._buildRecents(), + recents: this._buildRecents(alreadyInvited), numRecentsShown: INITIAL_ROOMS_SHOWN, - suggestions: this._buildSuggestions(), + suggestions: this._buildSuggestions(alreadyInvited), numSuggestionsShown: INITIAL_ROOMS_SHOWN, serverResultsMixin: [], // { user: DirectoryMember, userId: string }[], like recents and suggestions threepidResultsMixin: [], // { user: ThreepidMember, userId: string}[], like recents and suggestions @@ -320,10 +332,13 @@ export default class InviteDialog extends React.PureComponent { this._editorRef = createRef(); } - _buildRecents(): {userId: string, user: RoomMember, lastActive: number} { + _buildRecents(excludedTargetIds: string[]): {userId: string, user: RoomMember, lastActive: number} { const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals(); const recents = []; for (const userId in rooms) { + // Filter out user IDs that are already in the room / should be excluded + if (excludedTargetIds.includes(userId)) continue; + const room = rooms[userId]; const member = room.getMember(userId); if (!member) continue; // just skip people who don't have memberships for some reason @@ -342,7 +357,7 @@ export default class InviteDialog extends React.PureComponent { return recents; } - _buildSuggestions(): {userId: string, user: RoomMember} { + _buildSuggestions(excludedTargetIds: string[]): {userId: string, user: RoomMember} { const maxConsideredMembers = 200; const client = MatrixClientPeg.get(); const excludedUserIds = [client.getUserId(), SdkConfig.get()['welcomeUserId']]; @@ -359,6 +374,11 @@ export default class InviteDialog extends React.PureComponent { const joinedMembers = room.getJoinedMembers().filter(u => !excludedUserIds.includes(u.userId)); for (const member of joinedMembers) { + // Filter out user IDs that are already in the room / should be excluded + if (excludedTargetIds.includes(member.userId)) { + continue; + } + if (!members[member.userId]) { members[member.userId] = { member: member,