Decide on which screen to show after login in one place
This follows from a small amount of refactoring done when RTS was introduced. Instead of setting the screen after sync, do it only after login. This requires as-yet-to-be-PRd riot-web changes. This includes: - initialScreenAfterLogin, which can be used to set the screen after login, and represents the screen that would be viewed if the window.location at the time of initialising Riot were routed. - guestCreds are now part of state, because otherwise they don't cause the login/registration views to update when set. - instead of worrying about races and using this._setPage, use a dispatch.pull/21833/head
							parent
							
								
									49c66d8645
								
							
						
					
					
						commit
						06a05c351d
					
				|  | @ -63,6 +63,13 @@ module.exports = React.createClass({ | |||
|         // called when the session load completes
 | ||||
|         onLoadCompleted: React.PropTypes.func, | ||||
| 
 | ||||
|         // Represents the screen to display as a result of parsing the initial
 | ||||
|         // window.location
 | ||||
|         initialScreenAfterLogin: React.PropTypes.shape({ | ||||
|             screen: React.PropTypes.string.isRequired, | ||||
|             params: React.PropTypes.object, | ||||
|         }), | ||||
| 
 | ||||
|         // displayname, if any, to set on the device when logging
 | ||||
|         // in/registering.
 | ||||
|         defaultDeviceDisplayName: React.PropTypes.string, | ||||
|  | @ -89,6 +96,12 @@ module.exports = React.createClass({ | |||
|         var s = { | ||||
|             loading: true, | ||||
|             screen: undefined, | ||||
|             screenAfterLogin: this.props.initialScreenAfterLogin, | ||||
| 
 | ||||
|             // Stashed guest credentials if the user logs out
 | ||||
|             // whilst logged in as a guest user (so they can change
 | ||||
|             // their mind & log back in)
 | ||||
|             guestCreds: null, | ||||
| 
 | ||||
|             // What the LoggedInView would be showing if visible
 | ||||
|             page_type: null, | ||||
|  | @ -184,11 +197,6 @@ module.exports = React.createClass({ | |||
|     componentWillMount: function() { | ||||
|         SdkConfig.put(this.props.config); | ||||
| 
 | ||||
|         // Stashed guest credentials if the user logs out
 | ||||
|         // whilst logged in as a guest user (so they can change
 | ||||
|         // their mind & log back in)
 | ||||
|         this.guestCreds = null; | ||||
| 
 | ||||
|         // if the automatic session load failed, the error
 | ||||
|         this.sessionLoadError = null; | ||||
| 
 | ||||
|  | @ -322,9 +330,6 @@ module.exports = React.createClass({ | |||
|         var self = this; | ||||
|         switch (payload.action) { | ||||
|             case 'logout': | ||||
|                 if (MatrixClientPeg.get().isGuest()) { | ||||
|                     this.guestCreds = MatrixClientPeg.getCredentials(); | ||||
|                 } | ||||
|                 Lifecycle.logout(); | ||||
|                 break; | ||||
|             case 'start_registration': | ||||
|  | @ -344,7 +349,11 @@ module.exports = React.createClass({ | |||
|                 this.notifyNewScreen('register'); | ||||
|                 break; | ||||
|             case 'start_login': | ||||
|                 if (this.state.logged_in) return; | ||||
|                 if (MatrixClientPeg.get().isGuest()) { | ||||
|                     this.setState({ | ||||
|                         guestCreds: MatrixClientPeg.getCredentials(), | ||||
|                     }); | ||||
|                 } | ||||
|                 this.setStateForNewScreen({ | ||||
|                     screen: 'login', | ||||
|                 }); | ||||
|  | @ -359,8 +368,8 @@ module.exports = React.createClass({ | |||
|                 // also stash our credentials, then if we restore the session,
 | ||||
|                 // we can just do it the same way whether we started upgrade
 | ||||
|                 // registration or explicitly logged out
 | ||||
|                 this.guestCreds = MatrixClientPeg.getCredentials(); | ||||
|                 this.setStateForNewScreen({ | ||||
|                     guestCreds: MatrixClientPeg.getCredentials(), | ||||
|                     screen: "register", | ||||
|                     upgradeUsername: MatrixClientPeg.get().getUserIdLocalpart(), | ||||
|                     guestAccessToken: MatrixClientPeg.get().getAccessToken(), | ||||
|  | @ -708,19 +717,34 @@ module.exports = React.createClass({ | |||
|      * Called when a new logged in session has started | ||||
|      */ | ||||
|     _onLoggedIn: function(teamToken) { | ||||
|         this.guestCreds = null; | ||||
|         this.notifyNewScreen(''); | ||||
|         this.setState({ | ||||
|             screen: undefined, | ||||
|             guestCreds: null, | ||||
|             logged_in: true, | ||||
|         }); | ||||
| 
 | ||||
|         // If screenAfterLogin is set, use that, then null it so that a second login will
 | ||||
|         // result in view_home_page, _user_settings or _room_directory
 | ||||
|         if (this.state.screenAfterLogin) { | ||||
|             this.showScreen( | ||||
|                 this.state.screenAfterLogin.screen, | ||||
|                 this.state.screenAfterLogin.params | ||||
|             ); | ||||
|             this.setState({screenAfterLogin: null}); | ||||
|             return; | ||||
|         } else { | ||||
|             this.setState({screen: undefined}); | ||||
|         } | ||||
| 
 | ||||
|         if (teamToken) { | ||||
|             this._teamToken = teamToken; | ||||
|             this._setPage(PageTypes.HomePage); | ||||
|             dis.dispatch({action: 'view_home_page'}); | ||||
|             return; | ||||
|         } else if (this._is_registered) { | ||||
|             this._setPage(PageTypes.UserSettings); | ||||
|             dis.dispatch({action: 'view_user_settings'}); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         dis.dispatch({action: 'view_room_directory'}); | ||||
|     }, | ||||
| 
 | ||||
|     /** | ||||
|  | @ -768,12 +792,6 @@ module.exports = React.createClass({ | |||
|                             cli.getRooms() | ||||
|                         )[0].roomId; | ||||
|                         self.setState({ready: true, currentRoomId: firstRoom, page_type: PageTypes.RoomView}); | ||||
|                     } else { | ||||
|                         if (self._teamToken) { | ||||
|                             self.setState({ready: true, page_type: PageTypes.HomePage}); | ||||
|                         } else { | ||||
|                             self.setState({ready: true, page_type: PageTypes.RoomDirectory}); | ||||
|                         } | ||||
|                     } | ||||
|                 } else { | ||||
|                     self.setState({ready: true, page_type: PageTypes.RoomView}); | ||||
|  | @ -790,16 +808,7 @@ module.exports = React.createClass({ | |||
| 
 | ||||
|                 if (presentedId != undefined) { | ||||
|                     self.notifyNewScreen('room/'+presentedId); | ||||
|                 } else { | ||||
|                     // There is no information on presentedId
 | ||||
|                     // so point user to fallback like /directory
 | ||||
|                     if (self._teamToken) { | ||||
|                         self.notifyNewScreen('home'); | ||||
|                     } else { | ||||
|                         self.notifyNewScreen('directory'); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 dis.dispatch({action: 'focus_composer'}); | ||||
|             } else { | ||||
|                 self.setState({ready: true}); | ||||
|  | @ -1002,9 +1011,9 @@ module.exports = React.createClass({ | |||
| 
 | ||||
|     onReturnToGuestClick: function() { | ||||
|         // reanimate our guest login
 | ||||
|         if (this.guestCreds) { | ||||
|             Lifecycle.setLoggedIn(this.guestCreds); | ||||
|             this.guestCreds = null; | ||||
|         if (this.state.guestCreds) { | ||||
|             Lifecycle.setLoggedIn(this.state.guestCreds); | ||||
|             this.setState({guestCreds: null}); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|  | @ -1153,7 +1162,7 @@ module.exports = React.createClass({ | |||
|                     onLoggedIn={this.onRegistered} | ||||
|                     onLoginClick={this.onLoginClick} | ||||
|                     onRegisterClick={this.onRegisterClick} | ||||
|                     onCancelClick={this.guestCreds ? this.onReturnToGuestClick : null} | ||||
|                     onCancelClick={this.state.guestCreds ? this.onReturnToGuestClick : null} | ||||
|                     /> | ||||
|             ); | ||||
|         } else if (this.state.screen == 'forgot_password') { | ||||
|  | @ -1180,7 +1189,7 @@ module.exports = React.createClass({ | |||
|                     defaultDeviceDisplayName={this.props.defaultDeviceDisplayName} | ||||
|                     onForgotPasswordClick={this.onForgotPasswordClick} | ||||
|                     enableGuest={this.props.enableGuest} | ||||
|                     onCancelClick={this.guestCreds ? this.onReturnToGuestClick : null} | ||||
|                     onCancelClick={this.state.guestCreds ? this.onReturnToGuestClick : null} | ||||
|                     initialErrorText={this.sessionLoadError} | ||||
|                 /> | ||||
|             ); | ||||
|  |  | |||
|  | @ -192,7 +192,6 @@ module.exports = React.createClass({ | |||
|                 const teamToken = data.team_token; | ||||
|                 // Store for use /w welcome pages
 | ||||
|                 window.localStorage.setItem('mx_team_token', teamToken); | ||||
|                 this.props.onTeamMemberRegistered(teamToken); | ||||
| 
 | ||||
|                 this._rtsClient.getTeam(teamToken).then((team) => { | ||||
|                     console.log( | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Luke Barnard
						Luke Barnard