From 9085a2a8664fc06b881cd127736e7ac9163c75cc Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 1 Mar 2016 18:23:57 +0000 Subject: [PATCH 01/12] Pass room metadata from 3pid invite emails all the way through to the relevant components so we can display it. --- src/components/structures/MatrixChat.js | 29 ++++++++- src/components/structures/RoomView.js | 15 ++++- src/components/views/avatars/RoomAvatar.js | 28 +++++++-- src/components/views/rooms/RoomHeader.js | 68 ++++++++++++---------- 4 files changed, 102 insertions(+), 38 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 8a0f36e483..e3a6abb1a4 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -312,7 +312,10 @@ module.exports = React.createClass({ }); break; case 'view_room': - this._viewRoom(payload.room_id, payload.show_settings, payload.event_id, payload.invite_sign_url); + this._viewRoom( + payload.room_id, payload.show_settings, payload.event_id, + payload.invite_sign_url, payload.oob_data + ); break; case 'view_prev_room': roomIndexDelta = -1; @@ -350,6 +353,7 @@ module.exports = React.createClass({ room_id: foundRoom.roomId, event_id: payload.event_id, invite_sign_url: payload.invite_sign_url, + oob_data: payload.oob_data, }); return; } @@ -361,6 +365,7 @@ module.exports = React.createClass({ room_id: result.room_id, event_id: payload.event_id, invite_sign_url: payload.invite_sign_url, + room_oob_data: payload.room_oob_data, }); }); break; @@ -448,7 +453,10 @@ module.exports = React.createClass({ // // eventId is optional and will cause a switch to the context of that // particular event. - _viewRoom: function(roomId, showSettings, eventId, invite_sign_url) { + // @param {Object} room_oob_data Object of additional data about the room + // that has been passed out-of-band (eg. + // room name and avatar from an invite email) + _viewRoom: function(roomId, showSettings, eventId, invite_sign_url, oob_data) { // before we switch room, record the scroll state of the current room this._updateScrollMap(); @@ -461,6 +469,7 @@ module.exports = React.createClass({ initialEventPixelOffset: undefined, page_type: this.PageTypes.RoomView, inviteSignUrl: invite_sign_url, + roomOobData: oob_data, }; // if we aren't given an explicit event id, look for one in the @@ -552,10 +561,12 @@ module.exports = React.createClass({ room_alias: self.starting_room_alias, event_id: self.starting_event_id, invite_sign_url: self.starting_room_invite_sign_url, + room_oob_data: self.starting_room_oob_data, }); delete self.starting_room_alias; delete self.starting_event_id; delete self.starting_room_invite_sign_url; + delete self.starting_room_oob_data; } else if (!self.state.page_type) { if (!self.state.currentRoom) { var firstRoom = null; @@ -675,6 +686,13 @@ module.exports = React.createClass({ var segments = screen.substring(5).split('/'); var roomString = segments[0]; var eventId = segments[1]; // undefined if no event id given + + var oob_data = { + name: params.room_name, + avatarUrl: params.room_avatar_url, + inviterName: params.inviter_name, + }; + if (roomString[0] == '#') { if (this.state.logged_in) { dis.dispatch({ @@ -682,11 +700,16 @@ module.exports = React.createClass({ room_alias: roomString, event_id: eventId, invite_sign_url: params.signurl, + oob_data: oob_data, }); } else { // Okay, we'll take you here soon... + // XXX: There are way too many of these: + // It would probably be better to handle whether the SDK is + // ready or not in the view_room_alias handler instead. this.starting_room_alias = roomString; this.starting_room_invite_sign_url = params.signurl; + this.starting_room_oob_data = oob_data; this.starting_event_id = eventId; // ...but you're still going to have to log in. this.notifyNewScreen('login'); @@ -697,6 +720,7 @@ module.exports = React.createClass({ room_id: roomString, event_id: eventId, invite_sign_url: params.signurl, + oob_data: oob_data, }); } } @@ -884,6 +908,7 @@ module.exports = React.createClass({ roomId={this.state.currentRoom} eventId={this.state.initialEventId} inviteSignUrl={this.state.inviteSignUrl} + oobData={this.state.roomOobData} highlightedEventId={this.state.highlightedEventId} eventPixelOffset={this.state.initialEventPixelOffset} key={this.state.currentRoom} diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 0ad372634a..8e2ededad6 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -59,6 +59,12 @@ module.exports = React.createClass({ // (given as part of the link in the invite email) inviteSignUrl: React.PropTypes.string, + // Any data about the room that would normally come from the Home Server + // but has been passed out-of-band, eg. the room name and avatar URL + // from an email invite (a workaround for the fact that we can't + // get this information from the HS using an email invite). + oobData: React.PropTypes.object, + // id of an event to jump to. If not given, will go to the end of the // live timeline. eventId: React.PropTypes.string, @@ -1052,13 +1058,19 @@ module.exports = React.createClass({ ); } else { + var inviterName = undefined; + if (this.props.oobData) { + inviterName = this.props.oobData.inviterName; + } + return (
- +
@@ -1293,6 +1305,7 @@ module.exports = React.createClass({ return (
2 keys @@ -103,14 +115,20 @@ module.exports = React.createClass({ }, getFallbackAvatar: function(props) { + if (!this.props.room) return null; + return Avatar.defaultAvatarUrlForString(props.room.roomId); }, render: function() { var BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); + + var roomName = this.props.room ? this.props.room.name : this.props.oobData.name; + return ( - + ); } }); diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index 0b52281507..1b3956c62d 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -33,6 +33,7 @@ module.exports = React.createClass({ propTypes: { room: React.PropTypes.object, + oobData: React.PropTypes.object, editing: React.PropTypes.bool, onSettingsClick: React.PropTypes.func, onSaveClick: React.PropTypes.func, @@ -217,18 +218,27 @@ module.exports = React.createClass({ } // XXX: this is a bit inefficient - we could just compare room.name for 'Empty room'... - var members = this.props.room.getJoinedMembers(); var settingsHint = false; - if (members.length === 1 && members[0].userId === MatrixClientPeg.get().credentials.userId) { - var name = this.props.room.currentState.getStateEvents('m.room.name', ''); - if (!name || !name.getContent().name) { - settingsHint = true; + var members = this.props.room ? this.props.room.getJoinedMembers() : undefined; + if (members) { + if (members.length === 1 && members[0].userId === MatrixClientPeg.get().credentials.userId) { + var name = this.props.room.currentState.getStateEvents('m.room.name', ''); + if (!name || !name.getContent().name) { + settingsHint = true; + } } } + var roomName; + if (this.props.oobData && this.props.oobData.name) { + roomName = this.props.oobData.name; + } else { + this.props.room.name; + } + name =
-
{ this.props.room.name }
+
{ roomName }
{ searchStatus }
@@ -246,36 +256,34 @@ module.exports = React.createClass({ onValueChanged={ this.onTopicChanged } initialValue={ this.state.topic }/> } else { - var topic = this.props.room.currentState.getStateEvents('m.room.topic', ''); + var topic = this.props.room ? this.props.room.currentState.getStateEvents('m.room.topic', '') : ''; if (topic) topic_el =
{ topic.getContent().topic }
; } var roomAvatar = null; - if (this.props.room) { - if (can_set_room_avatar) { - roomAvatar = ( -
-
- -
-
- - -
+ if (can_set_room_avatar) { + roomAvatar = ( +
+
+
- ); - } - else { - roomAvatar = ( -
- +
+ +
- ); - } +
+ ); + } + else { + roomAvatar = ( +
+ +
+ ); } var leave_button; From 10b1b6443d10b32c5a6358ad6e5733dbf0b3895d Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 2 Mar 2016 10:59:54 +0000 Subject: [PATCH 02/12] Fix rooms we don't have any info about --- src/components/views/rooms/RoomHeader.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index 1b3956c62d..e9dd878166 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -229,10 +229,10 @@ module.exports = React.createClass({ } } - var roomName; + var roomName = 'Join Room'; if (this.props.oobData && this.props.oobData.name) { roomName = this.props.oobData.name; - } else { + } else if (this.props.room) { this.props.room.name; } @@ -278,7 +278,7 @@ module.exports = React.createClass({
); } - else { + else if (this.props.room || (this.props.oobData && this.props.oobData.name)) { roomAvatar = (
From 7ae2c5b11bec88381c6e7c30e0e8dfccc238e3ab Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 2 Mar 2016 11:51:47 +0000 Subject: [PATCH 03/12] Document fields of oob_data --- src/components/structures/RoomView.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 8e2ededad6..31a8e7a7c4 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -63,6 +63,9 @@ module.exports = React.createClass({ // but has been passed out-of-band, eg. the room name and avatar URL // from an email invite (a workaround for the fact that we can't // get this information from the HS using an email invite). + // Fields: + // * name (string) The room's name + // * avatarUrl (string) The mxc:// avatar URL for the room oobData: React.PropTypes.object, // id of an event to jump to. If not given, will go to the end of the From acb5f5d69ba6cdcc0c5c85a92b2cd97e20f54c7b Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 2 Mar 2016 11:56:18 +0000 Subject: [PATCH 04/12] This should be props, not state --- src/components/structures/RoomView.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 31a8e7a7c4..b8851108d8 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -1308,7 +1308,7 @@ module.exports = React.createClass({ return (
Date: Wed, 2 Mar 2016 11:57:05 +0000 Subject: [PATCH 05/12] Oops, actually assign variable --- src/components/views/rooms/RoomHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index e9dd878166..1b0d7ff491 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -233,7 +233,7 @@ module.exports = React.createClass({ if (this.props.oobData && this.props.oobData.name) { roomName = this.props.oobData.name; } else if (this.props.room) { - this.props.room.name; + roomName = this.props.room.name; } name = From 2dbed2aa02bcee55139235fe51f5e74699f6a670 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 2 Mar 2016 11:59:17 +0000 Subject: [PATCH 06/12] Clarify when room / oobData can/can't be set --- src/components/views/avatars/RoomAvatar.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/views/avatars/RoomAvatar.js b/src/components/views/avatars/RoomAvatar.js index db0e486b54..3bae15bd15 100644 --- a/src/components/views/avatars/RoomAvatar.js +++ b/src/components/views/avatars/RoomAvatar.js @@ -22,6 +22,9 @@ var sdk = require("../../../index"); module.exports = React.createClass({ displayName: 'RoomAvatar', + // Room may be left unset here, but if it is, + // oobData.avatarUrl should be set (else there + // would be nowhere to get the avatar from) propTypes: { room: React.PropTypes.object, oobData: React.PropTypes.object, From 5bd2316e7f874b627539c4f0f7e55ed8e2df746f Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 2 Mar 2016 13:58:52 +0000 Subject: [PATCH 07/12] Oops, it's just oob_data here --- src/components/structures/MatrixChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index e3a6abb1a4..7e387b8a2f 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -365,7 +365,7 @@ module.exports = React.createClass({ room_id: result.room_id, event_id: payload.event_id, invite_sign_url: payload.invite_sign_url, - room_oob_data: payload.room_oob_data, + room_oob_data: payload.oob_data, }); }); break; From 6319c85272cf27e4ac18dbda80f64299548756b4 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 2 Mar 2016 13:59:55 +0000 Subject: [PATCH 08/12] Make comment match reality --- src/components/structures/MatrixChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 7e387b8a2f..e00fa4ba51 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -453,7 +453,7 @@ module.exports = React.createClass({ // // eventId is optional and will cause a switch to the context of that // particular event. - // @param {Object} room_oob_data Object of additional data about the room + // @param {Object} roomOobData Object of additional data about the room // that has been passed out-of-band (eg. // room name and avatar from an invite email) _viewRoom: function(roomId, showSettings, eventId, invite_sign_url, oob_data) { From 4184158a9a552f5d539559ee58f62f6f211b7257 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 2 Mar 2016 14:01:21 +0000 Subject: [PATCH 09/12] Make comment match reality, attempt 2. --- src/components/structures/MatrixChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index e00fa4ba51..e371f2b98f 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -453,7 +453,7 @@ module.exports = React.createClass({ // // eventId is optional and will cause a switch to the context of that // particular event. - // @param {Object} roomOobData Object of additional data about the room + // @param {Object} oob_data Object of additional data about the room // that has been passed out-of-band (eg. // room name and avatar from an invite email) _viewRoom: function(roomId, showSettings, eventId, invite_sign_url, oob_data) { From 5827a883bf48fa17f6666bafcc8e184594cda616 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 2 Mar 2016 14:02:36 +0000 Subject: [PATCH 10/12] This should be just oob_data too --- src/components/structures/MatrixChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index e371f2b98f..b015abe4a0 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -561,7 +561,7 @@ module.exports = React.createClass({ room_alias: self.starting_room_alias, event_id: self.starting_event_id, invite_sign_url: self.starting_room_invite_sign_url, - room_oob_data: self.starting_room_oob_data, + oob_data: self.starting_room_oob_data, }); delete self.starting_room_alias; delete self.starting_event_id; From de2eaa30784a16d8239b738968c0d5587b7cb38c Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 2 Mar 2016 14:04:51 +0000 Subject: [PATCH 11/12] Document inviterName --- src/components/structures/RoomView.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index b8851108d8..3cd933eaaa 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -66,6 +66,8 @@ module.exports = React.createClass({ // Fields: // * name (string) The room's name // * avatarUrl (string) The mxc:// avatar URL for the room + // * inviterName (string) The display name of the person who + // * invited us tovthe room oobData: React.PropTypes.object, // id of an event to jump to. If not given, will go to the end of the From c585b3edeef473fa78f9b6e15bbb72254fa024c6 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 2 Mar 2016 14:31:01 +0000 Subject: [PATCH 12/12] anothert stray room_ --- src/components/structures/MatrixChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index b015abe4a0..e93544799e 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -365,7 +365,7 @@ module.exports = React.createClass({ room_id: result.room_id, event_id: payload.event_id, invite_sign_url: payload.invite_sign_url, - room_oob_data: payload.oob_data, + oob_data: payload.oob_data, }); }); break;