From 738313384609a8ed05072c0a97723c0a9350d648 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 19 Oct 2018 13:30:38 -0600 Subject: [PATCH] Support parsing matrix.to links in the timeline with ?via= in them This ends up being translated to ?server_name= in the matrix-js-sdk, although that has a bug at the time of writing. It converts `server_name: ['a', 'b']` to `?server_name=a,b` instead of `?server_name=a&server_name=b` For reference: the `viaServers` option is routed through the 'join_room' action to RoomViewStore#_joinRoom which is passed directly to the js-sdk http-api#joinRoom function. Next steps: * Fix the js-sdk parsing * Make the SDK generate matrix.to links with ?via= --- src/components/structures/LoggedInView.js | 4 ++++ src/components/structures/MatrixChat.js | 13 +++++++++++++ src/components/structures/RoomView.js | 7 +++++-- 3 files changed, 22 insertions(+), 2 deletions(-) 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(); });