diff --git a/src/components/structures/auth/Login.js b/src/components/structures/auth/Login.js index 3aba4a571e..a5ecbe36c7 100644 --- a/src/components/structures/auth/Login.js +++ b/src/components/structures/auth/Login.js @@ -566,9 +566,9 @@ export default class LoginComponent extends React.Component { <PasswordLogin onSubmit={this.onPasswordLogin} onEditServerDetailsClick={onEditServerDetailsClick} - initialUsername={this.state.username} - initialPhoneCountry={this.state.phoneCountry} - initialPhoneNumber={this.state.phoneNumber} + username={this.state.username} + phoneCountry={this.state.phoneCountry} + phoneNumber={this.state.phoneNumber} onUsernameChanged={this.onUsernameChanged} onUsernameBlur={this.onUsernameBlur} onPhoneCountryChanged={this.onPhoneCountryChanged} diff --git a/src/components/views/auth/PasswordLogin.js b/src/components/views/auth/PasswordLogin.js index 3991c117d0..3d374d57e7 100644 --- a/src/components/views/auth/PasswordLogin.js +++ b/src/components/views/auth/PasswordLogin.js @@ -31,22 +31,21 @@ import * as Email from "../../../email"; // For validating phone numbers without country codes const PHONE_NUMBER_REGEX = /^[0-9()\-\s]*$/; -/** +/* * A pure UI component which displays a username/password form. + * The email/username/phone fields are fully-controlled, the password field is not. */ export default class PasswordLogin extends React.Component { static propTypes = { onSubmit: PropTypes.func.isRequired, // fn(username, password) onEditServerDetailsClick: PropTypes.func, onForgotPasswordClick: PropTypes.func, // fn() - initialUsername: PropTypes.string, - initialPhoneCountry: PropTypes.string, - initialPhoneNumber: PropTypes.string, - initialPassword: PropTypes.string, + username: PropTypes.string, + phoneCountry: PropTypes.string, + phoneNumber: PropTypes.string, onUsernameChanged: PropTypes.func, onPhoneCountryChanged: PropTypes.func, onPhoneNumberChanged: PropTypes.func, - onPasswordChanged: PropTypes.func, loginIncorrect: PropTypes.bool, disableSubmit: PropTypes.bool, serverConfig: PropTypes.instanceOf(ValidatedServerConfig).isRequired, @@ -57,13 +56,11 @@ export default class PasswordLogin extends React.Component { onEditServerDetailsClick: null, onUsernameChanged: function() {}, onUsernameBlur: function() {}, - onPasswordChanged: function() {}, onPhoneCountryChanged: function() {}, onPhoneNumberChanged: function() {}, - initialUsername: "", - initialPhoneCountry: "", - initialPhoneNumber: "", - initialPassword: "", + username: "", + phoneCountry: "", + phoneNumber: "", loginIncorrect: false, disableSubmit: false, }; @@ -78,11 +75,8 @@ export default class PasswordLogin extends React.Component { this.state = { // Field error codes by field ID fieldValid: {}, - username: this.props.initialUsername, - password: this.props.initialPassword, - phoneCountry: this.props.initialPhoneCountry, - phoneNumber: this.props.initialPhoneNumber, loginType: PasswordLogin.LOGIN_FIELD_MXID, + password: "", }; this.onForgotPasswordClick = this.onForgotPasswordClick.bind(this); @@ -120,11 +114,11 @@ export default class PasswordLogin extends React.Component { switch (this.state.loginType) { case PasswordLogin.LOGIN_FIELD_EMAIL: case PasswordLogin.LOGIN_FIELD_MXID: - username = this.state.username; + username = this.props.username; break; case PasswordLogin.LOGIN_FIELD_PHONE: - phoneCountry = this.state.phoneCountry; - phoneNumber = this.state.phoneNumber; + phoneCountry = this.props.phoneCountry; + phoneNumber = this.props.phoneNumber; break; } @@ -137,7 +131,6 @@ export default class PasswordLogin extends React.Component { } onUsernameChanged(ev) { - this.setState({username: ev.target.value}); this.props.onUsernameChanged(ev.target.value); } @@ -160,23 +153,16 @@ export default class PasswordLogin extends React.Component { onLoginTypeChange(ev) { const loginType = ev.target.value; - this.setState({ - loginType: loginType, - username: "", // Reset because email and username use the same state - }); + this.setState({ loginType }); + this.props.onUsernameChanged(""); // Reset because email and username use the same state CountlyAnalytics.instance.track("onboarding_login_type_changed", { loginType }); } onPhoneCountryChanged(country) { - this.setState({ - phoneCountry: country.iso2, - phonePrefix: country.prefix, - }); this.props.onPhoneCountryChanged(country.iso2); } onPhoneNumberChanged(ev) { - this.setState({phoneNumber: ev.target.value}); this.props.onPhoneNumberChanged(ev.target.value); } @@ -190,7 +176,6 @@ export default class PasswordLogin extends React.Component { onPasswordChanged(ev) { this.setState({password: ev.target.value}); - this.props.onPasswordChanged(ev.target.value); } async verifyFieldsBeforeSubmit() { @@ -355,7 +340,7 @@ export default class PasswordLogin extends React.Component { switch (loginType) { case PasswordLogin.LOGIN_FIELD_EMAIL: - classes.error = this.props.loginIncorrect && !this.state.username; + classes.error = this.props.loginIncorrect && !this.props.username; return <Field className={classNames(classes)} name="username" // make it a little easier for browser's remember-password @@ -363,7 +348,7 @@ export default class PasswordLogin extends React.Component { type="text" label={_t("Email")} placeholder="joe@example.com" - value={this.state.username} + value={this.props.username} onChange={this.onUsernameChanged} onFocus={this.onUsernameFocus} onBlur={this.onUsernameBlur} @@ -373,14 +358,14 @@ export default class PasswordLogin extends React.Component { ref={field => this[PasswordLogin.LOGIN_FIELD_EMAIL] = field} />; case PasswordLogin.LOGIN_FIELD_MXID: - classes.error = this.props.loginIncorrect && !this.state.username; + classes.error = this.props.loginIncorrect && !this.props.username; return <Field className={classNames(classes)} name="username" // make it a little easier for browser's remember-password key="username_input" type="text" label={_t("Username")} - value={this.state.username} + value={this.props.username} onChange={this.onUsernameChanged} onFocus={this.onUsernameFocus} onBlur={this.onUsernameBlur} @@ -391,10 +376,10 @@ export default class PasswordLogin extends React.Component { />; case PasswordLogin.LOGIN_FIELD_PHONE: { const CountryDropdown = sdk.getComponent('views.auth.CountryDropdown'); - classes.error = this.props.loginIncorrect && !this.state.phoneNumber; + classes.error = this.props.loginIncorrect && !this.props.phoneNumber; const phoneCountry = <CountryDropdown - value={this.state.phoneCountry} + value={this.props.phoneCountry} isSmall={true} showPrefix={true} onOptionChange={this.onPhoneCountryChanged} @@ -406,7 +391,7 @@ export default class PasswordLogin extends React.Component { key="phone_input" type="text" label={_t("Phone")} - value={this.state.phoneNumber} + value={this.props.phoneNumber} prefixComponent={phoneCountry} onChange={this.onPhoneNumberChanged} onFocus={this.onPhoneNumberFocus} @@ -424,9 +409,9 @@ export default class PasswordLogin extends React.Component { switch (this.state.loginType) { case PasswordLogin.LOGIN_FIELD_EMAIL: case PasswordLogin.LOGIN_FIELD_MXID: - return !this.state.username; + return !this.props.username; case PasswordLogin.LOGIN_FIELD_PHONE: - return !this.state.phoneCountry || !this.state.phoneNumber; + return !this.props.phoneCountry || !this.props.phoneNumber; } }