Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
Merge pull request #592 from matrix-org/kegan/bulk-reject-invites
Browse files Browse the repository at this point in the history
Implement bulk invite rejections
  • Loading branch information
kegsay authored Dec 15, 2016
2 parents 238a307 + ec41fc2 commit 71132c4
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions src/components/structures/UserSettings.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ module.exports = React.createClass({
phase: "UserSettings.LOADING", // LOADING, DISPLAY
email_add_pending: false,
vectorVersion: null,
rejectingInvites: false,
};
},

Expand All @@ -80,6 +81,12 @@ module.exports = React.createClass({
});
}

// Bulk rejecting invites:
// /sync won't have had time to return when UserSettings re-renders from state changes, so getRooms()
// will still return rooms with invites. To get around this, add a listener for
// membership updates and kick the UI.
MatrixClientPeg.get().on("RoomMember.membership", this._onInviteStateChange);

dis.dispatch({
action: 'ui_opacity',
sideOpacity: 0.3,
Expand All @@ -101,6 +108,10 @@ module.exports = React.createClass({
middleOpacity: 1.0,
});
dis.unregister(this.dispatcherRef);
let cli = MatrixClientPeg.get();
if (cli) {
cli.removeListener("RoomMember.membership", this._onInviteStateChange);
}
},

_refreshFromServer: function() {
Expand Down Expand Up @@ -280,6 +291,29 @@ module.exports = React.createClass({
Modal.createDialog(DeactivateAccountDialog, {});
},

_onInviteStateChange: function(event, member, oldMembership) {
if (member.userId === this._me && oldMembership === "invite") {
this.forceUpdate();
}
},

_onRejectAllInvitesClicked: function(rooms, ev) {
this.setState({
rejectingInvites: true
});
// reject the invites
let promises = rooms.map((room) => {
return MatrixClientPeg.get().leave(room.roomId);
});
// purposefully drop errors to the floor: we'll just have a non-zero number on the UI
// after trying to reject all the invites.
q.allSettled(promises).then(() => {
this.setState({
rejectingInvites: false
});
}).done();
},

_renderUserInterfaceSettings: function() {
var client = MatrixClientPeg.get();

Expand Down Expand Up @@ -418,6 +452,36 @@ module.exports = React.createClass({
</div>;
},

_renderBulkOptions: function() {
let invitedRooms = MatrixClientPeg.get().getRooms().filter((r) => {
return r.hasMembershipState(this._me, "invite");
});
if (invitedRooms.length === 0) {
return null;
}

let Spinner = sdk.getComponent("elements.Spinner");

let reject = <Spinner />;
if (!this.state.rejectingInvites) {
// bind() the invited rooms so any new invites that may come in as this button is clicked
// don't inadvertently get rejected as well.
reject = (
<button className="mx_UserSettings_button danger"
onClick={this._onRejectAllInvitesClicked.bind(this, invitedRooms)}>
Reject all {invitedRooms.length} invites
</button>
);
}

return <div>
<h3>Bulk Options</h3>
<div className="mx_UserSettings_section">
{reject}
</div>
</div>;
},

render: function() {
var self = this;
var Loader = sdk.getComponent("elements.Spinner");
Expand Down Expand Up @@ -580,6 +644,7 @@ module.exports = React.createClass({
{this._renderLabs()}
{this._renderDevicesPanel()}
{this._renderCryptoInfo()}
{this._renderBulkOptions()}

<h3>Advanced</h3>

Expand Down

0 comments on commit 71132c4

Please sign in to comment.