From 1459478ee0f326d40e15cff924151b1044c234c1 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Tue, 17 May 2016 21:32:08 +0100 Subject: [PATCH 01/34] use right check for end of timeline and avoid bad interactions with forward pagination. thanks @richvdh --- src/components/structures/TimelinePanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index e15993a07c..d804dfd6b9 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -401,7 +401,7 @@ var TimelinePanel = React.createClass({ // if we are scrolled to the bottom, do a quick-reset of our unreadNotificationCount // to avoid having to wait from the remote echo from the homeserver. - if (this.getScrollState().stuckAtBottom) { + if (this.isAtEndOfLiveTimeline()) { this.props.room.setUnreadNotificationCount('total', 0); this.props.room.setUnreadNotificationCount('highlight', 0); // XXX: i'm a bit surprised we don't have to emit an event or dispatch to get this picked up From 817a3debec894003b5cb249eae02aad14c5de517 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Wed, 18 May 2016 11:42:51 +0100 Subject: [PATCH 02/34] debug HS & IS --- src/components/structures/UserSettings.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index e2a28f0cef..0be6271ea4 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -396,6 +396,12 @@ module.exports = React.createClass({
Logged in as {this._me}
+
+ Homeserver is { MatrixClientPeg.get().getHomeserverUrl() } +
+
+ Identity Server is { MatrixClientPeg.get().getIdentityServerUrl() } +
Version {this.state.clientVersion}
From 39a3d6fdd4e5fd9be6c42f87d329c62b7b3a4450 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Tue, 24 May 2016 00:54:20 +0100 Subject: [PATCH 03/34] multiple URL preview support --- src/components/views/messages/TextualBody.js | 49 ++++++++++++-------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 223eabdc36..58e33f7eb3 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -45,9 +45,9 @@ module.exports = React.createClass({ getInitialState: function() { return { - // the URL (if any) to be previewed with a LinkPreviewWidget + // the URLs (if any) to be previewed with a LinkPreviewWidget // inside this TextualBody. - link: null, + links: null, // track whether the preview widget is hidden widgetHidden: false, @@ -57,9 +57,11 @@ module.exports = React.createClass({ componentDidMount: function() { linkifyElement(this.refs.content, linkifyMatrix.options); - var link = this.findLink(this.refs.content.children); - if (link) { - this.setState({ link: link.getAttribute("href") }); + var links = this.findLinks(this.refs.content.children); + if (links.length) { + this.setState({ links: links.map((link)=>{ + return link.getAttribute("href"); + })}); // lazy-load the hidden state of the preview widget from localstorage if (global.localStorage) { @@ -77,24 +79,28 @@ module.exports = React.createClass({ return (nextProps.mxEvent.getId() !== this.props.mxEvent.getId() || nextProps.highlights !== this.props.highlights || nextProps.highlightLink !== this.props.highlightLink || - nextState.link !== this.state.link || + nextState.links !== this.state.links || nextState.widgetHidden !== this.state.widgetHidden); }, - findLink: function(nodes) { + findLinks: function(nodes) { + var links = []; for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; if (node.tagName === "A" && node.getAttribute("href")) { - return this.isLinkPreviewable(node) ? node : undefined; + if (this.isLinkPreviewable(node)) { + links.push(node); + } } else if (node.tagName === "PRE" || node.tagName === "CODE") { - return; + continue; } else if (node.children && node.children.length) { - return this.findLink(node.children) + links = links.concat(this.findLinks(node.children)); } } + return links; }, isLinkPreviewable: function(node) { @@ -160,14 +166,17 @@ module.exports = React.createClass({ {highlightLink: this.props.highlightLink}); - var widget; - if (this.state.link && !this.state.widgetHidden) { + var widgets; + if (this.state.links && !this.state.widgetHidden) { var LinkPreviewWidget = sdk.getComponent('rooms.LinkPreviewWidget'); - widget = ; + widgets = this.state.links.map((link)=>{ + return ; + }); } switch (content.msgtype) { @@ -176,21 +185,21 @@ module.exports = React.createClass({ return ( * { name } { body } - { widget } + { widgets } ); case "m.notice": return ( { body } - { widget } + { widgets } ); default: // including "m.text" return ( { body } - { widget } + { widgets } ); } From 07cc9bf77dbb1a8835dd7104f3741103f9418a6d Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Tue, 24 May 2016 11:44:30 +0100 Subject: [PATCH 04/34] how ironic --- src/SlashCommands.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SlashCommands.js b/src/SlashCommands.js index 5a43d41dd5..e4c0d5973a 100644 --- a/src/SlashCommands.js +++ b/src/SlashCommands.js @@ -330,7 +330,7 @@ module.exports = { * Returns null if the input didn't match a command. */ processInput: function(roomId, input) { - // trim any trailing whitespace, as it can confuse the parser for + // trim any trailing whitespace, as it can confuse the parser for // IRC-style commands input = input.replace(/\s+$/, ""); if (input[0] === "/" && input[1] !== "/") { From ed835752bc9f632e91c747565a88e07c9b2d6179 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 26 May 2016 13:51:51 +0100 Subject: [PATCH 05/34] Hopefully fix memory leak with velocity --- src/Velociraptor.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Velociraptor.js b/src/Velociraptor.js index ad12d1323b..bad921c8c4 100644 --- a/src/Velociraptor.js +++ b/src/Velociraptor.js @@ -25,6 +25,10 @@ module.exports = React.createClass({ this._updateChildren(this.props.children); }, + componentWillUnmount: function() { + this._updateChildren([]); + }, + componentWillReceiveProps: function(nextProps) { this._updateChildren(nextProps.children); }, @@ -106,6 +110,9 @@ module.exports = React.createClass({ }); //console.log("enter: "+JSON.stringify(node.props._restingStyle)); + } else if (node === null) { + // https://github.com/julianshapiro/velocity/issues/300 + Velocity.Utilities.removeData(this.nodes[k]); } this.nodes[k] = node; }, From 3a5e37aa84cf16df1db1d2b0be917a6745ed0584 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 26 May 2016 16:22:40 +0100 Subject: [PATCH 06/34] This actually shouldn't be necessary. --- src/Velociraptor.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Velociraptor.js b/src/Velociraptor.js index bad921c8c4..9132f7b7b9 100644 --- a/src/Velociraptor.js +++ b/src/Velociraptor.js @@ -25,10 +25,6 @@ module.exports = React.createClass({ this._updateChildren(this.props.children); }, - componentWillUnmount: function() { - this._updateChildren([]); - }, - componentWillReceiveProps: function(nextProps) { this._updateChildren(nextProps.children); }, From 1664f461805c7b8ac772a7b67c1f9f5faa52dd4d Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 26 May 2016 16:30:04 +0100 Subject: [PATCH 07/34] Add comment --- src/Velociraptor.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Velociraptor.js b/src/Velociraptor.js index 9132f7b7b9..0abf34b230 100644 --- a/src/Velociraptor.js +++ b/src/Velociraptor.js @@ -107,7 +107,16 @@ module.exports = React.createClass({ //console.log("enter: "+JSON.stringify(node.props._restingStyle)); } else if (node === null) { + // Velocity stores data on elements using the jQuery .data() + // method, and assumes you'll be using jQuery's .remove() to + // remove the element, but we don't use jQuery, so we need to + // blow away the element's data explicitly otherwise it will leak. + // This uses Velocity's internal jQuery compatible wrapper. + // See the bug at // https://github.com/julianshapiro/velocity/issues/300 + // and the FAQ entry, "Preventing memory leaks when + // creating/destroying large numbers of elements" + // (https://github.com/julianshapiro/velocity/issues/47) Velocity.Utilities.removeData(this.nodes[k]); } this.nodes[k] = node; From d5e6e961fd9e66a1bc7b008014ebdd18eec12eac Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Fri, 27 May 2016 10:09:07 +0100 Subject: [PATCH 08/34] fix url previews firing incorrectly on Matrix.org --- src/components/views/messages/TextualBody.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 223eabdc36..a72608d329 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -117,7 +117,7 @@ module.exports = React.createClass({ else { var url = node.getAttribute("href"); var host = url.match(/^https?:\/\/(.*?)(\/|$)/)[1]; - if (node.textContent.trim().startsWith(host)) { + if (node.textContent.toLowerCase().trim().startsWith(host.toLowerCase())) { // it's a "foo.pl" style link return; } From 118eec8cc06e5f38fa0450be0a693e27531dd29d Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 27 May 2016 14:57:43 +0100 Subject: [PATCH 09/34] Add a fallback home server to log into If login fail with a credential error on the default HS, try logging in on the fallback one. --- src/Signup.js | 27 +++++++++++++++++++++++- src/components/structures/MatrixChat.js | 5 +++++ src/components/structures/login/Login.js | 8 ++++++- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/Signup.js b/src/Signup.js index 5b368b4811..4518955d95 100644 --- a/src/Signup.js +++ b/src/Signup.js @@ -293,8 +293,9 @@ class Register extends Signup { class Login extends Signup { - constructor(hsUrl, isUrl) { + constructor(hsUrl, isUrl, fallbackHsUrl) { super(hsUrl, isUrl); + this._fallbackHsUrl = fallbackHsUrl; this._currentFlowIndex = 0; this._flows = []; } @@ -359,6 +360,30 @@ class Login extends Signup { error.friendlyText = ( 'Incorrect username and/or password.' ); + if (self._fallbackHsUrl) { + // as per elsewhere, it would be much nicer to not replace the global + // client just to try an alternate HS + MatrixClientPeg.replaceUsingUrls( + self._fallbackHsUrl, + self._isUrl + ); + return MatrixClientPeg.get().login('m.login.password', loginParams).then(function(data) { + return q({ + homeserverUrl: self._fallbackHsUrl, + identityServerUrl: self._isUrl, + userId: data.user_id, + accessToken: data.access_token + }); + }, function(fallback_error) { + // We also have to put the default back again if it fails... + MatrixClientPeg.replaceUsingUrls( + this._hsUrl, + this._isUrl + ); + // throw the original error + throw error; + }); + } } else { error.friendlyText = ( diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 255f7c9b92..2f7a6ed8ec 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -103,6 +103,10 @@ module.exports = React.createClass({ return "https://matrix.org"; }, + getFallbackHsUrl: function() { + return this.props.config.fallback_hs_url; + }, + getCurrentIsUrl: function() { if (this.state.register_is_url) { return this.state.register_is_url; @@ -1183,6 +1187,7 @@ module.exports = React.createClass({ defaultIsUrl={this.props.config.default_is_url} customHsUrl={this.getCurrentHsUrl()} customIsUrl={this.getCurrentIsUrl()} + fallbackHsUrl={this.getFallbackHsUrl()} onForgotPasswordClick={this.onForgotPasswordClick} onLoginAsGuestClick={this.props.enableGuest && this.props.config && this.props.config.default_hs_url ? this._registerAsGuest.bind(this, true) : undefined} onCancelClick={ this.state.guestCreds ? this.onReturnToGuestClick : null } diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js index d127c7ed78..aa0c42dc98 100644 --- a/src/components/structures/login/Login.js +++ b/src/components/structures/login/Login.js @@ -35,6 +35,10 @@ module.exports = React.createClass({displayName: 'Login', customIsUrl: React.PropTypes.string, defaultHsUrl: React.PropTypes.string, defaultIsUrl: React.PropTypes.string, + // Secondary HS which we try to log into if the user is using + // the default HS but login fails. Useful for migrating to a + // different home server without confusing users. + fallbackHsUrl: React.PropTypes.string, // login shouldn't know or care how registration is done. onRegisterClick: React.PropTypes.func.isRequired, @@ -105,7 +109,9 @@ module.exports = React.createClass({displayName: 'Login', hsUrl = hsUrl || this.state.enteredHomeserverUrl; isUrl = isUrl || this.state.enteredIdentityServerUrl; - var loginLogic = new Signup.Login(hsUrl, isUrl); + var fallbackHsUrl = hsUrl == this.props.defaultHsUrl ? this.props.fallbackHsUrl : null; + + var loginLogic = new Signup.Login(hsUrl, isUrl, fallbackHsUrl); this._loginLogic = loginLogic; loginLogic.getFlows().then(function(flows) { From b3638f9169d481840c8adb2e751ca55e8ab3a29a Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Tue, 31 May 2016 19:42:00 +0100 Subject: [PATCH 10/34] PR review --- src/components/views/messages/TextualBody.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 58e33f7eb3..7743d5de7a 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -47,7 +47,7 @@ module.exports = React.createClass({ return { // the URLs (if any) to be previewed with a LinkPreviewWidget // inside this TextualBody. - links: null, + links: [], // track whether the preview widget is hidden widgetHidden: false, @@ -76,6 +76,7 @@ module.exports = React.createClass({ shouldComponentUpdate: function(nextProps, nextState) { // exploit that events are immutable :) + // ...and that .links is only ever set in componentDidMount and never changes return (nextProps.mxEvent.getId() !== this.props.mxEvent.getId() || nextProps.highlights !== this.props.highlights || nextProps.highlightLink !== this.props.highlightLink || @@ -167,7 +168,7 @@ module.exports = React.createClass({ var widgets; - if (this.state.links && !this.state.widgetHidden) { + if (this.state.links.length && !this.state.widgetHidden) { var LinkPreviewWidget = sdk.getComponent('rooms.LinkPreviewWidget'); widgets = this.state.links.map((link)=>{ return Date: Tue, 31 May 2016 21:44:11 +0100 Subject: [PATCH 11/34] fix tag unsetting https://github.com/vector-im/vector-web/issues/1499 - HOW DID THIS EVER WORK?!?! --- src/components/views/rooms/RoomSettings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js index fd8bcbfe96..8764700c5a 100644 --- a/src/components/views/rooms/RoomSettings.js +++ b/src/components/views/rooms/RoomSettings.js @@ -34,7 +34,7 @@ module.exports = React.createClass({ getInitialState: function() { var tags = {}; Object.keys(this.props.room.tags).forEach(function(tagName) { - tags[tagName] = {}; + tags[tagName] = ['yep']; }); var areNotifsMuted = false; @@ -180,7 +180,7 @@ module.exports = React.createClass({ // tags if (this.state.tags_changed) { var tagDiffs = ObjectUtils.getKeyValueArrayDiffs(originalState.tags, this.state.tags); - // [ {place: add, key: "m.favourite", val: "yep"} ] + // [ {place: add, key: "m.favourite", val: ["yep"]} ] tagDiffs.forEach(function(diff) { switch (diff.place) { case "add": From e1ba7df66e4970c7506e9f882bae07bd4ec47628 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Tue, 31 May 2016 23:50:21 +0100 Subject: [PATCH 12/34] fix the Add button for email addies --- src/components/structures/UserSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index 0be6271ea4..a0c03731da 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -299,7 +299,7 @@ module.exports = React.createClass({ onValueChanged={ this.onAddThreepidClicked } />
- Add + Add
); From c3fc76cdaa554d604c739806d59d4a14eac1e38a Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Tue, 31 May 2016 23:59:36 +0100 Subject: [PATCH 13/34] warn guests to register nicely to upload files --- src/components/structures/RoomView.js | 10 ++++++++++ src/components/views/rooms/MessageComposer.js | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 33bbb510e3..77080b5a75 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -677,6 +677,16 @@ module.exports = React.createClass({ uploadFile: function(file) { var self = this; + + if (MatrixClientPeg.get().isGuest()) { + var NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog"); + Modal.createDialog(NeedToRegisterDialog, { + title: "Please Register", + description: "Guest users can't upload files. Please register to upload." + }); + return; + } + ContentMessages.sendContentToRoom( file, this.state.room.roomId, MatrixClientPeg.get() ).done(undefined, function(error) { diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index 20785c4c70..18d138f013 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -46,6 +46,15 @@ module.exports = React.createClass({ }, onUploadClick: function(ev) { + if (MatrixClientPeg.get().isGuest()) { + var NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog"); + Modal.createDialog(NeedToRegisterDialog, { + title: "Please Register", + description: "Guest users can't upload files. Please register to upload." + }); + return; + } + this.refs.uploadInput.click(); }, From 272afe39dc15284d921d159ebf1a1284824b609f Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Wed, 1 Jun 2016 02:03:53 +0100 Subject: [PATCH 14/34] do not list rooms by default --- src/components/structures/MatrixChat.js | 1 + src/components/views/rooms/MemberInfo.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 2f7a6ed8ec..8ee395a218 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -492,6 +492,7 @@ module.exports = React.createClass({ }, type: 'm.room.guest_access', state_key: '', + visibility: 'private', } ], }).done(function(res) { diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 76e5af7612..889bc7bd8a 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -340,6 +340,7 @@ module.exports = React.createClass({ }, type: 'm.room.guest_access', state_key: '', + visibility: 'private', } ], }).then( From 0747ca392350f0fba25b4e076ff7152d63391fe8 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 19 May 2016 23:00:28 +0100 Subject: [PATCH 15/34] ignore @ prefixes when sorting memberlist --- src/components/views/rooms/MemberList.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/MemberList.js b/src/components/views/rooms/MemberList.js index f029c519bc..a1769ad5f3 100644 --- a/src/components/views/rooms/MemberList.js +++ b/src/components/views/rooms/MemberList.js @@ -387,7 +387,9 @@ module.exports = React.createClass({ // console.log(memberA + " and " + memberB + " have same power level"); if (memberA.name && memberB.name) { // console.log("comparing names: " + memberA.name + " and " + memberB.name); - return memberA.name.localeCompare(memberB.name); + var nameA = memberA.name[0] === '@' ? memberA.name.substr(1) : memberA.name; + var nameB = memberB.name[0] === '@' ? memberB.name.substr(1) : memberB.name; + return nameA.localeCompare(nameB); } else { return 0; From 3b34311e0514b0c14ac60fec4fd398546dbc4551 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Wed, 1 Jun 2016 23:42:34 +0100 Subject: [PATCH 16/34] implement new UX for 3pid invites --- src/components/views/rooms/InviteMemberList.js | 17 ++++++++++++++--- src/components/views/rooms/MemberInfo.js | 2 +- src/components/views/rooms/MemberList.js | 16 ++++++++++++++++ .../views/rooms/SearchableEntityList.js | 13 ++++++++----- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/components/views/rooms/InviteMemberList.js b/src/components/views/rooms/InviteMemberList.js index 480066771b..8f8b22eaa7 100644 --- a/src/components/views/rooms/InviteMemberList.js +++ b/src/components/views/rooms/InviteMemberList.js @@ -26,6 +26,7 @@ module.exports = React.createClass({ propTypes: { roomId: React.PropTypes.string.isRequired, onInvite: React.PropTypes.func.isRequired, // fn(inputText) + onThirdPartyInvite: React.PropTypes.func.isRequired, // fn(inputText) onSearchQueryChanged: React.PropTypes.func // fn(inputText) }, @@ -49,10 +50,19 @@ module.exports = React.createClass({ } }, + componentDidMount: function() { + // initialise the email tile + this.onSearchQueryChanged(''); + }, + onInvite: function(ev) { this.props.onInvite(this._input); }, + onThirdPartyInvite: function(ev) { + this.props.onThirdPartyInvite(this._input); + }, + onSearchQueryChanged: function(input) { this._input = input; var EntityTile = sdk.getComponent("rooms.EntityTile"); @@ -68,9 +78,10 @@ module.exports = React.createClass({ this._emailEntity = new Entities.newEntity( } - className="mx_EntityTile_invitePlaceholder" - presenceState="online" onClick={this.onInvite} name={label} />, + avatarJsx={ } + className="mx_EntityTile_invitePlaceholder" + presenceState="online" onClick={this.onThirdPartyInvite} name={"Invite by email"} + />, function(query) { return true; // always show this } diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 889bc7bd8a..ba4a3734f5 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -368,7 +368,7 @@ module.exports = React.createClass({ action: 'leave_room', room_id: this.props.member.roomId, }); - this.props.onFinished(); + this.props.onFinished(); }, getInitialState: function() { diff --git a/src/components/views/rooms/MemberList.js b/src/components/views/rooms/MemberList.js index a1769ad5f3..21c0827fcc 100644 --- a/src/components/views/rooms/MemberList.js +++ b/src/components/views/rooms/MemberList.js @@ -166,6 +166,21 @@ module.exports = React.createClass({ }); }, 500), + onThirdPartyInvite: function(inputText) { + var TextInputDialog = sdk.getComponent("dialogs.TextInputDialog"); + Modal.createDialog(TextInputDialog, { + title: "Invite members by email", + description: "Please enter the email addresses to be invited (comma separated)", + value: inputText, + button: "Invite", + onFinished: (should_invite, addresses)=>{ + if (should_invite) { + this.onInvite(addresses); + } + } + }); + }, + onInvite: function(inputText) { var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); var NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog"); @@ -514,6 +529,7 @@ module.exports = React.createClass({ inviteMemberListSection = ( ); } diff --git a/src/components/views/rooms/SearchableEntityList.js b/src/components/views/rooms/SearchableEntityList.js index c09fc2faee..28e7b1785c 100644 --- a/src/components/views/rooms/SearchableEntityList.js +++ b/src/components/views/rooms/SearchableEntityList.js @@ -48,6 +48,7 @@ var SearchableEntityList = React.createClass({ getInitialState: function() { return { query: "", + focused: false, truncateAt: this.props.truncateAt, results: this.getSearchResults("", this.props.entities) }; @@ -101,7 +102,7 @@ var SearchableEntityList = React.createClass({ getSearchResults: function(query, entities) { if (!query || query.length === 0) { - return this.props.emptyQueryShowsAll ? entities : [] + return this.props.emptyQueryShowsAll ? entities : [ entities[0] ] } return entities.filter(function(e) { return e.matches(query); @@ -128,19 +129,21 @@ var SearchableEntityList = React.createClass({ render: function() { var inputBox; - + if (this.props.showInputBox) { inputBox = (
{ this.setState({ focused: true }) } } + onBlur={ ()=>{ this.setState({ focused: false }) } } placeholder={this.props.searchPlaceholderText} />
); } var list; - if (this.state.results.length) { + if (this.state.results.length > 1 || this.state.focused) { if (this.props.truncateAt) { // caller wants list truncated var TruncatedList = sdk.getComponent("elements.TruncatedList"); list = ( @@ -172,10 +175,10 @@ var SearchableEntityList = React.createClass({ } return ( -
+
{ inputBox } { list } - { this.state.query.length ?

: '' } + { list ?

: '' }
); } From 83fd02bdfadf78ce2309da15fbae95e7878e3e56 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 11:50:00 +0100 Subject: [PATCH 17/34] specify a brand when registering accounts --- src/Signup.js | 7 ++++++- src/components/structures/MatrixChat.js | 1 + src/components/structures/login/Registration.js | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Signup.js b/src/Signup.js index 4518955d95..c4fce88262 100644 --- a/src/Signup.js +++ b/src/Signup.js @@ -51,6 +51,7 @@ class Register extends Signup { this.username = undefined; // desired this.email = undefined; // desired this.password = undefined; // desired + this.brand = undefined; // optional brand to let the HS brand its mail notifs } setClientSecret(secret) { @@ -73,6 +74,10 @@ class Register extends Signup { this.guestAccessToken = token; } + setBrand(brand) { + this.brand = brand; + } + getStep() { return this._step; } @@ -131,7 +136,7 @@ class Register extends Signup { return MatrixClientPeg.get().register( this.username, this.password, this.params.sessionId, authDict, bindEmail, - this.guestAccessToken + this.guestAccessToken, this.brand ).then(function(result) { self.credentials = result; self.setStep("COMPLETE"); diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 8ee395a218..f708a3e0fb 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1160,6 +1160,7 @@ module.exports = React.createClass({ guestAccessToken={this.state.guestAccessToken} defaultHsUrl={this.props.config.default_hs_url} defaultIsUrl={this.props.config.default_is_url} + brand={this.props.config.brand} customHsUrl={this.getCurrentHsUrl()} customIsUrl={this.getCurrentIsUrl()} registrationUrl={this.props.registrationUrl} diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js index d852991b9c..e1b3780435 100644 --- a/src/components/structures/login/Registration.js +++ b/src/components/structures/login/Registration.js @@ -40,6 +40,7 @@ module.exports = React.createClass({ customIsUrl: React.PropTypes.string, defaultHsUrl: React.PropTypes.string, defaultIsUrl: React.PropTypes.string, + brand: React.PropTypes.string, email: React.PropTypes.string, username: React.PropTypes.string, guestAccessToken: React.PropTypes.string, @@ -66,6 +67,7 @@ module.exports = React.createClass({ this.registerLogic.setRegistrationUrl(this.props.registrationUrl); this.registerLogic.setIdSid(this.props.idSid); this.registerLogic.setGuestAccessToken(this.props.guestAccessToken); + this.registerLogic.setBrand(this.props.brand); this.registerLogic.recheckState(); }, From 1d314631403500c6df17ab57292f9218d4e00ac5 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 13:14:52 +0100 Subject: [PATCH 18/34] set email branding after registration --- src/Signup.js | 7 +----- src/UserSettingsStore.js | 4 ++-- .../structures/login/Registration.js | 22 ++++++++++++++++++- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/Signup.js b/src/Signup.js index c4fce88262..4518955d95 100644 --- a/src/Signup.js +++ b/src/Signup.js @@ -51,7 +51,6 @@ class Register extends Signup { this.username = undefined; // desired this.email = undefined; // desired this.password = undefined; // desired - this.brand = undefined; // optional brand to let the HS brand its mail notifs } setClientSecret(secret) { @@ -74,10 +73,6 @@ class Register extends Signup { this.guestAccessToken = token; } - setBrand(brand) { - this.brand = brand; - } - getStep() { return this._step; } @@ -136,7 +131,7 @@ class Register extends Signup { return MatrixClientPeg.get().register( this.username, this.password, this.params.sessionId, authDict, bindEmail, - this.guestAccessToken, this.brand + this.guestAccessToken ).then(function(result) { self.credentials = result; self.setStep("COMPLETE"); diff --git a/src/UserSettingsStore.js b/src/UserSettingsStore.js index cf7131eb7b..9bb1388e76 100644 --- a/src/UserSettingsStore.js +++ b/src/UserSettingsStore.js @@ -100,7 +100,7 @@ module.exports = { return this.getEmailPusher(pushers, address) !== undefined; }, - addEmailPusher: function(address) { + addEmailPusher: function(address, data) { return MatrixClientPeg.get().setPusher({ kind: 'email', app_id: "m.email", @@ -108,7 +108,7 @@ module.exports = { app_display_name: 'Email Notifications', device_display_name: address, lang: navigator.language, - data: {}, + data: data, append: true, // We always append for email pushers since we don't want to stop other accounts notifying to the same email address }); }, diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js index e1b3780435..2f15a3b5df 100644 --- a/src/components/structures/login/Registration.js +++ b/src/components/structures/login/Registration.js @@ -22,6 +22,7 @@ var sdk = require('../../../index'); var dis = require('../../../dispatcher'); var Signup = require("../../../Signup"); var ServerConfig = require("../../views/login/ServerConfig"); +var MatrixClientPeg = require("../../../MatrixClientPeg"); var RegistrationForm = require("../../views/login/RegistrationForm"); var CaptchaForm = require("../../views/login/CaptchaForm"); @@ -67,7 +68,6 @@ module.exports = React.createClass({ this.registerLogic.setRegistrationUrl(this.props.registrationUrl); this.registerLogic.setIdSid(this.props.idSid); this.registerLogic.setGuestAccessToken(this.props.guestAccessToken); - this.registerLogic.setBrand(this.props.brand); this.registerLogic.recheckState(); }, @@ -147,6 +147,26 @@ module.exports = React.createClass({ identityServerUrl: self.registerLogic.getIdentityServerUrl(), accessToken: response.access_token }); + + if (self.props.brand) { + MatrixClientPeg.get().getPushers().done((resp)=>{ + var pushers = resp.pushers; + for (var i = 0; i < pushers.length; ++i) { + if (pushers[i].kind == 'email') { + var emailPusher = pushers[i]; + emailPusher.data = { brand: self.props.brand }; + MatrixClientPeg.get().setPusher(emailPusher).done(() => { + console.log("Set email branding to " + self.props.brand); + }, (error) => { + console.error("Couldn't set email branding: " + error); + }); + } + } + }, (error) => { + console.error("Couldn't get pushers: " + error); + }); + } + }, function(err) { if (err.message) { self.setState({ From d812c77fc136cca79012ad576a3957767cee1b74 Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Thu, 2 Jun 2016 13:36:45 +0100 Subject: [PATCH 19/34] Bump to js-sdk 0.5.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3f4a862f6f..b771cef20b 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "highlight.js": "^8.9.1", "linkifyjs": "^2.0.0-beta.4", "marked": "^0.3.5", - "matrix-js-sdk": "^0.5.2", + "matrix-js-sdk": "^0.5.3", "optimist": "^0.6.1", "q": "^1.4.1", "react": "^15.0.1", From 9a77796d770f5bee901697aabd792ad9b497ee3e Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Thu, 2 Jun 2016 13:38:18 +0100 Subject: [PATCH 20/34] Prepare changelog for v0.6.0 --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 262d55c6da..6a7040627c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ +Changes in [0.6.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.6.0) (2016-06-02) +=================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.5.2...v0.6.0) + + * implement new UX for 3pid invites + [\#297](https://github.com/matrix-org/matrix-react-sdk/pull/297) + * multiple URL preview support + [\#290](https://github.com/matrix-org/matrix-react-sdk/pull/290) + * Add a fallback home server to log into + [\#293](https://github.com/matrix-org/matrix-react-sdk/pull/293) + * Hopefully fix memory leak with velocity + [\#291](https://github.com/matrix-org/matrix-react-sdk/pull/291) + * Support for enabling email notifications + [\#289](https://github.com/matrix-org/matrix-react-sdk/pull/289) + * Correct Readme instructions how to customize the UI + [\#286](https://github.com/matrix-org/matrix-react-sdk/pull/286) + * Avoid rerendering during Room unmount + [\#285](https://github.com/matrix-org/matrix-react-sdk/pull/285) + Changes in [0.5.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.5.2) (2016-04-22) =================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.5.1...v0.5.2) From 268cedee0f20759bb76ba4ddba02c358fecc536f Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Thu, 2 Jun 2016 13:38:19 +0100 Subject: [PATCH 21/34] 0.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b771cef20b..93cbe60754 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.5.2", + "version": "0.6.0", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 5379956b0d1f33846d98b6e6540d28f8b51c139f Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Thu, 2 Jun 2016 16:42:19 +0100 Subject: [PATCH 22/34] jenkins.sh: remove spurious 'npm install' Just let npm install matrix-js-sdk, rather than installing the one from jenkins --- jenkins.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/jenkins.sh b/jenkins.sh index 51fab5d020..eeb7d7d56e 100755 --- a/jenkins.sh +++ b/jenkins.sh @@ -8,9 +8,6 @@ nvm use 4 set -x -# install the version of js-sdk provided to us by jenkins -npm install ./node_modules/matrix-js-sdk-*.tgz - # install the other dependencies npm install From 487f3c72dde7641d56d243af2e891982e1f45b7c Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 16:59:38 +0100 Subject: [PATCH 23/34] fix new 3pid invite UI --- .../views/rooms/SearchableEntityList.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/components/views/rooms/SearchableEntityList.js b/src/components/views/rooms/SearchableEntityList.js index 28e7b1785c..a22126025c 100644 --- a/src/components/views/rooms/SearchableEntityList.js +++ b/src/components/views/rooms/SearchableEntityList.js @@ -129,14 +129,26 @@ var SearchableEntityList = React.createClass({ render: function() { var inputBox; - + if (this.props.showInputBox) { inputBox = (
{ this.setState({ focused: true }) } } - onBlur={ ()=>{ this.setState({ focused: false }) } } + onFocus={ ()=>{ + if (this._blurTimeout) { + clearTimeout(this.blurTimeout); + } + this.setState({ focused: true }); + } } + onBlur={ ()=>{ + // nasty setTimeout heuristic to avoid the 'invite by email' prompt disappearing + // due to the onBlur before we can click on it + this._blurTimeout = setTimeout( + ()=>{ this.setState({ focused: false }) }, + 300 + ); + } } placeholder={this.props.searchPlaceholderText} />
); From d857859d51cba7be1bc992bf16352feb71f02426 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 18:32:50 +0100 Subject: [PATCH 24/34] Prepare changelog for v0.6.1 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a7040627c..31d997c4a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +Changes in [0.6.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.6.1) (2016-06-02) +=================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.6.0...v0.6.1) + + * Fix focusing race in new UX for 3pid invites + * Fix jenkins.sh + Changes in [0.6.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.6.0) (2016-06-02) =================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.5.2...v0.6.0) From 204437e40c97a888ed58c66d10f77296aca24844 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 18:32:50 +0100 Subject: [PATCH 25/34] 0.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 93cbe60754..e9fbe742fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.6.0", + "version": "0.6.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 168f74d6cf3f444a13f4a1a0c59aeb0e5031069f Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 18:53:50 +0100 Subject: [PATCH 26/34] correctly bump dep on js-sdk 0.5.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9fbe742fa..daf691e33e 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "highlight.js": "^8.9.1", "linkifyjs": "^2.0.0-beta.4", "marked": "^0.3.5", - "matrix-js-sdk": "^0.5.3", + "matrix-js-sdk": "^0.5.4", "optimist": "^0.6.1", "q": "^1.4.1", "react": "^15.0.1", From 5ecbd10d361ff50eacde4faeeee24f22d078d88c Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 18:55:34 +0100 Subject: [PATCH 27/34] Prepare changelog for v0.6.2 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31d997c4a9..2026ea2701 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +Changes in [0.6.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.6.2) (2016-06-02) +=================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.6.1...v0.6.2) + + * Correctly bump dep on matrix-js-sdk 0.5.4 + Changes in [0.6.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.6.1) (2016-06-02) =================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.6.0...v0.6.1) From b06ab78a81991cfba58a09dbde10b83135fe8c7c Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 18:55:34 +0100 Subject: [PATCH 28/34] 0.6.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index daf691e33e..4740a72894 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.6.1", + "version": "0.6.2", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From e20a1acb883d8c6de28c623014605886a7c939b0 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 19:22:11 +0100 Subject: [PATCH 29/34] label our versions sensibly --- src/components/structures/UserSettings.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index a0c03731da..e56e5d9d87 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -403,9 +403,8 @@ module.exports = React.createClass({ Identity Server is { MatrixClientPeg.get().getIdentityServerUrl() }
- Version {this.state.clientVersion} -
- {this.props.version} + matrix-react-sdk version: {this.state.clientVersion}
+ vector-web version: {this.props.version}
From 532e93d7cb910e9f357e7e7ddf6eb181a6ea02e3 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 21:07:04 +0100 Subject: [PATCH 30/34] fix up trailing whitespace and put the buttons in the right order --- src/components/views/dialogs/TextInputDialog.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/views/dialogs/TextInputDialog.js b/src/components/views/dialogs/TextInputDialog.js index d81ae98718..fed7ff079a 100644 --- a/src/components/views/dialogs/TextInputDialog.js +++ b/src/components/views/dialogs/TextInputDialog.js @@ -39,11 +39,11 @@ module.exports = React.createClass({ focus: true }; }, - + componentDidMount: function() { if (this.props.focus) { - // Set the cursor at the end of the text input - this.refs.textinput.value = this.props.value; + // Set the cursor at the end of the text input + this.refs.textinput.value = this.props.value; } }, @@ -83,13 +83,12 @@ module.exports = React.createClass({
- - +
); From 1b3c8481f6ceaaf51328c6f383f9ce98e45bdd21 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 21:07:47 +0100 Subject: [PATCH 31/34] fix dialog prompt an embarassing bug where if 3pid invites triggered a dialog they'd get wedged --- src/components/views/rooms/MemberList.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/MemberList.js b/src/components/views/rooms/MemberList.js index 21c0827fcc..328f9774c7 100644 --- a/src/components/views/rooms/MemberList.js +++ b/src/components/views/rooms/MemberList.js @@ -170,12 +170,16 @@ module.exports = React.createClass({ var TextInputDialog = sdk.getComponent("dialogs.TextInputDialog"); Modal.createDialog(TextInputDialog, { title: "Invite members by email", - description: "Please enter the email addresses to be invited (comma separated)", + description: "Please enter one or more email addresses", value: inputText, button: "Invite", onFinished: (should_invite, addresses)=>{ if (should_invite) { - this.onInvite(addresses); + // defer the actual invite to the next event loop to give this + // Modal a chance to unmount in case onInvite() triggers a new one + setTimeout(()=>{ + this.onInvite(addresses); + }, 0); } } }); From f8b3128645b58606ec2d729ab9dc9f10e74933f5 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 2 Jun 2016 23:33:55 +0100 Subject: [PATCH 32/34] invite input box wording for amandine --- src/components/views/rooms/InviteMemberList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/InviteMemberList.js b/src/components/views/rooms/InviteMemberList.js index 8f8b22eaa7..5246e2e54d 100644 --- a/src/components/views/rooms/InviteMemberList.js +++ b/src/components/views/rooms/InviteMemberList.js @@ -100,7 +100,7 @@ module.exports = React.createClass({ } return ( - Date: Fri, 3 Jun 2016 12:17:45 +0100 Subject: [PATCH 33/34] Prepare changelog for v0.6.3 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2026ea2701..70f946d7cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +Changes in [0.6.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.6.3) (2016-06-03) +=================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.6.2...v0.6.3) + + * Change invite text field wording + * Fix bug with new email invite UX where the invite could get wedged + * Label app versions sensibly in UserSettings + Changes in [0.6.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.6.2) (2016-06-02) =================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.6.1...v0.6.2) From 507f5e2ca19156a2afd3470fc9b17fb5e65cdf9b Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Fri, 3 Jun 2016 12:17:46 +0100 Subject: [PATCH 34/34] 0.6.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4740a72894..7dce6b3d79 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.6.2", + "version": "0.6.3", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": {