Home Reference Source Repository

src/components/admin/LoginForm/LoginForm.js

/*!
 * Codefolio
 * Copyright(c) 2016 MSMFSD
 * MIT Licensed
 */
import React, { Component, PropTypes } from 'react'
import { Link } from 'react-router'
import { reduxForm } from 'redux-form'
import CssModules from 'react-css-modules'
import Panel from '../../Panel/Panel'
import { createValidator, email, required, minLength, maxLength } from '../../../utils/validate'
import styles from './LoginForm.css'

// client validation
const loginValidation = createValidator({
  username: [required, email],
  password: [required, minLength(6), maxLength(14)]
})

/**
 * @class LoginForm
 * @extends {Component}
 */
class LoginForm extends Component {

  render () {
    const { auth, loginAsync, fields: { username, password }, handleSubmit, defaultInputClasses } = this.props
    return (
      <div styleName="cf-container" className="container">
        <div className="row">
          <div className="col s12" styleName="cf-main">
            <div styleName="cf-main-inner"></div>
            <div className="row">
              <div styleName="cf-nav-admin" className="col s12 no-padding">
                <Link styleName="cf-logo" to="/">Codefolio</Link>
              </div>
            </div>
            <div className="row">
              <div className="col s12" styleName="cf-content-admin">
                <div styleName="small-screen-message"><Panel message={'Admin layout works best on screens wider than 360px'} /></div>
                <form styleName="login-form" onSubmit={handleSubmit(data => loginAsync(data))}>
                  <div className="col s12"><h3>Log in to admin</h3></div>
                  <div className={defaultInputClasses}>
                    <input type="text" placeholder="Enter admin email" {...username}/>
                    {username.touched && username.error && <div className="input-field-message">{username.error}</div>}
                  </div>
                  <div className={defaultInputClasses}>
                    <input type="password" placeholder="Enter admin password" {...password}/>
                    {password.touched && password.error && <div className="input-field-message">{password.error}</div>}
                  </div>
                  <div styleName="form-messages" className="col s12">{auth.error && auth.errMessage}</div>
                  <div className={defaultInputClasses}>
                    <button styleName="form-btn" className={auth.authLoading ? 'waves-effect btn btn-loading' : 'waves-effect btn'} type="submit" disabled={auth.authLoading}><i className="material-icons">settings</i><span>Login</span></button>
                  </div>
                  <div className={defaultInputClasses} styleName="login-links">
                    <Link to="/forgot">forgot password?</Link>
                    <Link to="/register">register admin</Link>
                  </div>
                </form>
              </div>
            </div>
          </div>
        </div>
      </div>
    )
  }
}

LoginForm.propTypes = {
  auth: PropTypes.object.isRequired,
  loginAsync: PropTypes.func,
  fields: PropTypes.object.isRequired,
  handleSubmit: PropTypes.func.isRequired,
  defaultInputClasses: PropTypes.string
}

LoginForm.defaultProps = {
  defaultInputClasses: 'input-field col s12'
}

export default reduxForm({
  form: 'login',
  fields: [ 'username', 'password' ],
  validate: loginValidation
})(CssModules(LoginForm, styles))