From 9a524c49b1a80e0eaeab1250bdaa2d439114d502 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Fri, 25 Jan 2019 20:53:38 -0700
Subject: [PATCH] Early support for alias modification in room settings

---
 .../views/room_settings/AliasSettings.js      | 11 ++++---
 .../settings/tabs/GeneralRoomSettingsTab.js   | 29 +++++++++++++++++++
 src/i18n/strings/en_EN.json                   |  4 +--
 3 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/src/components/views/room_settings/AliasSettings.js b/src/components/views/room_settings/AliasSettings.js
index f68670b2f9..373e4dc9fb 100644
--- a/src/components/views/room_settings/AliasSettings.js
+++ b/src/components/views/room_settings/AliasSettings.js
@@ -22,6 +22,7 @@ const ObjectUtils = require("../../../ObjectUtils");
 const MatrixClientPeg = require('../../../MatrixClientPeg');
 const sdk = require("../../../index");
 import { _t } from '../../../languageHandler';
+import Field from "../elements/Field";
 const Modal = require("../../../Modal");
 
 module.exports = React.createClass({
@@ -222,7 +223,8 @@ module.exports = React.createClass({
             let found = false;
             const canonicalValue = this.state.canonicalAlias || "";
             canonical_alias_section = (
-                <select onChange={this.onCanonicalAliasChange} value={canonicalValue}>
+                <Field onChange={this.onCanonicalAliasChange} value={canonicalValue}
+                       element='select' id='canonicalAlias' label={_t('Main address')}>
                     <option value="" key="unset">{ _t('not specified') }</option>
                     {
                         Object.keys(self.state.domainToAliases).map((domain, i) => {
@@ -242,7 +244,7 @@ module.exports = React.createClass({
                             { this.state.canonicalAlias }
                         </option>
                     }
-                </select>
+                </Field>
             );
         } else {
             canonical_alias_section = (
@@ -278,10 +280,7 @@ module.exports = React.createClass({
 
         return (
             <div>
-                <h3>{ _t('Addresses') }</h3>
-                <div className="mx_RoomSettings_aliasLabel">
-                    { _t('The main address for this room is') }: { canonical_alias_section }
-                </div>
+                {canonical_alias_section}
                 <EditableItemList
                     className={"mx_RoomSettings_localAliases"}
                     items={this.state.domainToAliases[localDomain] || []}
diff --git a/src/components/views/settings/tabs/GeneralRoomSettingsTab.js b/src/components/views/settings/tabs/GeneralRoomSettingsTab.js
index c78decd2cb..4872a5a117 100644
--- a/src/components/views/settings/tabs/GeneralRoomSettingsTab.js
+++ b/src/components/views/settings/tabs/GeneralRoomSettingsTab.js
@@ -18,19 +18,48 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import {_t} from "../../../../languageHandler";
 import RoomProfileSettings from "../RoomProfileSettings";
+import MatrixClientPeg from "../../../../MatrixClientPeg";
+import sdk from "../../../../index";
+import AccessibleButton from "../../elements/AccessibleButton";
 
 export default class GeneralRoomSettingsTab extends React.Component {
     static propTypes = {
         roomId: PropTypes.string.isRequired,
     };
 
+    _saveAliases = (e) => {
+        // TODO: Live modification of aliases?
+        if (!this.refs.aliasSettings) return;
+        this.refs.aliasSettings.saveSettings();
+    };
+
     render() {
+        const AliasSettings = sdk.getComponent("room_settings.AliasSettings");
+
+        const client = MatrixClientPeg.get();
+        const room = client.getRoom(this.props.roomId);
+
+        const canSetAliases = true; // Previously, we arbitrarily only allowed admins to do this
+        const canSetCanonical = room.currentState.mayClientSendStateEvent("m.room.canonical_alias", client);
+        const canonicalAliasEv = room.currentState.getStateEvents("m.room.canonical_alias", '');
+        const aliasEvents = room.currentState.getStateEvents("m.room.aliases");
+
         return (
             <div className="mx_SettingsTab mx_GeneralRoomSettingsTab">
                 <div className="mx_SettingsTab_heading">{_t("General")}</div>
                 <div className='mx_SettingsTab_section mx_GeneralRoomSettingsTab_profileSection'>
                     <RoomProfileSettings roomId={this.props.roomId} />
                 </div>
+
+                <span className='mx_SettingsTab_subheading'>{_t("Room Addresses")}</span>
+                <div className='mx_SettingsTab_section mx_SettingsTab_subsectionText'>
+                    <AliasSettings ref="aliasSettings" roomId={this.props.roomId}
+                                   canSetCanonicalAlias={canSetCanonical} canSetAliases={canSetAliases}
+                                   canonicalAliasEvent={canonicalAliasEv} aliasEvents={aliasEvents} />
+                    <AccessibleButton onClick={this._saveAliases} kind='primary'>
+                        {_t("Save")}
+                    </AccessibleButton>
+                </div>
             </div>
         );
     }
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index b2abba403f..3e65de9268 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -436,6 +436,7 @@
     "Room Name": "Room Name",
     "Room Topic": "Room Topic",
     "General": "General",
+    "Room Addresses": "Room Addresses",
     "Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?",
     "Success": "Success",
     "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them",
@@ -765,11 +766,10 @@
     "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias",
     "Invalid address format": "Invalid address format",
     "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address",
+    "Main address": "Main address",
     "not specified": "not specified",
     "not set": "not set",
     "Remote addresses for this room:": "Remote addresses for this room:",
-    "Addresses": "Addresses",
-    "The main address for this room is": "The main address for this room is",
     "Local addresses for this room:": "Local addresses for this room:",
     "This room has no local addresses": "This room has no local addresses",
     "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)",