At /user, view member of current room

With the fallback of existing behaviour, which is UserView (no middle panel and no avatar, display name).

To improve, MemberInfo should probably track the current roomId and userId and then update the view asynchronously by re-fetching the member object when either roomId or userId change.

Also, it should be hitting the profile API to get the user's avatar if a room hasn't been specified.
pull/21833/head
Luke Barnard 2017-08-10 13:12:50 +01:00
parent 390e77ee22
commit 07633fe67f
2 changed files with 36 additions and 12 deletions

View File

@ -301,13 +301,13 @@ export default React.createClass({
case PageTypes.UserView: case PageTypes.UserView:
page_element = null; // deliberately null for now page_element = null; // deliberately null for now
right_panel = <RightPanel userId={this.props.viewUserId} opacity={this.props.rightOpacity} />; right_panel = <RightPanel opacity={this.props.rightOpacity} />;
break; break;
case PageTypes.GroupView: case PageTypes.GroupView:
page_element = <GroupView page_element = <GroupView
groupId={this.props.currentGroupId} groupId={this.props.currentGroupId}
/>; />;
//right_panel = <RightPanel userId={this.props.viewUserId} opacity={this.props.rightOpacity} />; //right_panel = <RightPanel opacity={this.props.rightOpacity} />;
break; break;
} }

View File

@ -448,6 +448,7 @@ module.exports = React.createClass({
}); });
}, 0); }, 0);
} }
this.notifyNewScreen('user/' + payload.member.userId);
break; break;
case 'view_room': case 'view_room':
// Takes either a room ID or room alias: if switching to a room the client is already // 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) { } else if (screen.indexOf('user/') == 0) {
const userId = screen.substring(5); const userId = screen.substring(5);
// 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') { if (params.action === 'chat') {
this._chatCreateOrReuse(userId); this._chatCreateOrReuse(userId);
return; return;
} }
this.setState({ viewUserId: userId }); // Get the member object for the current room, if a current room is set or
this._setPage(PageTypes.UserView); // we have a last_room in localStorage. The user might not be a member of
this.notifyNewScreen('user/' + userId); // this room (in which case member will be falsey).
const member = new Matrix.RoomMember(null, userId); 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) { 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(roomId, userId);
this._setPage(PageTypes.UserView);
}
dis.dispatch({ dis.dispatch({
action: 'view_user', action: 'view_user',
member: member, member: member,
}); });
} });
} else if (screen.indexOf('group/') == 0) { } else if (screen.indexOf('group/') == 0) {
const groupId = screen.substring(6); const groupId = screen.substring(6);