saarnilauri/fida-imu

View on GitHub
src/components/User/PasswordForget/index.js

Summary

Maintainability
C
7 hrs
Test Coverage
import React, { Component } from 'react'
import { Link } from 'react-router-dom'
import { Button, CardBody, Card, Col, Row } from 'reactstrap'
import { FormattedMessage } from 'react-intl'
import { auth } from '../../../firebase'
import * as routes from '../../../constants/routes'
import { updateByPropertyName, setStateValue } from '../../../constants/utils'
import ErrorMsg from '../../ErrorMsg'
import PageWrapper from '../PageWrapper'
import { EmailField } from '../../FormGroupElement/FormFields'
import { LoginLangMenu } from '../Login'

const PasswordForgetPage = () => (
  <PageWrapper>
    <Card className="p-4">
      <CardBody style={{ position: 'relative' }}>
        <h1 className="small-h1">
          <FormattedMessage id="app.pwd-forgot.header" />
        </h1>
        <p>
          <FormattedMessage id="app.pwd-forgot.intro" />
        </p>
        <PasswordForgetForm />
        <LoginLangMenu />
      </CardBody>
    </Card>
    <Card
      className="text-white bg-primary py-5 d-md-down-none"
      style={{ width: `${44}%` }}
    >
      <CardBody className="text-center">
        <div className="flex-row align-items-center">
          <div>
            <img
              className="img-fluid rounded img-thumbnail"
              alt="Fida"
              style={{ maxWidth: 160 }}
              src="https://goo.gl/bHV9uq"
            />
          </div>
        </div>
      </CardBody>
    </Card>
  </PageWrapper>
)

const INITIAL_STATE = {
  email: '',
  error: null,
  loading: false,
}

class PasswordForgetForm extends Component {
  constructor(props) {
    super(props)

    this.state = { ...INITIAL_STATE }
  }

  onSubmit = event => {
    const { email } = this.state

    this.setState(updateByPropertyName('loading', true))

    auth
      .doPasswordReset(email)
      .then(() => {
        this.setState(() => ({ ...INITIAL_STATE }))
      })
      .catch(error => {
        this.setState(updateByPropertyName('error', error))
      })

    event.preventDefault()
  }

  render() {
    const { email, error, loading } = this.state

    const isInvalid = email === '' || loading === true

    return (
      <form onSubmit={this.onSubmit}>
        {error && <ErrorMsg error={error.message} />}
        <EmailField value={email} onChange={setStateValue('email', this)} />
        <Row>
          <Col xs="6">
            <Button color="secondary" disabled={isInvalid} type="submit">
              <FormattedMessage id="app.pwd-forgot.reset-pwd" />
            </Button>
          </Col>
          <Col xs="6" className="text-right">
            <Link className="px-0" to={routes.SIGN_IN}>
              <FormattedMessage id="app.pwd-forgot.login" />
            </Link>
          </Col>
        </Row>
      </form>
    )
  }
}

const PasswordForgetLink = () => (
  <p>
    <Link to={routes.PASSWORD_FORGET}>Forgot Password?</Link>
  </p>
)

export default PasswordForgetPage

export { PasswordForgetForm, PasswordForgetLink }