diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 295ffe44f4..e44f33a731 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 = Promise.resolve(null); + // persist the session if (localStorage) { try { @@ -300,16 +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); } - }, (err) =>{ - console.error( - "Failed to get team token on login, not persisting to localStorage", - err - ); + return body.team_token; }); } } else { @@ -318,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 e885614ffe..1a828cd3e1 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -519,7 +519,7 @@ module.exports = React.createClass({ this._onSetTheme(payload.value); break; case 'on_logged_in': - this._onLoggedIn(); + this._onLoggedIn(payload.teamToken); break; case 'on_logged_out': this._onLoggedOut(); @@ -695,13 +695,20 @@ module.exports = React.createClass({ /** * 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); + } }, /** @@ -718,6 +725,7 @@ module.exports = React.createClass({ currentRoomId: null, page_type: PageTypes.RoomDirectory, }); + this._teamToken = null; }, /** @@ -988,23 +996,11 @@ module.exports = React.createClass({ } }, - onRegistered: function(credentials) { - 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) { + onRegistered: function(credentials, teamToken) { + // teamToken may not be truthy this._teamToken = teamToken; - this._setPage(PageTypes.HomePage); + this._is_registered = true; + Lifecycle.setLoggedIn(credentials); }, onFinishPostRegistration: function() { @@ -1135,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 db1147a5d2..737dd5939f 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 @@ -58,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, @@ -206,22 +207,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 +224,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 +242,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); + }).then(() => { + self._setupPushers(); + }); }, function(err) { if (err.message) { self.setState({ @@ -285,6 +274,28 @@ module.exports = React.createClass({ }); }, + _setupPushers: function() { + if (!this.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: this.props.brand }; + MatrixClientPeg.get().setPusher(emailPusher).done(() => { + console.log("Set email branding to " + this.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) {