136 lines
3.7 KiB
JavaScript
136 lines
3.7 KiB
JavaScript
import React, {Component} from 'react';
|
|
import './Password.css';
|
|
import {faEye, faEyeSlash} from '@fortawesome/free-solid-svg-icons';
|
|
import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
|
|
|
|
export default class extends Component {
|
|
state = {
|
|
button_text: 'clear',
|
|
password: '',
|
|
password2: '',
|
|
show_password: false,
|
|
};
|
|
|
|
componentDidMount() {
|
|
if (!this.props.value || (this.props.value.length === 0)) {
|
|
this.setState({
|
|
...this.state,
|
|
button_text: 'set',
|
|
password: '',
|
|
password2: '',
|
|
show_password: false,
|
|
})
|
|
} else {
|
|
this.setState({
|
|
...this.state,
|
|
button_text: 'clear',
|
|
password: this.props.value,
|
|
password2: '',
|
|
show_password: false,
|
|
})
|
|
}
|
|
}
|
|
|
|
handleActionClick = () => {
|
|
if (!this.props.disabled) {
|
|
switch (this.state.button_text) {
|
|
case 'clear':
|
|
this.setState({
|
|
...this.state,
|
|
button_text: 'set',
|
|
password: '',
|
|
password2: '',
|
|
});
|
|
break;
|
|
|
|
case 'confirm':
|
|
if (this.state.password === this.state.password2) {
|
|
this.props.changed(this.state.password);
|
|
this.setState({
|
|
...this.state,
|
|
button_text: this.state.password && this.state.password.length > 0 ? 'clear' : 'set',
|
|
password2: '',
|
|
});
|
|
} else {
|
|
this.setState({
|
|
...this.state,
|
|
button_text: 'set',
|
|
password: '',
|
|
password2: '',
|
|
}, () => {
|
|
if (this.props.mismatchHandler) {
|
|
this.props.mismatchHandler();
|
|
}
|
|
});
|
|
}
|
|
break;
|
|
|
|
case 'set':
|
|
this.setState({
|
|
...this.state,
|
|
button_text: 'confirm',
|
|
password2: '',
|
|
});
|
|
break;
|
|
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
};
|
|
|
|
handlePasswordChanged = e => {
|
|
if (this.state.button_text === 'set') {
|
|
this.setState({
|
|
...this.state,
|
|
password: e.target.value,
|
|
});
|
|
} else if (this.state.button_text === 'confirm') {
|
|
this.setState({
|
|
...this.state,
|
|
password2: e.target.value,
|
|
});
|
|
}
|
|
};
|
|
|
|
handlePasswordKeyUp = e => {
|
|
if ((e.keyCode === 13) && ((this.state.button_text === 'confirm') || (this.state.button_text === 'set'))) {
|
|
this.handleActionClick();
|
|
}
|
|
};
|
|
|
|
handleShowHideClick = () => {
|
|
this.setState({
|
|
...this.state,
|
|
show_password: !this.state.show_password,
|
|
});
|
|
};
|
|
|
|
render() {
|
|
return (
|
|
<div className={'PasswordOwner'} style={{...this.props.style}}>
|
|
{
|
|
this.props.readOnly ? null : <a href={'#'}
|
|
className={'PasswordLink'}
|
|
onClick={this.handleActionClick}>
|
|
<u>{this.state.button_text}</u>
|
|
</a>
|
|
}
|
|
<input autoFocus={this.props.autoFocus}
|
|
readOnly={this.props.readOnly}
|
|
className={'PasswordInput'}
|
|
disabled={this.props.readOnly || (this.state.button_text === 'clear')}
|
|
onChange={this.handlePasswordChanged}
|
|
onKeyUp={this.handlePasswordKeyUp}
|
|
type={this.state.show_password ? 'text' : 'password'}
|
|
value={(this.state.button_text === 'confirm') ? this.state.password2 : this.state.password}/>
|
|
<a href={'#'}
|
|
className={'PasswordShowHide'}
|
|
onClick={this.handleShowHideClick}>
|
|
<FontAwesomeIcon icon={this.state.show_password ? faEye : faEyeSlash} fixedWidth/>
|
|
</a>
|
|
</div>
|
|
);
|
|
}
|
|
};
|