From 2bc9dd43077ca10e1821e452241de86d228f86a8 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sun, 17 Jul 2016 18:32:48 +0100 Subject: [PATCH] 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 5246e2e54d..c1c83e533b 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 658561e78a..3a56dc1be3 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