diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js index 8ee6eafad4..2e08c05853 100644 --- a/src/components/structures/login/Login.js +++ b/src/components/structures/login/Login.js @@ -76,6 +76,14 @@ module.exports = React.createClass({ componentWillMount: function() { this._unmounted = false; + + // map from login step type to a function which will render a control + // letting you do that login type + this._stepRendererMap = { + 'm.login.password': this._renderPasswordStep, + 'm.login.cas': this._renderCasStep, + }; + this._initLoginLogic(); }, @@ -217,13 +225,29 @@ module.exports = React.createClass({ loginIncorrect: false, }); - loginLogic.getFlows().then(function(flows) { - // old behaviour was to always use the first flow without presenting - // options. This works in most cases (we don't have a UI for multiple - // logins so let's skip that for now). - loginLogic.chooseFlow(0); - self.setState({ - currentFlow: self._getCurrentFlowStep(), + loginLogic.getFlows().then((flows) => { + // look for a flow where we understand all of the steps. + for (let i = 0; i < flows.length; i++ ) { + if (!this._isSupportedFlow(flows[i])) { + continue; + } + + // we just pick the first flow where we support all the + // steps. (we don't have a UI for multiple logins so let's skip + // that for now). + loginLogic.chooseFlow(i); + this.setState({ + currentFlow: this._getCurrentFlowStep(), + }); + return; + } + // we got to the end of the list without finding a suitable + // flow. + this.setState({ + errorText: _t( + "This homeserver doesn't offer any login flows which are " + + "supported by this client.", + ), }); }, function(err) { self.setState({ @@ -237,6 +261,16 @@ module.exports = React.createClass({ }).done(); }, + _isSupportedFlow: function(flow) { + // technically the flow can have multiple steps, but no one does this + // for login and loginLogic doesn't support it so we can ignore it. + if (!this._stepRendererMap[flow.type]) { + console.log("Skipping flow", flow, "due to unsupported login type", flow.type); + return false; + } + return true; + }, + _getCurrentFlowStep: function() { return this._loginLogic ? this._loginLogic.getCurrentFlowStep() : null; }, @@ -276,38 +310,42 @@ module.exports = React.createClass({ }, componentForStep: function(step) { - switch (step) { - case 'm.login.password': - const PasswordLogin = sdk.getComponent('login.PasswordLogin'); - return ( - - ); - case 'm.login.cas': - const CasLogin = sdk.getComponent('login.CasLogin'); - return ( - - ); - default: - if (!step) { - return; - } - return ( -
- { _t('Sorry, this homeserver is using a login which is not recognised ') }({ step }) -
- ); + if (!step) { + return null; } + + const stepRenderer = this._stepRendererMap[step]; + + if (stepRenderer) { + return stepRenderer(); + } + + return null; + }, + + _renderPasswordStep: function() { + const PasswordLogin = sdk.getComponent('login.PasswordLogin'); + return ( + + ); + }, + + _renderCasStep: function() { + const CasLogin = sdk.getComponent('login.CasLogin'); + return ( + + ); }, _onLanguageChange: function(newLang) { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4052d098c1..efb174c445 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -862,7 +862,7 @@ "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.", - "Sorry, this homeserver is using a login which is not recognised ": "Sorry, this homeserver is using a login which is not recognised ", + "This homeserver doesn't offer any login flows which are supported by this client.": "This homeserver doesn't offer any login flows which are supported by this client.", "Login as guest": "Login as guest", "Return to app": "Return to app", "Failed to fetch avatar URL": "Failed to fetch avatar URL",