From 2bc9dd43077ca10e1821e452241de86d228f86a8 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sun, 17 Jul 2016 18:32:48 +0100 Subject: [PATCH 1/2] hopefully fix vector-im/vector-web#1813 --- .../views/rooms/InviteMemberList.js | 32 +++++++++++++++---- src/createRoom.js | 4 +++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/components/views/rooms/InviteMemberList.js b/src/components/views/rooms/InviteMemberList.js index 5246e2e54dd..c1c83e533be 100644 --- a/src/components/views/rooms/InviteMemberList.js +++ b/src/components/views/rooms/InviteMemberList.js @@ -37,12 +37,31 @@ module.exports = React.createClass({ }, componentWillMount: function() { - this._room = MatrixClientPeg.get().getRoom(this.props.roomId); + var cli = MatrixClientPeg.get(); + cli.on("RoomState.members", this.onRoomStateMember); + this._emailEntity = null; + + // we have to update the list whenever membership changes + // particularly to avoid bug https://github.com/vector-im/vector-web/issues/1813 + this._updateList(); + }, + + componentDidMount: function() { + // initialise the email tile + this.onSearchQueryChanged(''); + }, + + componentWillUnmount: function() { + var cli = MatrixClientPeg.get(); + if (cli) { + cli.removeListener("RoomState.members", this.onRoomStateMember); + } + }, + + _updateList: function() { + this._room = MatrixClientPeg.get().getRoom(this.props.roomId); // Load the complete user list for inviting new users - // TODO: Keep this list bleeding-edge up-to-date. Practically speaking, - // it will do for now not being updated as random new users join different - // rooms as this list will be reloaded every room swap. if (this._room) { this._userList = MatrixClientPeg.get().getUsers().filter((u) => { return !this._room.hasMembershipState(u.userId, "join"); @@ -50,9 +69,8 @@ module.exports = React.createClass({ } }, - componentDidMount: function() { - // initialise the email tile - this.onSearchQueryChanged(''); + onRoomStateMember: function(ev, state, member) { + this._updateList(); }, onInvite: function(ev) { diff --git a/src/createRoom.js b/src/createRoom.js index 658561e78a1..3a56dc1be30 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -69,6 +69,10 @@ function createRoom(opts) { return client.createRoom(createOpts).finally(function() { modal.close(); }).then(function(res) { + // NB createRoom doesn't block on the client seeing the echo that the + // room has been created, so we race here with the client knowing that + // the room exists, causing things like + // https://github.com/vector-im/vector-web/issues/1813 dis.dispatch({ action: 'view_room', room_id: res.room_id From 0553d806d71d47a35e77ebd0e87d2c51a36d1b5c Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sun, 17 Jul 2016 18:40:54 +0100 Subject: [PATCH 2/2] stop re-invites --- src/components/views/rooms/InviteMemberList.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/InviteMemberList.js b/src/components/views/rooms/InviteMemberList.js index c1c83e533be..47425972292 100644 --- a/src/components/views/rooms/InviteMemberList.js +++ b/src/components/views/rooms/InviteMemberList.js @@ -64,7 +64,8 @@ module.exports = React.createClass({ // Load the complete user list for inviting new users if (this._room) { this._userList = MatrixClientPeg.get().getUsers().filter((u) => { - return !this._room.hasMembershipState(u.userId, "join"); + return (!this._room.hasMembershipState(u.userId, "join") && + !this._room.hasMembershipState(u.userId, "invite")); }); } },