Files
SCM-Manager/scm-ui/ui-components/src/forms/PasswordConfirmation.tsx

111 lines
2.9 KiB
TypeScript
Raw Normal View History

import React from 'react';
import { translate } from 'react-i18next';
import InputField from './InputField';
type State = {
password: string;
confirmedPassword: string;
passwordValid: boolean;
passwordConfirmationFailed: boolean;
};
type Props = {
passwordChanged: (p1: string, p2: boolean) => void;
passwordValidator?: (p: string) => boolean;
// Context props
t: (p: string) => string;
};
class PasswordConfirmation extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
password: '',
confirmedPassword: '',
passwordValid: true,
passwordConfirmationFailed: false,
};
}
componentDidMount() {
this.setState({
password: '',
confirmedPassword: '',
passwordValid: true,
passwordConfirmationFailed: false,
});
}
render() {
const { t } = this.props;
return (
<div className="columns is-multiline">
<div className="column is-half">
<InputField
label={t('password.newPassword')}
type="password"
onChange={this.handlePasswordChange}
value={this.state.password ? this.state.password : ''}
validationError={!this.state.passwordValid}
errorMessage={t('password.passwordInvalid')}
/>
</div>
<div className="column is-half">
<InputField
label={t('password.confirmPassword')}
type="password"
onChange={this.handlePasswordValidationChange}
value={this.state ? this.state.confirmedPassword : ''}
validationError={this.state.passwordConfirmationFailed}
errorMessage={t('password.passwordConfirmFailed')}
/>
</div>
</div>
);
}
2018-11-08 13:27:34 +01:00
validatePassword = password => {
const { passwordValidator } = this.props;
if (passwordValidator) {
return passwordValidator(password);
}
return password.length >= 6 && password.length < 32;
};
handlePasswordValidationChange = (confirmedPassword: string) => {
const passwordConfirmed = this.state.password === confirmedPassword;
this.setState(
{
confirmedPassword,
passwordConfirmationFailed: !passwordConfirmed,
},
this.propagateChange,
);
};
handlePasswordChange = (password: string) => {
const passwordConfirmationFailed =
password !== this.state.confirmedPassword;
this.setState(
{
2018-11-08 13:27:34 +01:00
passwordValid: this.validatePassword(password),
passwordConfirmationFailed,
password: password,
},
this.propagateChange,
);
};
2018-12-06 12:00:30 +01:00
isValid = () => {
return this.state.passwordValid && !this.state.passwordConfirmationFailed;
2018-12-06 12:00:30 +01:00
};
propagateChange = () => {
2018-12-06 12:00:30 +01:00
this.props.passwordChanged(this.state.password, this.isValid());
};
}
export default translate('commons')(PasswordConfirmation);