diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index c65a94ecfe..5ce5529e9c 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -981,6 +981,40 @@ module.exports = React.createClass({ } } + if (newVals.tag_operations) { + // FIXME: should probably be factored out with alias_operations above + var oplist = []; + for (var i = 0; i < newVals.tag_operations.length; i++) { + var tag_operation = newVals.tag_operations[i]; + switch (tag_operation.type) { + case 'put': + oplist.push( + MatrixClientPeg.get().setRoomTag( + this.props.roomId, tag_operation.tag, {} + ) + ); + break; + case 'delete': + oplist.push( + MatrixClientPeg.get().deleteRoomTag( + this.props.roomId, tag_operation.tag + ) + ); + break; + default: + console.log("Unknown tag operation, ignoring: " + tag_operation.type); + } + } + + if (oplist.length) { + var deferred = oplist[0]; + oplist.splice(1).forEach(function (f) { + deferred = deferred.then(f); + }); + deferreds.push(deferred); + } + } + if (old_canonical_alias !== newVals.canonical_alias) { deferreds.push( MatrixClientPeg.get().sendStateEvent( @@ -1113,6 +1147,7 @@ module.exports = React.createClass({ history_visibility: this.refs.room_settings.getHistoryVisibility(), power_levels: this.refs.room_settings.getPowerLevels(), alias_operations: this.refs.room_settings.getAliasOperations(), + tag_operations: this.refs.room_settings.getTagOperations(), canonical_alias: this.refs.room_settings.getCanonicalAlias(), guest_join: this.refs.room_settings.canGuestsJoin(), guest_read: this.refs.room_settings.canGuestsRead(), diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js index a8cb5064e8..3dd9655617 100644 --- a/src/components/views/rooms/RoomSettings.js +++ b/src/components/views/rooms/RoomSettings.js @@ -218,6 +218,31 @@ module.exports = React.createClass({ return ops; }, + getTagOperations: function() { + if (!this.state.tags_changed) return undefined; + + var ops = []; + + var delta = {}; + Object.keys(this.props.room.tags).forEach(function(oldTag) { + delta[oldTag] = delta[oldTag] || 0; + delta[oldTag]--; + }); + Object.keys(this.state.tags).forEach(function(newTag) { + delta[newTag] = delta[newTag] || 0; + delta[newTag]++; + }); + Object.keys(delta).forEach(function(tag) { + if (delta[tag] == 1) { + ops.push({ type: "put", tag: tag }); + } else if (delta[tag] == -1) { + ops.push({ type: "delete", tag: tag }); + } + }); + + return ops; + }, + onPowerLevelsChanged: function() { this.setState({ power_levels_changed: true @@ -604,7 +629,7 @@ module.exports = React.createClass({ }); var tags_section = -
+
This room is tagged as { can_set_tag ? tags.map(function(tag, i) {