diff --git a/src/components/views/room_settings/AliasSettings.js b/src/components/views/room_settings/AliasSettings.js index ee5a505b32..d7befa488d 100644 --- a/src/components/views/room_settings/AliasSettings.js +++ b/src/components/views/room_settings/AliasSettings.js @@ -74,7 +74,6 @@ export default class AliasSettings extends React.Component { roomId: PropTypes.string.isRequired, canSetCanonicalAlias: PropTypes.bool.isRequired, canSetAliases: PropTypes.bool.isRequired, - aliasEvents: PropTypes.array, // [MatrixEvent] canonicalAliasEvent: PropTypes.object, // MatrixEvent }; @@ -94,12 +93,6 @@ export default class AliasSettings extends React.Component { updatingCanonicalAlias: false, }; - const localDomain = MatrixClientPeg.get().getDomain(); - state.domainToAliases = this.aliasEventsToDictionary(props.aliasEvents || []); - state.remoteDomains = Object.keys(state.domainToAliases).filter((domain) => { - return domain !== localDomain && state.domainToAliases[domain].length > 0; - }); - if (props.canonicalAliasEvent) { state.canonicalAlias = props.canonicalAliasEvent.getContent().alias; } @@ -107,6 +100,42 @@ export default class AliasSettings extends React.Component { this.state = state; } + async componentWillMount() { + const cli = MatrixClientPeg.get(); + if (await cli.doesServerSupportUnstableFeature("org.matrix.msc2432")) { + const response = await cli.unstableGetLocalAliases(this.props.roomId); + const localAliases = response.aliases; + const localDomain = cli.getDomain(); + const domainToAliases = Object.assign( + {}, + // FIXME, any localhost alt_aliases will be ignored as they are overwritten by localAliases + this.aliasesToDictionary(this._getAltAliases()), + {[localDomain]: localAliases || []}, + ); + const remoteDomains = Object.keys(domainToAliases).filter((domain) => { + return domain !== localDomain && domainToAliases[domain].length > 0; + }); + this.setState({ domainToAliases, remoteDomains }); + } else { + const state = {}; + const localDomain = cli.getDomain(); + state.domainToAliases = this.aliasEventsToDictionary(this.props.aliasEvents || []); + state.remoteDomains = Object.keys(state.domainToAliases).filter((domain) => { + return domain !== localDomain && state.domainToAliases[domain].length > 0; + }); + this.setState(state); + } + } + + aliasesToDictionary(aliases) { + return aliases.reduce((dict, alias) => { + const domain = alias.split(":")[1]; + dict[domain] = dict[domain] || []; + dict[domain].push(alias); + return dict; + }, {}); + } + aliasEventsToDictionary(aliasEvents) { // m.room.alias events const dict = {}; aliasEvents.forEach((event) => { @@ -117,6 +146,16 @@ export default class AliasSettings extends React.Component { return dict; } + _getAltAliases() { + if (this.props.canonicalAliasEvent) { + const altAliases = this.props.canonicalAliasEvent.getContent().alt_aliases; + if (Array.isArray(altAliases)) { + return altAliases; + } + } + return []; + } + changeCanonicalAlias(alias) { if (!this.props.canSetCanonicalAlias) return; @@ -126,6 +165,8 @@ export default class AliasSettings extends React.Component { }); const eventContent = {}; + const altAliases = this._getAltAliases(); + if (altAliases) eventContent["alt_aliases"] = altAliases; if (alias) eventContent["alias"] = alias; MatrixClientPeg.get().sendStateEvent(this.props.roomId, "m.room.canonical_alias",