From e1a40a8ef0ed973b185fd3c65e0e2b0e7ca67cc9 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Thu, 23 Feb 2017 16:30:26 +0000 Subject: [PATCH 1/4] Notify MatrixChat of teamToken after login --- src/Lifecycle.js | 4 ++++ src/components/structures/MatrixChat.js | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 295ffe44f4..76b07bc6ed 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -304,6 +304,10 @@ export function setLoggedIn(credentials) { rtsClient.login(credentials.userId).then((body) => { if (body.team_token) { localStorage.setItem("mx_team_token", body.team_token); + dis.dispatch({ + action: 'set_team_token', + value: body.team_token, + }) } }, (err) =>{ console.error( diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index e885614ffe..c7943bb56c 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -518,6 +518,9 @@ module.exports = React.createClass({ case 'set_theme': this._onSetTheme(payload.value); break; + case 'set_team_token': + this._onSetTeamToken(payload.value); + break; case 'on_logged_in': this._onLoggedIn(); break; @@ -692,6 +695,16 @@ module.exports = React.createClass({ } }, + /** + * Called when the team token is acquired at registration or login. This + * should only happen if the configured RTS (see config.json teamServerURL) + * recognises the user as having an email address that matches a team. + */ + _onSetTeamToken: function(teamToken) { + this._teamToken = teamToken; + this._setPage(PageTypes.HomePage); + }, + /** * Called when a new logged in session has started */ @@ -1003,8 +1016,7 @@ module.exports = React.createClass({ }, onTeamMemberRegistered: function(teamToken) { - this._teamToken = teamToken; - this._setPage(PageTypes.HomePage); + this._onSetTeamToken(teamToken); }, onFinishPostRegistration: function() { From 48a3d0d595de6065831fa880141096c7dcb0b10b Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Tue, 28 Feb 2017 15:05:49 +0000 Subject: [PATCH 2/4] Refactor to not set team token in bad ways Use the on_logged_in dispatch instead. Call setPage in one place, _onLoggedIn, when deciding which page to view on login. Change some require to import, var to const. Remove onTeamMemberRegistered and just use a nullable argument to onRegistered --- src/Lifecycle.js | 24 ++--- src/components/structures/MatrixChat.js | 44 +++------- .../structures/login/Registration.js | 88 +++++++++++-------- 3 files changed, 76 insertions(+), 80 deletions(-) diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 76b07bc6ed..e642440bf0 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -277,6 +277,9 @@ export function setLoggedIn(credentials) { credentials.userId, credentials.guest, credentials.homeserverUrl); + // Resolves by default + let teamPromise = q(null); + // persist the session if (localStorage) { try { @@ -300,20 +303,12 @@ export function setLoggedIn(credentials) { console.warn("Error using local storage: can't persist session!", e); } - if (rtsClient) { - rtsClient.login(credentials.userId).then((body) => { + if (rtsClient && !credentials.guest) { + teamPromise = rtsClient.login(credentials.userId).then((body) => { if (body.team_token) { localStorage.setItem("mx_team_token", body.team_token); - dis.dispatch({ - action: 'set_team_token', - value: body.team_token, - }) } - }, (err) =>{ - console.error( - "Failed to get team token on login, not persisting to localStorage", - err - ); + return body.team_token; }); } } else { @@ -322,7 +317,12 @@ export function setLoggedIn(credentials) { MatrixClientPeg.replaceUsingCreds(credentials); - dis.dispatch({action: 'on_logged_in'}); + teamPromise.then((teamToken) => { + dis.dispatch({action: 'on_logged_in', teamToken: teamToken}); + }, (err) => { + console.warn("Failed to get team token on login", err); + dis.dispatch({action: 'on_logged_in', teamToken: null}); + }); startMatrixClient(); } diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index c7943bb56c..9a1eb90620 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -518,11 +518,8 @@ module.exports = React.createClass({ case 'set_theme': this._onSetTheme(payload.value); break; - case 'set_team_token': - this._onSetTeamToken(payload.value); - break; case 'on_logged_in': - this._onLoggedIn(); + this._onLoggedIn(payload.teamToken); break; case 'on_logged_out': this._onLoggedOut(); @@ -695,26 +692,23 @@ module.exports = React.createClass({ } }, - /** - * Called when the team token is acquired at registration or login. This - * should only happen if the configured RTS (see config.json teamServerURL) - * recognises the user as having an email address that matches a team. - */ - _onSetTeamToken: function(teamToken) { - this._teamToken = teamToken; - this._setPage(PageTypes.HomePage); - }, - /** * Called when a new logged in session has started */ - _onLoggedIn: function(credentials) { + _onLoggedIn: function(teamToken) { this.guestCreds = null; this.notifyNewScreen(''); this.setState({ screen: undefined, logged_in: true, }); + + if (teamToken) { + this._teamToken = teamToken; + this._setPage(PageTypes.HomePage); + } else if (this._is_registered) { + this._setPage(PageTypes.UserSettings); + } }, /** @@ -731,6 +725,7 @@ module.exports = React.createClass({ currentRoomId: null, page_type: PageTypes.RoomDirectory, }); + this._teamToken = null; }, /** @@ -1001,22 +996,11 @@ module.exports = React.createClass({ } }, - onRegistered: function(credentials) { + onRegistered: function(credentials, teamToken) { + // teamToken may not be truthy + this._teamToken = teamToken; + this._is_registered = true; Lifecycle.setLoggedIn(credentials); - // do post-registration stuff - // This now goes straight to user settings - // We use _setPage since if we wait for - // showScreen to do the dispatch loop, - // the showScreen dispatch will race with the - // sdk sync finishing and we'll probably see - // the page type still unset when the MatrixClient - // is started and show the Room Directory instead. - //this.showScreen("view_user_settings"); - this._setPage(PageTypes.UserSettings); - }, - - onTeamMemberRegistered: function(teamToken) { - this._onSetTeamToken(teamToken); }, onFinishPostRegistration: function() { diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js index db1147a5d2..389cabd833 100644 --- a/src/components/structures/login/Registration.js +++ b/src/components/structures/login/Registration.js @@ -16,18 +16,20 @@ limitations under the License. 'use strict'; -var React = require('react'); +import q from 'q'; -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"); -var RtsClient = require("../../../RtsClient"); +import React from 'react'; -var MIN_PASSWORD_LENGTH = 6; +import sdk from '../../../index'; +import dis from '../../../dispatcher'; +import Signup from '../../../Signup'; +import ServerConfig from '../../views/login/ServerConfig'; +import MatrixClientPeg from '../../../MatrixClientPeg'; +import RegistrationForm from '../../views/login/RegistrationForm'; +import CaptchaForm from '../../views/login/CaptchaForm'; +import RtsClient from '../../../RtsClient'; + +const MIN_PASSWORD_LENGTH = 6; /** * TODO: It would be nice to make use of the InteractiveAuthEntryComponents @@ -206,22 +208,16 @@ module.exports = React.createClass({ }); return; } - self.props.onLoggedIn({ - userId: response.user_id, - deviceId: response.device_id, - homeserverUrl: self.registerLogic.getHomeserverUrl(), - identityServerUrl: self.registerLogic.getIdentityServerUrl(), - accessToken: response.access_token - }); // Done regardless of `teamSelected`. People registering with non-team emails // will just nop. The point of this being we might not have the email address // that the user registered with at this stage (depending on whether this // is the client they initiated registration). + let trackPromise = q(null); if (self._rtsClient) { // Track referral if self.props.referrer set, get team_token in order to // retrieve team config and see welcome page etc. - self._rtsClient.trackReferral( + trackPromise = self._rtsClient.trackReferral( self.props.referrer || '', // Default to empty string = not referred self.registerLogic.params.idSid, self.registerLogic.params.clientSecret @@ -229,7 +225,6 @@ module.exports = React.createClass({ const teamToken = data.team_token; // Store for use /w welcome pages window.localStorage.setItem('mx_team_token', teamToken); - self.props.onTeamMemberRegistered(teamToken); self._rtsClient.getTeam(teamToken).then((team) => { console.log( @@ -248,30 +243,25 @@ module.exports = React.createClass({ }, (err) => { console.error('Error getting team config', err); }); + + return teamToken; }, (err) => { console.error('Error tracking referral', err); }); } - 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); - }); - } - + return trackPromise.then((teamToken) => { + console.info('Team token promise',teamToken); + self.props.onLoggedIn({ + userId: response.user_id, + deviceId: response.device_id, + homeserverUrl: self.registerLogic.getHomeserverUrl(), + identityServerUrl: self.registerLogic.getIdentityServerUrl(), + accessToken: response.access_token + }, teamToken); + }).done(() => { + self._setupPushers(); + }); }, function(err) { if (err.message) { self.setState({ @@ -285,6 +275,28 @@ module.exports = React.createClass({ }); }, + _setupPushers: function() { + if (!self.props.brand) { + return; + } + 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); + }); + }, + onFormValidationFailed: function(errCode) { var errMsg; switch (errCode) { From 0ef8e2a8f4b8305a8f989c73856bbc45e13bf870 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Tue, 28 Feb 2017 15:18:00 +0000 Subject: [PATCH 3/4] Various fixes --- src/components/structures/MatrixChat.js | 1 - src/components/structures/login/Registration.js | 9 ++++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 9a1eb90620..1a828cd3e1 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1131,7 +1131,6 @@ module.exports = React.createClass({ customIsUrl={this.getCurrentIsUrl()} registrationUrl={this.props.registrationUrl} defaultDeviceDisplayName={this.props.defaultDeviceDisplayName} - onTeamMemberRegistered={this.onTeamMemberRegistered} onLoggedIn={this.onRegistered} onLoginClick={this.onLoginClick} onRegisterClick={this.onRegisterClick} diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js index 389cabd833..737dd5939f 100644 --- a/src/components/structures/login/Registration.js +++ b/src/components/structures/login/Registration.js @@ -60,7 +60,6 @@ module.exports = React.createClass({ teamServerURL: React.PropTypes.string.isRequired, }), teamSelected: React.PropTypes.object, - onTeamMemberRegistered: React.PropTypes.func.isRequired, defaultDeviceDisplayName: React.PropTypes.string, @@ -259,7 +258,7 @@ module.exports = React.createClass({ identityServerUrl: self.registerLogic.getIdentityServerUrl(), accessToken: response.access_token }, teamToken); - }).done(() => { + }).then(() => { self._setupPushers(); }); }, function(err) { @@ -276,7 +275,7 @@ module.exports = React.createClass({ }, _setupPushers: function() { - if (!self.props.brand) { + if (!this.props.brand) { return; } MatrixClientPeg.get().getPushers().done((resp)=>{ @@ -284,9 +283,9 @@ module.exports = React.createClass({ for (var i = 0; i < pushers.length; ++i) { if (pushers[i].kind == 'email') { var emailPusher = pushers[i]; - emailPusher.data = { brand: self.props.brand }; + emailPusher.data = { brand: this.props.brand }; MatrixClientPeg.get().setPusher(emailPusher).done(() => { - console.log("Set email branding to " + self.props.brand); + console.log("Set email branding to " + this.props.brand); }, (error) => { console.error("Couldn't set email branding: " + error); }); From a339316ede5aeb0104652f0444d285f89982fa7f Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Tue, 28 Feb 2017 15:40:49 +0000 Subject: [PATCH 4/4] Use a "normal" promise in order to .then --- src/Lifecycle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Lifecycle.js b/src/Lifecycle.js index e642440bf0..e44f33a731 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -278,7 +278,7 @@ export function setLoggedIn(credentials) { credentials.homeserverUrl); // Resolves by default - let teamPromise = q(null); + let teamPromise = Promise.resolve(null); // persist the session if (localStorage) {