/src/components/ErrorMessages/PasswordMessage/PasswordMessage.js

https://github.com/zero-to-mastery/mappypals · JavaScript · 155 lines · 145 code · 3 blank · 7 comment · 11 complexity · bc85433e6546b4ae479c5a27a0d53b03 MD5 · raw file

  1. import React, { Component } from 'react';
  2. import classes from './PasswordMessage.module.css';
  3. class PasswordMessage extends Component {
  4. constructor(props) {
  5. super(props);
  6. this.state = {
  7. passwordLength: false,
  8. numberLength: false,
  9. capitalLetter: false,
  10. passwordIdentical: false
  11. };
  12. }
  13. componentDidUpdate(oldProps) {
  14. // Update every time new values are added.
  15. const newProps = this.props;
  16. if (oldProps.password !== newProps.password) {
  17. this.resetCheck();
  18. this.passwordValidation(
  19. this.props.password,
  20. this.props.confirmPassword
  21. );
  22. }
  23. if (oldProps.confirmPassword !== newProps.confirmPassword) {
  24. this.resetCheck();
  25. this.passwordValidation(
  26. this.props.password,
  27. this.props.confirmPassword
  28. );
  29. }
  30. }
  31. // Can't reuse helper.js validation here. So it become double logic.
  32. passwordValidation = (password, confirmPassword) => {
  33. // Validation: https://stackoverflow.com/questions/18367258/validation-for-password-is-at-least-6-characters
  34. if (password.length >= 6) {
  35. this.setState({ passwordLength: true });
  36. }
  37. // check for a number
  38. if (!/[0-9]/.test(password) === false) {
  39. this.setState({ numberLength: true });
  40. }
  41. // check for a capital letter and lowercase letter
  42. if (
  43. /[A-Z]/.test(password) === true &&
  44. /[a-z]/.test(password) === true
  45. ) {
  46. this.setState({ capitalLetter: true });
  47. }
  48. // Check appears only if
  49. if (confirmPassword.length > 0) {
  50. this.setState({ passwordIdentical: true });
  51. }
  52. };
  53. resetCheck = () => {
  54. this.setState({
  55. passwordLength: false,
  56. numberLength: false,
  57. capitalLetter: false,
  58. passwordIdentical: false
  59. });
  60. };
  61. render() {
  62. const {
  63. passwordLength,
  64. numberLength,
  65. capitalLetter,
  66. passwordIdentical
  67. } = this.state;
  68. let passwordLengthVar = (
  69. <ul className={classes.incorrectIcon}>
  70. <li className={classes.incorrect}>
  71. Be at least 6 character long
  72. </li>
  73. </ul>
  74. );
  75. let numberLengthVar = (
  76. <ul className={classes.incorrectIcon}>
  77. <li className={classes.incorrect}>
  78. Include at least one number
  79. </li>
  80. </ul>
  81. );
  82. let capitalLetterVar = (
  83. <ul className={classes.incorrectIcon}>
  84. <li className={classes.incorrect}>
  85. Include both lower and upper case character
  86. </li>
  87. </ul>
  88. );
  89. // By default be hidden.
  90. let passwordIdenticalVar = '';
  91. if (passwordLength) {
  92. passwordLengthVar = (
  93. <ul className={classes.correctIcon}>
  94. <li className={classes.correct}>
  95. Be at least 6 character long
  96. </li>
  97. </ul>
  98. );
  99. }
  100. if (numberLength) {
  101. numberLengthVar = (
  102. <ul className={classes.correctIcon}>
  103. <li className={classes.correct}>
  104. Include at least one number
  105. </li>
  106. </ul>
  107. );
  108. }
  109. if (capitalLetter) {
  110. capitalLetterVar = (
  111. <ul className={classes.correctIcon}>
  112. <li className={classes.correct}>
  113. Include both lower and upper case character
  114. </li>
  115. </ul>
  116. );
  117. }
  118. if (
  119. passwordIdentical &&
  120. this.props.password === this.props.confirmPassword
  121. ) {
  122. passwordIdenticalVar = (
  123. <ul className={classes.correctIcon}>
  124. <li className={classes.correct}>Password match</li>
  125. </ul>
  126. );
  127. }
  128. if (
  129. passwordIdentical &&
  130. this.props.password !== this.props.confirmPassword
  131. ) {
  132. passwordIdenticalVar = (
  133. <ul className={classes.incorrectIcon}>
  134. <li className={classes.incorrect}>Password match</li>
  135. </ul>
  136. );
  137. }
  138. return (
  139. <div className={classes.container}>
  140. <p className={classes.title}>
  141. <i className={`${classes.LockIcon} fas fa-lock`} />
  142. Your Password need to:
  143. </p>
  144. {capitalLetterVar}
  145. {numberLengthVar}
  146. {passwordLengthVar}
  147. {passwordIdenticalVar}
  148. </div>
  149. );
  150. }
  151. }
  152. export default PasswordMessage;