diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index 093fae5d7b..0790a5766e 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -301,13 +301,13 @@ export default React.createClass({ case PageTypes.UserView: page_element = null; // deliberately null for now - right_panel = ; + right_panel = ; break; case PageTypes.GroupView: page_element = ; - //right_panel = ; + //right_panel = ; break; } diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 6fdec80f38..930c618f7a 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -448,6 +448,7 @@ module.exports = React.createClass({ }); }, 0); } + this.notifyNewScreen('user/' + payload.member.userId); break; case 'view_room': // Takes either a room ID or room alias: if switching to a room the client is already @@ -1203,21 +1204,44 @@ module.exports = React.createClass({ } else if (screen.indexOf('user/') == 0) { const userId = screen.substring(5); - if (params.action === 'chat') { - this._chatCreateOrReuse(userId); - return; - } + // Wait for the first sync so that `getRoom` gives us a room object if it's + // in the sync response + const waitFor = this.firstSyncPromise ? + this.firstSyncPromise.promise : Promise.resolve(); + waitFor.then(() => { + if (params.action === 'chat') { + this._chatCreateOrReuse(userId); + return; + } - this.setState({ viewUserId: userId }); - this._setPage(PageTypes.UserView); - this.notifyNewScreen('user/' + userId); - const member = new Matrix.RoomMember(null, userId); - if (member) { + // Get the member object for the current room, if a current room is set or + // we have a last_room in localStorage. The user might not be a member of + // this room (in which case member will be falsey). + let member; + const roomId = this.state.currentRoomId || localStorage.getItem('mx_last_room_id'); + if (roomId) { + const room = MatrixClientPeg.get().getRoom(roomId); + if (room) { + member = room.getMember(userId); + } + } + + if (member) { + // This user is a member of this room, so view the room + dis.dispatch({ + action: 'view_room', + room_id: roomId, + }); + } else { + // This user is not a member of this room, show the user view + member = new Matrix.RoomMember(null, userId); + this._setPage(PageTypes.UserView); + } dis.dispatch({ action: 'view_user', member: member, }); - } + }); } else if (screen.indexOf('group/') == 0) { const groupId = screen.substring(6);