show a spinner on MemberInfo when updating a member. and label 'disinvite' correctly

pull/21833/head
Matthew Hodgson 2016-04-13 01:46:10 +01:00
parent bfec6d4ed9
commit 4b1ff51a42
1 changed files with 39 additions and 26 deletions

View File

@ -57,7 +57,8 @@ module.exports = React.createClass({
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
var roomId = this.props.member.roomId; var roomId = this.props.member.roomId;
var target = this.props.member.userId; var target = this.props.member.userId;
MatrixClientPeg.get().kick(roomId, target).done(function() { this.setState({ updating: this.state.updating + 1 });
MatrixClientPeg.get().kick(roomId, target).then(function() {
// NO-OP; rely on the m.room.member event coming down else we could // NO-OP; rely on the m.room.member event coming down else we could
// get out of sync if we force setState here! // get out of sync if we force setState here!
console.log("Kick success"); console.log("Kick success");
@ -67,7 +68,9 @@ module.exports = React.createClass({
description: err.message description: err.message
}); });
} }
); ).finally(()=>{
this.setState({ updating: this.state.updating - 1 });
});
this.props.onFinished(); this.props.onFinished();
}, },
@ -75,7 +78,8 @@ module.exports = React.createClass({
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
var roomId = this.props.member.roomId; var roomId = this.props.member.roomId;
var target = this.props.member.userId; var target = this.props.member.userId;
MatrixClientPeg.get().ban(roomId, target).done( this.setState({ updating: this.state.updating + 1 });
MatrixClientPeg.get().ban(roomId, target).then(
function() { function() {
// NO-OP; rely on the m.room.member event coming down else we could // NO-OP; rely on the m.room.member event coming down else we could
// get out of sync if we force setState here! // get out of sync if we force setState here!
@ -86,7 +90,9 @@ module.exports = React.createClass({
description: err.message description: err.message
}); });
} }
); ).finally(()=>{
this.setState({ updating: this.state.updating - 1 });
});
this.props.onFinished(); this.props.onFinished();
}, },
@ -122,7 +128,8 @@ module.exports = React.createClass({
level = parseInt(level); level = parseInt(level);
if (level !== NaN) { if (level !== NaN) {
MatrixClientPeg.get().setPowerLevel(roomId, target, level, powerLevelEvent).done( this.setState({ updating: this.state.updating + 1 });
MatrixClientPeg.get().setPowerLevel(roomId, target, level, powerLevelEvent).then(
function() { function() {
// NO-OP; rely on the m.room.member event coming down else we could // NO-OP; rely on the m.room.member event coming down else we could
// get out of sync if we force setState here! // get out of sync if we force setState here!
@ -133,9 +140,11 @@ module.exports = React.createClass({
description: err.message description: err.message
}); });
} }
); ).finally(()=>{
this.setState({ updating: this.state.updating - 1 });
});
} }
this.props.onFinished(); this.props.onFinished();
}, },
onModToggle: function() { onModToggle: function() {
@ -164,7 +173,8 @@ module.exports = React.createClass({
if (modLevel > 50 && defaultLevel < 50) modLevel = 50; // try to stick with the vector level defaults if (modLevel > 50 && defaultLevel < 50) modLevel = 50; // try to stick with the vector level defaults
// toggle the level // toggle the level
var newLevel = this.state.isTargetMod ? defaultLevel : modLevel; var newLevel = this.state.isTargetMod ? defaultLevel : modLevel;
MatrixClientPeg.get().setPowerLevel(roomId, target, parseInt(newLevel), powerLevelEvent).done( this.setState({ updating: this.state.updating + 1 });
MatrixClientPeg.get().setPowerLevel(roomId, target, parseInt(newLevel), powerLevelEvent).then(
function() { function() {
// NO-OP; rely on the m.room.member event coming down else we could // NO-OP; rely on the m.room.member event coming down else we could
// get out of sync if we force setState here! // get out of sync if we force setState here!
@ -183,12 +193,15 @@ module.exports = React.createClass({
}); });
} }
} }
); ).finally(()=>{
this.props.onFinished(); this.setState({ updating: this.state.updating - 1 });
});
this.props.onFinished();
}, },
_applyPowerChange: function(roomId, target, powerLevel, powerLevelEvent) { _applyPowerChange: function(roomId, target, powerLevel, powerLevelEvent) {
MatrixClientPeg.get().setPowerLevel(roomId, target, parseInt(powerLevel), powerLevelEvent).done( this.setState({ updating: this.state.updating + 1 });
MatrixClientPeg.get().setPowerLevel(roomId, target, parseInt(powerLevel), powerLevelEvent).then(
function() { function() {
// NO-OP; rely on the m.room.member event coming down else we could // NO-OP; rely on the m.room.member event coming down else we could
// get out of sync if we force setState here! // get out of sync if we force setState here!
@ -199,7 +212,9 @@ module.exports = React.createClass({
description: err.message description: err.message
}); });
} }
); ).finally(()=>{
this.setState({ updating: this.state.updating - 1 });
});
this.props.onFinished(); this.props.onFinished();
}, },
@ -249,7 +264,7 @@ module.exports = React.createClass({
else { else {
this._applyPowerChange(roomId, target, powerLevel, powerLevelEvent); this._applyPowerChange(roomId, target, powerLevel, powerLevelEvent);
} }
}, },
onChatClick: function() { onChatClick: function() {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
@ -300,19 +315,17 @@ module.exports = React.createClass({
this.props.onFinished(); this.props.onFinished();
} }
else { else {
self.setState({ creatingRoom: true });
if (MatrixClientPeg.get().isGuest()) { if (MatrixClientPeg.get().isGuest()) {
self.setState({ creatingRoom: false });
var NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog"); var NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog");
Modal.createDialog(NeedToRegisterDialog, { Modal.createDialog(NeedToRegisterDialog, {
title: "Please Register", title: "Please Register",
description: "Guest users can't create new rooms. Please register to create room and start a chat." description: "Guest users can't create new rooms. Please register to create room and start a chat."
}); });
self.props.onFinished(); self.props.onFinished();
return; return;
} }
self.setState({ updating: self.state.updating + 1 });
MatrixClientPeg.get().createRoom({ MatrixClientPeg.get().createRoom({
// XXX: FIXME: deduplicate this with "view_create_room" in MatrixChat // XXX: FIXME: deduplicate this with "view_create_room" in MatrixChat
invite: [this.props.member.userId], invite: [this.props.member.userId],
@ -328,24 +341,24 @@ module.exports = React.createClass({
type: 'm.room.guest_access', type: 'm.room.guest_access',
state_key: '', state_key: '',
} }
], ],
}).done( }).then(
function(res) { function(res) {
self.setState({ creatingRoom: false });
dis.dispatch({ dis.dispatch({
action: 'view_room', action: 'view_room',
room_id: res.room_id room_id: res.room_id
}); });
self.props.onFinished(); self.props.onFinished();
}, function(err) { }, function(err) {
self.setState({ creatingRoom: false });
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {
title: "Failure to start chat", title: "Failure to start chat",
description: err.message description: err.message
}); });
self.props.onFinished(); self.props.onFinished();
} }
); ).finally(()=>{
self.setState({ updating: self.state.updating - 1 });
});
} }
}, },
@ -367,7 +380,7 @@ module.exports = React.createClass({
}, },
muted: false, muted: false,
isTargetMod: false, isTargetMod: false,
creatingRoom: false updating: 0,
} }
}, },
@ -470,14 +483,14 @@ module.exports = React.createClass({
startChat = <BottomLeftMenuTile collapsed={ false } img="img/create-big.svg" label="Start chat" onClick={ this.onChatClick }/> startChat = <BottomLeftMenuTile collapsed={ false } img="img/create-big.svg" label="Start chat" onClick={ this.onChatClick }/>
} }
if (this.state.creatingRoom) { if (this.state.updating) {
var Loader = sdk.getComponent("elements.Spinner"); var Loader = sdk.getComponent("elements.Spinner");
spinner = <Loader imgClassName="mx_ContextualMenu_spinner"/>; spinner = <Loader imgClassName="mx_ContextualMenu_spinner"/>;
} }
if (this.state.can.kick) { if (this.state.can.kick) {
kickButton = <div className="mx_MemberInfo_field" onClick={this.onKick}> kickButton = <div className="mx_MemberInfo_field" onClick={this.onKick}>
Kick { this.props.member.membership === "invite" ? "Disinvite" : "Kick" }
</div>; </div>;
} }
if (this.state.can.ban) { if (this.state.can.ban) {
@ -503,7 +516,7 @@ module.exports = React.createClass({
var adminTools; var adminTools;
if (kickButton || banButton || muteButton || giveModButton) { if (kickButton || banButton || muteButton || giveModButton) {
adminTools = adminTools =
<div> <div>
<h3>Admin tools</h3> <h3>Admin tools</h3>