Login.jsx 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import React from 'react'
  2. import { connect } from 'react-redux'
  3. import { Redirect } from 'react-router'
  4. import { translate } from 'react-i18next'
  5. import Cookies from 'js-cookie'
  6. import LoginLogo from '../component/Login/LoginLogo.jsx'
  7. import LoginLogoImg from '../img/logoTracimWhite.svg'
  8. import { postUserLogin } from '../action-creator.async.js'
  9. import Card from '../component/common/Card/Card.jsx'
  10. import CardHeader from '../component/common/Card/CardHeader.jsx'
  11. import CardBody from '../component/common/Card/CardBody.jsx'
  12. import InputGroupText from '../component/common/Input/InputGroupText.jsx'
  13. import Button from '../component/common/Input/Button.jsx'
  14. import LoginBtnForgotPw from '../component/Login/LoginBtnForgotPw.jsx'
  15. import {
  16. newFlashMessage,
  17. setUserConnected
  18. } from '../action-creator.sync.js'
  19. import { COOKIE, PAGE } from '../helper.js'
  20. class Login extends React.Component {
  21. constructor (props) {
  22. super(props)
  23. this.state = {
  24. inputLogin: {
  25. value: '',
  26. isInvalid: false
  27. },
  28. inputPassword: {
  29. value: '',
  30. isInvalid: false
  31. },
  32. inputRememberMe: false
  33. }
  34. }
  35. handleChangeLogin = e => this.setState({inputLogin: {...this.state.inputLogin, value: e.target.value}})
  36. handleChangePassword = e => this.setState({inputPassword: {...this.state.inputPassword, value: e.target.value}})
  37. handleChangeRememberMe = () => this.setState(prev => ({inputRememberMe: !prev.inputRememberMe}))
  38. handleClickSubmit = async () => {
  39. const { history, dispatch, t } = this.props
  40. const { inputLogin, inputPassword, inputRememberMe } = this.state
  41. const fetchPostUserLogin = await dispatch(postUserLogin(inputLogin.value, inputPassword.value, inputRememberMe))
  42. const userAuth = btoa(`${inputLogin.value}:${inputPassword.value}`)
  43. if (fetchPostUserLogin.status === 200) {
  44. dispatch(setUserConnected({
  45. ...fetchPostUserLogin.json,
  46. auth: userAuth,
  47. logged: true
  48. }))
  49. Cookies.set(COOKIE.USER_LOGIN, inputLogin.value)
  50. Cookies.set(COOKIE.USER_AUTH, userAuth)
  51. history.push(PAGE.HOME)
  52. } else if (fetchPostUserLogin.status === 400) {
  53. dispatch(newFlashMessage(t('Email or password invalid'), 'danger'))
  54. }
  55. }
  56. render () {
  57. if (this.props.user.logged) return <Redirect to={{pathname: '/'}} />
  58. else {
  59. return (
  60. <section className='loginpage primaryColorBg'>
  61. <div className='container-fluid'>
  62. <LoginLogo customClass='loginpage__logo' logoSrc={LoginLogoImg} />
  63. <div className='row justify-content-center'>
  64. <div className='col-12 col-sm-11 col-md-8 col-lg-6 col-xl-4'>
  65. <Card customClass='loginpage__connection'>
  66. <CardHeader customClass='connection__header text-center'>{'Connexion'}</CardHeader>
  67. <CardBody formClass='connection__form'>
  68. <div>
  69. <InputGroupText
  70. parentClassName='connection__form__groupemail'
  71. customClass='mb-3 mt-4'
  72. icon='fa-envelope-open-o'
  73. type='email'
  74. placeHolder='Adresse Email'
  75. invalidMsg='Email invalide.'
  76. isInvalid={this.state.inputLogin.isInvalid}
  77. value={this.state.inputLogin.value}
  78. onChange={this.handleChangeLogin}
  79. />
  80. <InputGroupText
  81. parentClassName='connection__form__groupepw'
  82. customClass=''
  83. icon='fa-lock'
  84. type='password'
  85. placeHolder='Mot de passe'
  86. invalidMsg='Mot de passe invalide.'
  87. isInvalid={this.state.inputPassword.isInvalid}
  88. value={this.state.inputPassword.value}
  89. onChange={this.handleChangePassword}
  90. />
  91. <div className='row mt-4 mb-4'>
  92. <div className='col-12 col-sm-6 col-md-6 col-lg-6 col-xl-6'>
  93. {/*
  94. <InputCheckbox
  95. parentClassName='connection__form__rememberme'
  96. customClass=''
  97. label='Se souvenir de moi'
  98. checked={this.state.inputRememberMe}
  99. onChange={this.handleChangeRememberMe}
  100. />
  101. */}
  102. </div>
  103. <div className='col-12 col-sm-6 col-md-6 col-lg-6 col-xl-6 text-sm-right'>
  104. <LoginBtnForgotPw
  105. customClass='connection__form__pwforgot'
  106. label='Mot de passe oublié ?'
  107. />
  108. </div>
  109. </div>
  110. <Button
  111. htmlType='button'
  112. bootstrapType='primary'
  113. customClass='connection__form__btnsubmit ml-auto'
  114. label='Connexion'
  115. onClick={this.handleClickSubmit}
  116. />
  117. </div>
  118. </CardBody>
  119. </Card>
  120. </div>
  121. </div>
  122. </div>
  123. <footer className='loginpage__footer'>
  124. <div className='loginpage__footer__text whiteFontColor'>
  125. copyright © 2013 - 2018 tracim project.
  126. </div>
  127. </footer>
  128. </section>
  129. )
  130. }
  131. }
  132. }
  133. const mapStateToProps = ({ user }) => ({ user })
  134. export default connect(mapStateToProps)(translate()(Login))