LoginForm.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import React, { PureComponent, SyntheticEvent, ChangeEvent } from 'react';
  2. import { FormModel } from './LoginCtrl';
  3. interface Props {
  4. displayForgotPassword: boolean;
  5. onChange?: (valid: boolean) => void;
  6. onSubmit: (data: FormModel) => void;
  7. isLoggingIn: boolean;
  8. passwordHint: string;
  9. loginHint: string;
  10. }
  11. interface State {
  12. user: string;
  13. password: string;
  14. email: string;
  15. valid: boolean;
  16. }
  17. export class LoginForm extends PureComponent<Props, State> {
  18. private userInput: HTMLInputElement;
  19. constructor(props: Props) {
  20. super(props);
  21. this.state = {
  22. user: '',
  23. password: '',
  24. email: '',
  25. valid: false,
  26. };
  27. }
  28. componentDidMount() {
  29. this.userInput.focus();
  30. }
  31. onSubmit = (e: SyntheticEvent) => {
  32. e.preventDefault();
  33. const { user, password, email } = this.state;
  34. if (this.state.valid) {
  35. this.props.onSubmit({ user, password, email });
  36. }
  37. };
  38. onChangePassword = (e: ChangeEvent<HTMLInputElement>) => {
  39. this.setState({
  40. password: e.target.value,
  41. valid: this.validate(this.state.user, e.target.value),
  42. });
  43. };
  44. onChangeUsername = (e: ChangeEvent<HTMLInputElement>) => {
  45. this.setState({
  46. user: e.target.value,
  47. valid: this.validate(e.target.value, this.state.password),
  48. });
  49. };
  50. validate(user: string, password: string) {
  51. return user.length > 0 && password.length > 0;
  52. }
  53. render() {
  54. return (
  55. <form name="loginForm" className="login-form-group gf-form-group">
  56. <div className="login-form">
  57. <input
  58. ref={input => {
  59. this.userInput = input;
  60. }}
  61. type="text"
  62. name="user"
  63. className="gf-form-input login-form-input"
  64. required
  65. placeholder={this.props.loginHint}
  66. aria-label="Username input field"
  67. onChange={this.onChangeUsername}
  68. />
  69. </div>
  70. <div className="login-form">
  71. <input
  72. type="password"
  73. name="password"
  74. className="gf-form-input login-form-input"
  75. required
  76. ng-model="formModel.password"
  77. id="inputPassword"
  78. placeholder={this.props.passwordHint}
  79. aria-label="Password input field"
  80. onChange={this.onChangePassword}
  81. />
  82. </div>
  83. <div className="login-button-group">
  84. {!this.props.isLoggingIn ? (
  85. <button
  86. type="submit"
  87. aria-label="Login button"
  88. className={`btn btn-large p-x-2 ${this.state.valid ? 'btn-primary' : 'btn-inverse'}`}
  89. onClick={this.onSubmit}
  90. disabled={!this.state.valid}
  91. >
  92. Log In
  93. </button>
  94. ) : (
  95. <button type="submit" className="btn btn-large p-x-2 btn-inverse btn-loading">
  96. Logging In<span>.</span>
  97. <span>.</span>
  98. <span>.</span>
  99. </button>
  100. )}
  101. {this.props.displayForgotPassword ? (
  102. <div className="small login-button-forgot-password">
  103. <a href="user/password/send-reset-email">Forgot your password?</a>
  104. </div>
  105. ) : null}
  106. </div>
  107. </form>
  108. );
  109. }
  110. }