diff --git a/src/Lifecycle.js b/src/Lifecycle.js index fc8087e12d..f20716cae6 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -276,6 +276,11 @@ export function setLoggedIn(credentials) { console.log("setLoggedIn => %s (guest=%s) hs=%s", credentials.userId, credentials.guest, credentials.homeserverUrl); + // This is dispatched to indicate that the user is still in the process of logging in + // because `teamPromise` may take some time to resolve, breaking the assumption that + // `setLoggedIn` takes an "instant" to complete, and dispatch `on_logged_in` a few ms + // later than MatrixChat might assume. + dis.dispatch({action: 'on_logging_in'}); // Resolves by default let teamPromise = Promise.resolve(null); diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 9b51e7f3fb..c264fbec63 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -568,6 +568,9 @@ module.exports = React.createClass({ case 'set_theme': this._onSetTheme(payload.value); break; + case 'on_logging_in': + this.setState({loggingIn: true}); + break; case 'on_logged_in': this._onLoggedIn(payload.teamToken); break; @@ -757,6 +760,7 @@ module.exports = React.createClass({ this.setState({ guestCreds: null, logged_in: true, + loggingIn: false, }); if (teamToken) { @@ -1160,7 +1164,11 @@ module.exports = React.createClass({ // console.log("rendering; loading="+this.state.loading+"; screen="+this.state.screen + // "; logged_in="+this.state.logged_in+"; ready="+this.state.ready); - if (this.state.loading) { + // `loading` might be set to false before `logged_in = true`, causing the default + // (``) to be visible for a few MS (say, whilst a request is in-flight to + // the RTS). So in the meantime, use `loggingIn`, which is true between + // actions `on_logging_in` and `on_logged_in`. + if (this.state.loading || this.state.loggingIn) { var Spinner = sdk.getComponent('elements.Spinner'); return (