diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 662d322fb4..5bf192dfc6 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -159,6 +159,7 @@ module.exports = React.createClass({ MatrixClientPeg.get().on("Room.name", this.onRoomName); MatrixClientPeg.get().on("Room.accountData", this.onRoomAccountData); MatrixClientPeg.get().on("RoomState.members", this.onRoomStateMember); + MatrixClientPeg.get().on("RoomMember.membership", this.onRoomMemberMembership); MatrixClientPeg.get().on("accountData", this.onAccountData); this.tabComplete = new TabComplete({ @@ -347,6 +348,7 @@ module.exports = React.createClass({ MatrixClientPeg.get().removeListener("Room.name", this.onRoomName); MatrixClientPeg.get().removeListener("Room.accountData", this.onRoomAccountData); MatrixClientPeg.get().removeListener("RoomState.members", this.onRoomStateMember); + MatrixClientPeg.get().removeListener("RoomMember.membership", this.onRoomMemberMembership); MatrixClientPeg.get().removeListener("accountData", this.onAccountData); } @@ -612,6 +614,12 @@ module.exports = React.createClass({ this._updateRoomMembers(); }, + onRoomMemberMembership: function(ev, member, oldMembership) { + if (member.userId == MatrixClientPeg.get().credentials.userId) { + this.forceUpdate(); + } + }, + // rate limited because a power level change will emit an event for every // member in the room. _updateRoomMembers: new rate_limited_func(function() { @@ -1456,6 +1464,7 @@ module.exports = React.createClass({ />
{ name } : fallback; + }, + render: function() { var joinBlock, previewBlock; @@ -89,6 +97,16 @@ module.exports = React.createClass({
); } + const myMember = this.props.room ? this.props.room.currentState.members[ + MatrixClientPeg.get().credentials.userId + ] : null; + const kicked = ( + myMember && + myMember.membership == 'leave' && + myMember.events.member.getSender() != MatrixClientPeg.get().credentials.userId + ); + const banned = myMember && myMember.membership == 'ban'; + if (this.props.inviterName) { var emailMatchBlock; if (this.props.invitedEmail) { @@ -122,8 +140,33 @@ module.exports = React.createClass({
); - } - else if (this.props.error) { + } else if (kicked || banned) { + const verb = kicked ? 'kicked' : 'banned'; + const roomName = this._roomNameElement('this room'); + const kickerMember = this.props.room.currentState.getMember( + myMember.events.member.getSender() + ); + const kickerName = kickerMember ? + kickerMember.name : myMember.events.member.getSender(); + let reason; + if (myMember.events.member.getContent().reason) { + reason =
Reason: {myMember.events.member.getContent().reason}
+ } + let rejoinBlock; + if (!banned) { + rejoinBlock =
Rejoin
; + } + joinBlock = ( +
+
+ You have been {verb} from {roomName} by {kickerName}.
+ {reason} + {rejoinBlock} + Forget +
+
+ ); + } else if (this.props.error) { var name = this.props.roomAlias || "This room"; var error; if (this.props.error.errcode == 'M_NOT_FOUND') { @@ -138,10 +181,8 @@ module.exports = React.createClass({ ); - } - else { - var name = this.props.room ? this.props.room.name : (this.props.room_alias || ""); - name = name ? { name } : "a room"; + } else { + const name = this._roomNameElement(); joinBlock = (