Advertisement
Guest User

Untitled

a guest
Dec 5th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.89 KB | None | 0 0
  1. import React, { Fragment } from 'react';
  2. import { connect } from 'react-redux';
  3. import { AvForm, AvField } from 'availity-reactstrap-validation';
  4. import { userActions, alertActions } from '../_actions';
  5. import { users, alert, authentication } from '../_interfaces/reducers';
  6. import { User } from '../_entities/user';
  7. import { Button } from 'reactstrap';
  8. import { REGEXP, secondsToTime } from '../_helpers';
  9.  
  10. interface Props {
  11. users: users;
  12. user: User;
  13. dispatch: Function;
  14. alert: alert;
  15. history: any;
  16. }
  17.  
  18. interface State {
  19. password: string;
  20. passwordCopy: string;
  21. time: any;
  22. seconds: number;
  23. }
  24.  
  25. class ResetPasswordComponent extends React.Component<Props, State> {
  26. timer: any;
  27. constructor(props: Props) {
  28. super(props);
  29. this.state = {
  30. password: '',
  31. passwordCopy: '',
  32. time: {},
  33. seconds: 10,
  34. };
  35. this.timer = 0;
  36. }
  37. componentDidMount() {
  38. const { user, history } = this.props;
  39. if (user === undefined) {
  40. history.push('/');
  41. }
  42. if (user && !user.accountPasswordChange) {
  43. history.push('/');
  44. }
  45. let timeLeftVar = secondsToTime(this.state.seconds);
  46. this.setState({ time: timeLeftVar });
  47. }
  48.  
  49. /**
  50. * Nettoie le state au démontage
  51. *
  52. * @method componentWillUnmount
  53. * @memberof PasswordChangeForcedComponent
  54. */
  55. componentWillUnmount() {
  56. const { dispatch }: any = this.props;
  57. this.setState({
  58. password: '',
  59. passwordCopy: '',
  60. });
  61. dispatch(alertActions.clear());
  62. }
  63.  
  64. componentDidUpdate(prevProps: any, prevState: any) {
  65. //Si l'utilisateur à été correctement mis à jour on force une déco
  66. if (!prevProps.users.userUpdated && this.props.users.userUpdated) {
  67. this.disconnect();
  68. }
  69. }
  70.  
  71. handleValidSubmit = (event: Object, values: any) => {
  72. this.setState({
  73. password: values.password,
  74. });
  75. const { password } = this.state;
  76. const { dispatch } = this.props;
  77. const { user } = this.props;
  78.  
  79. if (password && password.length >= 8) {
  80. // on créé un utilisateur pour ne pas influencer l'état
  81. const userToupdate = {
  82. id: user.id,
  83. role: user.role,
  84. email: user.email,
  85. userName: user.userName,
  86. firstName: user.userName,
  87. lastName: user.userName,
  88. password,
  89. };
  90. dispatch(userActions.resetPassword(userToupdate, password));
  91. }
  92. };
  93.  
  94. handleInvalidSubmit = (event: Object, errors: Object, values: any) => {
  95. this.setState({
  96. password: values.password,
  97. passwordCopy: values.passwordCopy,
  98. });
  99. };
  100.  
  101. logout = () => {
  102. const { history } = this.props;
  103. history.push('/signin');
  104. };
  105.  
  106. disconnect = () => {
  107. this.timer = setInterval(this.countDown, 1000);
  108. };
  109.  
  110. countDown = () => {
  111. let seconds = this.state.seconds - 1;
  112. this.setState({
  113. time: secondsToTime(seconds),
  114. seconds: seconds,
  115. });
  116. if (seconds == 0) {
  117. clearInterval(this.timer);
  118. this.logout();
  119. }
  120. };
  121.  
  122. render() {
  123. const { alert, users }: any = this.props;
  124. const { password, passwordCopy } = this.state;
  125.  
  126. return (
  127. <div>
  128. <h2>Réinitialisation du mot de passe</h2>
  129. {!users.userUpdated && (
  130. <div>
  131. <p>
  132. Votre mot de passe à besoin d'être réinitialisé, merci d'indiquer un mot de passe, de minimum 8
  133. caractères, devant contenir au moins une majuscule et un chiffre
  134. </p>
  135. <AvForm onValidSubmit={this.handleValidSubmit} onInvalidSubmit={this.handleInvalidSubmit}>
  136. <div>{alert.message && <div className={`alert ${alert.type}`}>{alert.message}</div>}</div>
  137. <div>
  138. <AvField
  139. name="password"
  140. value={password}
  141. label="Nouveau mot de passe"
  142. type="password"
  143. required
  144. validate={{
  145. pattern: { value: REGEXP },
  146. minLength: {
  147. value: 8,
  148. errorMessage: 'Le mot de passe doit faire plus de 8 caractères',
  149. },
  150. }}
  151. errorMessage="Le mot de passe doit faire plus de 8 caractères, contenir au moins une majuscule et un chiffre"
  152. />
  153. <AvField
  154. name="passwordCopy"
  155. value={passwordCopy}
  156. label="Retaper votre mot de passe"
  157. type="password"
  158. required
  159. validate={{
  160. minLength: {
  161. value: 8,
  162. errorMessage: 'La taille minimale du champs est de 8 caractères',
  163. },
  164. match: { value: 'password', errorMessage: 'Les mots de passes ne correspondent pas' },
  165. }}
  166. errorMessage="Le mot de passe doit faire plus de 8 caractères et doit être la copie du mot de passe précédent"
  167. />
  168. </div>
  169. <Button color="primary">Enregistrer</Button>
  170. </AvForm>
  171. </div>
  172. )}
  173. {users.userUpdated && (
  174. <Fragment>
  175. <div>{alert.message && <div className={`alert ${alert.type}`}>{alert.message}</div>}</div>
  176. <p>Vous allez être déconnecté dans {this.state.time.s} s</p>
  177. <Button color="primary" onClick={this.logout}>
  178. Se déconnecter
  179. </Button>
  180. </Fragment>
  181. )}
  182. </div>
  183. );
  184. }
  185. }
  186. function mapStateToProps(state: any) {
  187. const { authentication, alert, users } = state;
  188. const { user } = authentication;
  189. return {
  190. user,
  191. alert,
  192. users,
  193. };
  194. }
  195.  
  196. const connectedResetPasswordComponent = connect(mapStateToProps)(ResetPasswordComponent);
  197. export default connectedResetPasswordComponent;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement