From bc71092b817b73023e80813e43958175cde7aa5c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 30 Jan 2020 19:27:59 +0000 Subject: [PATCH 1/3] Use Sets instead of array scans and simplify hiding of invalid users to invite Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/InviteDialog.js | 25 +++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index f05f0477ee..c370b7c9fe 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -301,18 +301,16 @@ export default class InviteDialog extends React.PureComponent { throw new Error("When using KIND_INVITE a roomId is required for an InviteDialog"); } - let alreadyInvited = []; + const alreadyInvited = new Set([MatrixClientPeg.get().getUserId(), SdkConfig.get()['welcomeUserId']]); 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); + room.getMembersWithMembership('invite').forEach(m => alreadyInvited.add(m.userId)); + room.getMembersWithMembership('join').forEach(m => alreadyInvited.add(m.userId)); + // add banned users, so we don't try to invite them + room.getMembersWithMembership('ban').forEach(m => alreadyInvited.add(m.userId)); } - this.state = { targets: [], // array of Member objects (see interface above) filterText: "", @@ -333,12 +331,12 @@ export default class InviteDialog extends React.PureComponent { this._editorRef = createRef(); } - _buildRecents(excludedTargetIds: string[]): {userId: string, user: RoomMember, lastActive: number} { + _buildRecents(excludedTargetIds: Set): {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)) { + if (excludedTargetIds.has(userId)) { console.warn(`[Invite:Recents] Excluding ${userId} from recents`); continue; } @@ -381,10 +379,9 @@ export default class InviteDialog extends React.PureComponent { return recents; } - _buildSuggestions(excludedTargetIds: string[]): {userId: string, user: RoomMember} { + _buildSuggestions(excludedTargetIds: Set): {userId: string, user: RoomMember} { const maxConsideredMembers = 200; const client = MatrixClientPeg.get(); - const excludedUserIds = [client.getUserId(), SdkConfig.get()['welcomeUserId']]; const joinedRooms = client.getRooms() .filter(r => r.getMyMembership() === 'join') .filter(r => r.getJoinedMemberCount() <= maxConsideredMembers); @@ -396,10 +393,10 @@ export default class InviteDialog extends React.PureComponent { return members; // Do nothing } - const joinedMembers = room.getJoinedMembers().filter(u => !excludedUserIds.includes(u.userId)); + const joinedMembers = room.getJoinedMembers().filter(u => !excludedTargetIds.has(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)) { + if (excludedTargetIds.has(member.userId)) { continue; } @@ -456,7 +453,7 @@ export default class InviteDialog extends React.PureComponent { const events = room.getLiveTimeline().getEvents(); // timelines are most recent last for (let i = events.length - 1; i >= Math.max(0, events.length - maxMessagesConsidered); i--) { const ev = events[i]; - if (excludedUserIds.includes(ev.getSender())) { + if (excludedTargetIds.has(ev.getSender())) { continue; } if (ev.getTs() <= earliestAgeConsidered) { From 1e09399dd6e8469f6a15382120dae5b617ca7dc2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 30 Jan 2020 21:01:55 +0000 Subject: [PATCH 2/3] delint and collapse two consecutive filter operations Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/InviteDialog.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index c370b7c9fe..e2741b36f9 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -381,10 +381,8 @@ export default class InviteDialog extends React.PureComponent { _buildSuggestions(excludedTargetIds: Set): {userId: string, user: RoomMember} { const maxConsideredMembers = 200; - const client = MatrixClientPeg.get(); - const joinedRooms = client.getRooms() - .filter(r => r.getMyMembership() === 'join') - .filter(r => r.getJoinedMemberCount() <= maxConsideredMembers); + const joinedRooms = MatrixClientPeg.get().getRooms() + .filter(r => r.getMyMembership() === 'join' && r.getJoinedMemberCount() <= maxConsideredMembers); // Generates { userId: {member, rooms[]} } const memberRooms = joinedRooms.reduce((members, room) => { From 7db6f89a9fcfa803c22c2b04e59e5f124e6a449b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 30 Jan 2020 21:07:32 +0000 Subject: [PATCH 3/3] hmm, there were two things using the client :(( Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/InviteDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index e2741b36f9..8fec2437f6 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -435,7 +435,7 @@ export default class InviteDialog extends React.PureComponent { // room to see who has sent a message in the last few hours, and giving them a score // which correlates to the freshness of their message. In theory, this results in suggestions // which are closer to "continue this conversation" rather than "this person exists". - const trueJoinedRooms = client.getRooms().filter(r => r.getMyMembership() === 'join'); + const trueJoinedRooms = MatrixClientPeg.get().getRooms().filter(r => r.getMyMembership() === 'join'); const now = (new Date()).getTime(); const earliestAgeConsidered = now - (60 * 60 * 1000); // 1 hour ago const maxMessagesConsidered = 50; // so we don't iterate over a huge amount of traffic