summaryrefslogtreecommitdiff
path: root/web-ui/src/account_recovery/new_password_form/new_password_form.js
diff options
context:
space:
mode:
Diffstat (limited to 'web-ui/src/account_recovery/new_password_form/new_password_form.js')
-rw-r--r--web-ui/src/account_recovery/new_password_form/new_password_form.js111
1 files changed, 111 insertions, 0 deletions
diff --git a/web-ui/src/account_recovery/new_password_form/new_password_form.js b/web-ui/src/account_recovery/new_password_form/new_password_form.js
new file mode 100644
index 00000000..5e1e72c9
--- /dev/null
+++ b/web-ui/src/account_recovery/new_password_form/new_password_form.js
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2017 ThoughtWorks, Inc.
+ *
+ * Pixelated is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Pixelated is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import 'isomorphic-fetch';
+import React from 'react';
+import { translate } from 'react-i18next';
+import validator from 'validator';
+
+import { submitForm } from 'src/common/util';
+import InputField from 'src/common/input_field/input_field';
+import SubmitButton from 'src/common/submit_button/submit_button';
+import BackLink from 'src/common/back_link/back_link';
+
+import './new_password_form.scss';
+
+export class NewPasswordForm extends React.Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ submitButtonDisabled: true,
+ password: '',
+ errorPassword: '',
+ confirmPassword: '',
+ errorConfirmPassword: ''
+ };
+ }
+
+ submitHandler = (event) => {
+ event.preventDefault();
+ submitForm(event, '/account-recovery', {
+ userCode: this.props.userCode,
+ password: this.state.password,
+ confirmPassword: this.state.confirmPassword
+ }).then(() => this.props.next());
+ }
+
+ handleChangePassword = (event) => {
+ this.setState({ password: event.target.value });
+ this.validatePassword(event.target.value, this.state.confirmPassword);
+ };
+
+ handleChangeConfirmPassword = (event) => {
+ this.setState({ confirmPassword: event.target.value });
+ this.validatePassword(this.state.password, event.target.value);
+ };
+
+ validatePassword = (password, confirmPassword) => {
+ const emptyPassword = validator.isEmpty(password);
+ const validPassword = validator.isLength(password, { min: 8, max: 9999 });
+ const emptyConfirmPassword = validator.isEmpty(confirmPassword);
+ const validConfirmPassword = confirmPassword === password;
+
+ const t = this.props.t;
+
+ this.setState({
+ errorPassword: !emptyPassword && !validPassword ? t('account-recovery.new-password-form.error.invalid-password') : '',
+ errorConfirmPassword: !emptyConfirmPassword && !validConfirmPassword ? t('account-recovery.new-password-form.error.invalid-confirm-password') : '',
+ submitButtonDisabled: !validPassword || !validConfirmPassword
+ });
+ };
+
+ render() {
+ const { t, previous } = this.props;
+ return (
+ <form className='account-recovery-form new-password' onSubmit={this.submitHandler}>
+ <img
+ className='account-recovery-progress'
+ src='/public/images/account-recovery/step_3.svg'
+ alt={t('account-recovery.new-password-form.image-description')}
+ />
+ <h1>{t('account-recovery.new-password-form.title')}</h1>
+ <InputField
+ type='password' name='new-password' value={this.state.password}
+ label={t('account-recovery.new-password-form.input-label1')}
+ errorText={this.state.errorPassword} onChange={this.handleChangePassword}
+ />
+ <InputField
+ type='password' name='confirm-password' value={this.state.confirmPassword}
+ label={t('account-recovery.new-password-form.input-label2')}
+ errorText={this.state.errorConfirmPassword} onChange={this.handleChangeConfirmPassword}
+ />
+ <SubmitButton buttonText={t('account-recovery.button-next')} disabled={this.state.submitButtonDisabled} />
+ <BackLink text={t('account-recovery.back')} onClick={previous} />
+ </form>
+ );
+ }
+}
+
+NewPasswordForm.propTypes = {
+ t: React.PropTypes.func.isRequired,
+ next: React.PropTypes.func.isRequired,
+ previous: React.PropTypes.func.isRequired,
+ userCode: React.PropTypes.string.isRequired
+};
+
+export default translate('', { wait: true })(NewPasswordForm);