diff --git a/skins/base/views/molecules/MemberInfo.js b/skins/base/views/molecules/MemberInfo.js index 45db0c30..8e1e383f 100644 --- a/skins/base/views/molecules/MemberInfo.js +++ b/skins/base/views/molecules/MemberInfo.js @@ -67,7 +67,7 @@ module.exports = React.createClass({ if (this.state.active >= 0) { activeAgo = this.getDuration(this.state.active); } - var kickButton, banButton, muteButton; + var kickButton, banButton, muteButton, giveModButton; if (this.state.can.kick) { kickButton =
Kick @@ -84,9 +84,17 @@ module.exports = React.createClass({ {muteLabel}
; } + if (this.state.can.modifyLevel) { + var giveOpLabel = this.state.isTargetMod ? "Revoke Mod" : "Make Mod"; + giveModButton =
+ {giveOpLabel} +
+ } + var opLabel; - if (this.state.isTargetOp) { - opLabel =
Moderator
+ if (this.state.isTargetMod) { + var level = this.props.member.powerLevelNorm + "%"; + opLabel =
Moderator ({level})
} return (
@@ -105,6 +113,7 @@ module.exports = React.createClass({ {muteButton} {kickButton} {banButton} + {giveModButton}
); } diff --git a/src/controllers/molecules/MemberInfo.js b/src/controllers/molecules/MemberInfo.js index d335eec5..4f222c5d 100644 --- a/src/controllers/molecules/MemberInfo.js +++ b/src/controllers/molecules/MemberInfo.js @@ -21,10 +21,11 @@ limitations under the License. * 'can': { * kick: boolean, * ban: boolean, - * mute: boolean + * mute: boolean, + * modifyLevel: boolean * }, * 'muted': boolean, - * 'isTargetOp': boolean + * 'isTargetMod': boolean */ 'use strict'; @@ -158,6 +159,40 @@ module.exports = { }); }, + onModToggle: function() { + var roomId = this.props.member.roomId; + var target = this.props.member.userId; + var room = MatrixClientPeg.get().getRoom(roomId); + if (!room) { + return; + } + var powerLevelEvent = room.currentState.getStateEvents( + "m.room.power_levels", "" + ); + if (!powerLevelEvent) { + return; + } + var me = room.getMember(MatrixClientPeg.get().credentials.userId); + if (!me) { + return; + } + var defaultLevel = powerLevelEvent.getContent().users_default; + var modLevel = me.powerLevel - 1; + // toggle the level + var newLevel = this.state.isTargetMod ? defaultLevel : modLevel; + MatrixClientPeg.get().setPowerLevel(roomId, target, newLevel, powerLevelEvent).done( + function() { + // NO-OP; rely on the m.room.member event coming down else we could + // get out of sync if we force setState here! + console.log("Mod toggle success"); + }, function(err) { + Modal.createDialog(ErrorDialog, { + title: "Mod error", + description: err.message + }); + }); + }, + onChatClick: function() { // check if there are any existing rooms with just us and them (1:1) // If so, just view that room. If not, create a private room with them. @@ -214,17 +249,19 @@ module.exports = { can: { kick: false, ban: false, - mute: false + mute: false, + modifyLevel: false }, muted: false, - isTargetOp: false + isTargetMod: false } }, _calculateOpsPermissions: function() { var defaultPerms = { can: {}, - muted: false + muted: false, + modifyLevel: false }; var room = MatrixClientPeg.get().getRoom(this.props.member.roomId); if (!room) { @@ -243,7 +280,7 @@ module.exports = { me, them, powerLevels.getContent() ), muted: this._isMuted(them, powerLevels.getContent()), - isTargetOp: them.powerLevel >= me.powerLevel && them.powerLevel > 0 + isTargetMod: them.powerLevel > powerLevels.getContent().users_default }; }, @@ -251,7 +288,8 @@ module.exports = { var can = { kick: false, ban: false, - mute: false + mute: false, + modifyLevel: false }; var canAffectUser = them.powerLevel < me.powerLevel; if (!canAffectUser) { @@ -265,6 +303,7 @@ module.exports = { can.kick = me.powerLevel >= powerLevels.kick; can.ban = me.powerLevel >= powerLevels.ban; can.mute = me.powerLevel >= editPowerLevel; + can.modifyLevel = me.powerLevel > them.powerLevel; return can; },