diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index 180a348434..d95d5cd652 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -64,6 +64,9 @@ const LoggedInView = React.createClass({ teamToken: PropTypes.string, + // Used by the RoomView to handle joining rooms + viaServers: PropTypes.arrayOf(PropTypes.string), + // and lots and lots of other stuff. }, @@ -389,6 +392,7 @@ const LoggedInView = React.createClass({ onRegistered={this.props.onRegistered} thirdPartyInvite={this.props.thirdPartyInvite} oobData={this.props.roomOobData} + viaServers={this.props.viaServers} eventPixelOffset={this.props.initialEventPixelOffset} key={this.props.currentRoomId || 'roomview'} disabled={this.props.middleDisabled} diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index f385aacd40..5dbafbd2a7 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -840,6 +840,7 @@ export default React.createClass({ page_type: PageTypes.RoomView, thirdPartyInvite: roomInfo.third_party_invite, roomOobData: roomInfo.oob_data, + viaServers: roomInfo.via_servers, }; if (roomInfo.room_alias) { @@ -1488,9 +1489,21 @@ export default React.createClass({ inviterName: params.inviter_name, }; + // on our URLs there might be a ?via=matrix.org or similar to help + // joins to the room succeed. We'll pass these through as an array + // to other levels. If there's just one ?via= then params.via is a + // single string. If someone does something like ?via=one.com&via=two.com + // then params.via is an array of strings. + let via = []; + if (params.via) { + if (typeof(params.via) === 'string') via = [params.via]; + else via = params.via; + } + const payload = { action: 'view_room', event_id: eventId, + via_servers: via, // If an event ID is given in the URL hash, notify RoomViewStore to mark // it as highlighted, which will propagate to RoomView and highlight the // associated EventTile. diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 8e226bdfcf..5d51b9f9a0 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -88,6 +88,9 @@ module.exports = React.createClass({ // is the RightPanel collapsed? collapsedRhs: PropTypes.bool, + + // Servers the RoomView can use to try and assist joins + viaServers: PropTypes.arrayOf(PropTypes.string), }, getInitialState: function() { @@ -833,7 +836,7 @@ module.exports = React.createClass({ action: 'do_after_sync_prepared', deferred_action: { action: 'join_room', - opts: { inviteSignUrl: signUrl }, + opts: { inviteSignUrl: signUrl, viaServers: this.props.viaServers }, }, }); @@ -875,7 +878,7 @@ module.exports = React.createClass({ this.props.thirdPartyInvite.inviteSignUrl : undefined; dis.dispatch({ action: 'join_room', - opts: { inviteSignUrl: signUrl }, + opts: { inviteSignUrl: signUrl, viaServers: this.props.viaServers }, }); return Promise.resolve(); });