diff --git a/src/components/structures/ScrollPanel.js b/src/components/structures/ScrollPanel.js index 2a11271232..9fd81e7aeb 100644 --- a/src/components/structures/ScrollPanel.js +++ b/src/components/structures/ScrollPanel.js @@ -19,7 +19,7 @@ var ReactDOM = require("react-dom"); var GeminiScrollbar = require('react-gemini-scrollbar'); var q = require("q"); -var DEBUG_SCROLL = true; +var DEBUG_SCROLL = false; if (DEBUG_SCROLL) { // using bind means that we get to keep useful line numbers in the console diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js index af48277bb6..74b326e987 100644 --- a/src/components/views/rooms/RoomSettings.js +++ b/src/components/views/rooms/RoomSettings.js @@ -55,9 +55,20 @@ module.exports = React.createClass({ power_levels_changed: false, tags_changed: false, tags: tags, - areNotifsMuted: areNotifsMuted + areNotifsMuted: areNotifsMuted, + // isRoomPublished: // set in componentWillMount }; }, + + componentWillMount: function() { + MatrixClientPeg.get().getRoomDirectoryVisibility( + this.props.room.roomId + ).done((result) => { + this.setState({ isRoomPublished: result.visibility === "public" }); + }, (err) => { + console.error("Failed to get room visibility: " + err); + }); + }, setName: function(name) { this.setState({ @@ -112,6 +123,13 @@ module.exports = React.createClass({ )); } + if (this.state.isRoomPublished !== originalState.isRoomPublished) { + promises.push(MatrixClientPeg.get().setRoomDirectoryVisibility( + roomId, + this.state.isRoomPublished ? "public" : "private" + )); + } + if (this.state.join_rule !== originalState.join_rule) { promises.push(MatrixClientPeg.get().sendStateEvent( roomId, "m.room.join_rules", @@ -252,6 +270,43 @@ module.exports = React.createClass({ }); }, + _onRoomAccessRadioToggle: function(ev) { + + // join_rule + // INVITE | PUBLIC + // ----------------------+---------------- + // guest CAN_JOIN | inv_only | pub_with_guest + // access ----------------------+---------------- + // FORBIDDEN | inv_only | pub_no_guest + // ----------------------+---------------- + + switch (ev.target.value) { + case "invite_only": + this.setState({ + join_rule: "invite", + // we always set guests can_join here as it makes no sense to have + // an invite-only room that guests can't join. If you explicitly + // invite them, you clearly want them to join, whether they're a + // guest or not. In practice, guest_access should probably have + // been implemented as part of the join_rules enum. + guest_access: "can_join", + }); + break; + case "public_no_guests": + this.setState({ + join_rule: "public", + guest_access: "forbidden", + }); + break; + case "public_with_guests": + this.setState({ + join_rule: "public", + guest_access: "can_join", + }); + break; + } + }, + _onToggle: function(keyName, checkedValue, uncheckedValue, ev) { console.log("Checkbox toggle: %s %s", keyName, ev.target.checked); var state = {}; @@ -280,6 +335,13 @@ module.exports = React.createClass({ }); }, + mayChangeRoomAccess: function() { + var cli = MatrixClientPeg.get(); + var roomState = this.props.room.currentState; + return (roomState.mayClientSendStateEvent("m.room.join_rules", cli) && + roomState.mayClientSendStateEvent("m.room.guest_access", cli)) + }, + render: function() { // TODO: go through greying out things you don't have permission to change // (or turning them into informative stuff) @@ -427,7 +489,31 @@ module.exports = React.createClass({ // http://matrix.org/docs/spec/r0.0.0/client_server.html#id31 var historyVisibility = this.state.history_visibility || "shared"; - // FIXME: disable guests_read if the user hasn't turned on shared history + var addressWarning; + var aliasEvents = this.props.room.currentState.getStateEvents('m.room.aliases') || []; + var aliasCount = 0; + aliasEvents.forEach((event) => { + aliasCount += event.getContent().aliases.length; + }); + + if (this.state.join_rule === "public" && aliasCount == 0) { + addressWarning = +