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 = ;
+ }
+ 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 = (