From 58be44ad9edb31bc05244f301c4f2e4ff7e34dd2 Mon Sep 17 00:00:00 2001
From: Michael Telatynski <7t3chguy@gmail.com>
Date: Thu, 21 Jun 2018 13:51:39 +0100
Subject: [PATCH 1/3] factor out conditional LanguageSelector as functional
component and reuse in Login, ForgotPassword and Registration views
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---
.../structures/login/ForgotPassword.js | 4 +-
.../structures/login/LanguageSelector.js | 38 +++++++++++++++++++
src/components/structures/login/Login.js | 25 ++----------
.../structures/login/Registration.js | 3 ++
4 files changed, 48 insertions(+), 22 deletions(-)
create mode 100644 src/components/structures/login/LanguageSelector.js
diff --git a/src/components/structures/login/ForgotPassword.js b/src/components/structures/login/ForgotPassword.js
index ca50b9db6e..cf054a4e6e 100644
--- a/src/components/structures/login/ForgotPassword.js
+++ b/src/components/structures/login/ForgotPassword.js
@@ -1,6 +1,6 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
-Copyright 2017 New Vector Ltd
+Copyright 2017, 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@ import MatrixClientPeg from "../../../MatrixClientPeg";
import SdkConfig from "../../../SdkConfig";
import PasswordReset from "../../../PasswordReset";
+import makeLanguageSelector from "./LanguageSelector";
module.exports = React.createClass({
displayName: 'ForgotPassword',
@@ -233,6 +234,7 @@ module.exports = React.createClass({
{ _t('Create an account') }
+ { makeLanguageSelector() }
diff --git a/src/components/structures/login/LanguageSelector.js b/src/components/structures/login/LanguageSelector.js
new file mode 100644
index 0000000000..1e576bdbb8
--- /dev/null
+++ b/src/components/structures/login/LanguageSelector.js
@@ -0,0 +1,38 @@
+/*
+Copyright 2018 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import SdkConfig from "../../../SdkConfig";
+import {getCurrentLanguage} from "../../../languageHandler";
+import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore";
+import PlatformPeg from "../../../PlatformPeg";
+import sdk from '../../../index';
+import React from 'react';
+
+function onChange(newLang) {
+ if (getCurrentLanguage() !== newLang) {
+ SettingsStore.setValue("language", null, SettingLevel.DEVICE, newLang);
+ PlatformPeg.get().reload();
+ }
+}
+
+export default function makeLanguageSelector() {
+ if (SdkConfig.get()['disable_login_language_selector']) return
- { _t("An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.", { emailAddress: this.state.email }) }
+ { _t("An email has been sent to %(emailAddress)s. Once you've followed the link it contains, " +
+ "click below.", { emailAddress: this.state.email }) }
@@ -180,14 +181,15 @@ module.exports = React.createClass({
resetPasswordJsx = (
{ _t('Your password has been reset') }.
-
{ _t('You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device') }.
+
{ _t('You have been logged out of all devices and will no longer receive push notifications. ' +
+ 'To re-enable notifications, sign in again on each device') }.
);
} else {
let serverConfigSection;
- if (!SdkConfig.get().disable_custom_urls) {
+ if (!SdkConfig.get()['disable_custom_urls']) {
serverConfigSection = (
0;
- if (error.httpStatus == 400 && usingEmail) {
+ if (error.httpStatus === 400 && usingEmail) {
errorText = _t('This Home Server does not support login using email address.');
} else if (error.httpStatus === 401 || error.httpStatus === 403) {
- if (SdkConfig.get().disable_custom_urls) {
+ if (SdkConfig.get()['disable_custom_urls']) {
errorText = (
{ _t('Incorrect username and/or password.') }
@@ -143,7 +143,7 @@ module.exports = React.createClass({
// but the login API gives a 403 https://matrix.org/jira/browse/SYN-744
// mentions this (although the bug is for UI auth which is not this)
// We treat both as an incorrect password
- loginIncorrect: error.httpStatus === 401 || error.httpStatus == 403,
+ loginIncorrect: error.httpStatus === 401 || error.httpStatus === 403,
});
}).finally(() => {
if (this._unmounted) {
@@ -231,7 +231,7 @@ module.exports = React.createClass({
hsUrl = hsUrl || this.state.enteredHomeserverUrl;
isUrl = isUrl || this.state.enteredIdentityServerUrl;
- const fallbackHsUrl = hsUrl == this.props.defaultHsUrl ? this.props.fallbackHsUrl : null;
+ const fallbackHsUrl = hsUrl === this.props.defaultHsUrl ? this.props.fallbackHsUrl : null;
const loginLogic = new Login(hsUrl, isUrl, fallbackHsUrl, {
defaultDeviceDisplayName: this.props.defaultDeviceDisplayName,
@@ -310,19 +310,27 @@ module.exports = React.createClass({
!this.state.enteredHomeserverUrl.startsWith("http"))
) {
errorText =
- {
- _t("Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. " +
- "Either use HTTPS or enable unsafe scripts.",
- {},
- { 'a': (sub) => { return { sub }; } },
+ { _t("Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. " +
+ "Either use HTTPS or enable unsafe scripts.", {},
+ {
+ 'a': (sub) => {
+ return
+ { sub }
+ ;
+ },
+ },
) }
;
} else {
errorText =
- {
- _t("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.",
- {},
- { 'a': (sub) => { return { sub }; } },
+ { _t("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.", {},
+ {
+ 'a': (sub) => {
+ return { sub };
+ },
+ },
) }
;
}
@@ -386,21 +394,10 @@ module.exports = React.createClass({
;
}
- let returnToAppJsx;
- /*
- // with the advent of ILAG I don't think we need this any more
- if (this.props.onCancelClick) {
- returnToAppJsx =
-
- { _t('Return to app') }
- ;
- }
- */
-
let serverConfig;
let header;
- if (!SdkConfig.get().disable_custom_urls) {
+ if (!SdkConfig.get()['disable_custom_urls']) {
serverConfig =
{ loginAsGuestJsx }
- { returnToAppJsx }
{ makeLanguageSelector() }
diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js
index 377cffc576..409234e2ed 100644
--- a/src/components/structures/login/Registration.js
+++ b/src/components/structures/login/Registration.js
@@ -23,7 +23,6 @@ import React from 'react';
import PropTypes from 'prop-types';
import sdk from '../../../index';
-import ServerConfig from '../../views/login/ServerConfig';
import MatrixClientPeg from '../../../MatrixClientPeg';
import RegistrationForm from '../../views/login/RegistrationForm';
import RtsClient from '../../../RtsClient';
@@ -64,6 +63,12 @@ module.exports = React.createClass({
onLoginClick: PropTypes.func.isRequired,
onCancelClick: PropTypes.func,
onServerConfigChange: PropTypes.func.isRequired,
+
+ rtsClient: PropTypes.shape({
+ getTeamsConfig: PropTypes.func.isRequired,
+ trackReferral: PropTypes.func.isRequired,
+ getTeam: PropTypes.func.isRequired,
+ }),
},
getInitialState: function() {
@@ -135,7 +140,7 @@ module.exports = React.createClass({
newState.isUrl = config.isUrl;
}
this.props.onServerConfigChange(config);
- this.setState(newState, function() {
+ this.setState(newState, () => {
this._replaceClient();
});
},
@@ -161,11 +166,11 @@ module.exports = React.createClass({
let msg = response.message || response.toString();
// can we give a better error message?
if (response.required_stages && response.required_stages.indexOf('m.login.msisdn') > -1) {
- let msisdn_available = false;
+ let msisdnAvailable = false;
for (const flow of response.available_flows) {
- msisdn_available |= flow.stages.indexOf('m.login.msisdn') > -1;
+ msisdnAvailable |= flow.stages.indexOf('m.login.msisdn') > -1;
}
- if (!msisdn_available) {
+ if (!msisdnAvailable) {
msg = _t('This server does not support authentication with a phone number.');
}
}
@@ -244,7 +249,7 @@ module.exports = React.createClass({
return matrixClient.getPushers().then((resp)=>{
const pushers = resp.pushers;
for (let i = 0; i < pushers.length; ++i) {
- if (pushers[i].kind == 'email') {
+ if (pushers[i].kind === 'email') {
const emailPusher = pushers[i];
emailPusher.data = { brand: this.props.brand };
matrixClient.setPusher(emailPusher).done(() => {
@@ -269,7 +274,7 @@ module.exports = React.createClass({
errMsg = _t('Passwords don\'t match.');
break;
case "RegistrationForm.ERR_PASSWORD_LENGTH":
- errMsg = _t('Password too short (min %(MIN_PASSWORD_LENGTH)s).', {MIN_PASSWORD_LENGTH: MIN_PASSWORD_LENGTH});
+ errMsg = _t('Password too short (min %(MIN_PASSWORD_LENGTH)s).', {MIN_PASSWORD_LENGTH});
break;
case "RegistrationForm.ERR_EMAIL_INVALID":
errMsg = _t('This doesn\'t look like a valid email address.');
@@ -355,7 +360,7 @@ module.exports = React.createClass({
registerBody = ;
} else {
let serverConfigSection;
- if (!SdkConfig.get().disable_custom_urls) {
+ if (!SdkConfig.get()['disable_custom_urls']) {
serverConfigSection = (
- { _t('Return to app') }
-
- );
- }
- */
-
let header;
let errorText;
// FIXME: remove hardcoded Status team tweaks at some point
@@ -433,7 +426,6 @@ module.exports = React.createClass({
{ registerBody }
{ signIn }
{ errorText }
- { returnToAppJsx }
{ makeLanguageSelector() }
From 548a06cad2a77fbe33ad71b502be52c86fa59beb Mon Sep 17 00:00:00 2001
From: Michael Telatynski <7t3chguy@gmail.com>
Date: Fri, 22 Jun 2018 14:47:57 +0100
Subject: [PATCH 3/3] use JSX and import via sdk rather than directly
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---
src/components/structures/login/ForgotPassword.js | 5 +++--
src/components/structures/login/LanguageSelector.js | 2 +-
src/components/structures/login/Login.js | 5 +++--
src/components/structures/login/Registration.js | 5 +++--
4 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/components/structures/login/ForgotPassword.js b/src/components/structures/login/ForgotPassword.js
index bbee4c3207..7e0cd5da8e 100644
--- a/src/components/structures/login/ForgotPassword.js
+++ b/src/components/structures/login/ForgotPassword.js
@@ -24,7 +24,6 @@ import MatrixClientPeg from "../../../MatrixClientPeg";
import SdkConfig from "../../../SdkConfig";
import PasswordReset from "../../../PasswordReset";
-import makeLanguageSelector from "./LanguageSelector";
module.exports = React.createClass({
displayName: 'ForgotPassword',
@@ -202,6 +201,8 @@ module.exports = React.createClass({
);
}
+ const LanguageSelector = sdk.getComponent('structures.login.LanguageSelector');
+
resetPasswordJsx = (