Advertisement
Guest User

Untitled

a guest
Oct 14th, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ============= Component ===============
  2.  
  3. "use strict";
  4.  
  5. import React, {PropTypes, Component} from "react";
  6. import {connect} from "react-redux";
  7. import {bindActionCreators} from "redux";
  8.  
  9. import {login} from "actions/user";
  10. import Header from "components/Header/header";
  11. import Logo from "components/Logo/logo";
  12. import FormError from "components/FormError/formError";
  13.  
  14. class Login extends Component {
  15.   constructor(props) {
  16.     super(props);
  17.     this.state = {
  18.       email: "",
  19.       password: ""
  20.     };
  21.     this.handleLogin = this.handleLogin.bind(this);
  22.   }
  23.  
  24.   handleLogin(e) {
  25.     e.preventDefault();
  26.     this.props.onLogin(this.state.email, this.state.password);
  27.   }
  28.  
  29.   handleChange(e, field) {
  30.     e.preventDefault();
  31.     this.setState(Object.assign({}, this.state, {[field]: e.target.value}));
  32.   }
  33.  
  34.   render() {
  35.     const loginError = this.props.error ? <FormError error={this.props.error}/> : null;
  36.     return (
  37.       <div className="login-page">
  38.         <Header />
  39.         <div className="content">
  40.           <div className="login-wrap">
  41.             <div className="login-form-header">
  42.               <Logo size="25px"/>
  43.               <div className="divider">|</div>
  44.               <img src="/images/logo.png"/>
  45.             </div>
  46.             <form onSubmit={this.handleLogin}
  47.               noValidate="novalidate">
  48.               <div className="input-group">
  49.                 <input
  50.                   type="text"
  51.                   placeholder="email"
  52.                   value={this.state.email}
  53.                   onChange={e => this.handleChange(e, "email")}
  54.                   required="required"
  55.                 />
  56.               </div>
  57.               <div className="input-group">
  58.                 <input
  59.                   type="password"
  60.                   placeholder="password"
  61.                   value={this.state.password}
  62.                   onChange={e => this.handleChange(e, "password")}
  63.                   required="required"
  64.                 />
  65.               </div>
  66.               {loginError}
  67.               <button
  68.                 type="submit"
  69.                 disabled={!(this.state.email && this.state.password)}
  70.                 className="button accent outline">
  71.                 Log In
  72.               </button>
  73.             </form>
  74.             <div style={{fontStyle: "italic", margin: "20px 0"}}>- or -</div>
  75.             <a href="#" className="button accent">Sign Up</a>
  76.           </div>
  77.         </div>
  78.       </div>
  79.     );
  80.   }
  81. }
  82.  
  83. Login.propTypes = {
  84.   onLogin: PropTypes.func.isRequired,
  85.   error: PropTypes.string
  86. };
  87.  
  88. export default connect(state => {
  89.   return {
  90.     error: state.user.error
  91.   };
  92. }, dispatch => {
  93.   return bindActionCreators({
  94.     onLogin: login
  95.   }, dispatch);
  96. })(Login);
  97.  
  98.  
  99. ========= Action ==========
  100. "use strict";
  101.  
  102. import cookie from "react-cookie";
  103.  
  104. import {BASE_URL, AUTH_COOKIE} from "constants/ApiConstants";
  105. import {request} from "libs/api";
  106.  
  107. export const LOGIN_FAILURE = "LOGIN_FAILURE";
  108. export const LOGIN_SUCCESS = "LOGIN_SUCCESS";
  109. export const LOGOUT = "LOGOUT";
  110.  
  111. /**
  112.  * Login user
  113.  * @param {String} email - user email
  114.  * @param {String} password - user password
  115.  * @return {function(*)} calls dispatch
  116.  */
  117. export function login(email, password) {
  118.   return dispatch => {
  119.     request(new Request(`${BASE_URL}/login`, {
  120.       method: "POST",
  121.       body: JSON.stringify({
  122.         email: email,
  123.         password: password
  124.       }),
  125.       headers: new Headers({
  126.         "Content-Type": "application/json"
  127.       })
  128.     }), (err, data) => {
  129.       if (err) {
  130.         dispatch({
  131.           type: LOGIN_FAILURE,
  132.           payload: err
  133.         });
  134.       } else {
  135.         cookie.save(AUTH_COOKIE, data.token);
  136.         dispatch({
  137.           type: LOGIN_SUCCESS,
  138.           payload: data
  139.         });
  140.       }
  141.     });
  142.   };
  143. }
  144.  
  145. ==========  Store =============
  146. "use strict";
  147.  
  148. import {DefaultState} from "../constants/StateConstants";
  149. import {LOGIN_FAILURE, LOGIN_SUCCESS, LOGOUT} from "../actions/user";
  150.  
  151. const user = (state = DefaultState.user, action) => {
  152.   switch (action.type) {
  153.     case LOGIN_FAILURE:
  154.       return Object.assign({}, state, {
  155.         token: null,
  156.         error: action.payload.error
  157.       });
  158.     case LOGIN_SUCCESS:
  159.       return Object.assign({}, state, {
  160.         token: action.payload.token,
  161.         error: null
  162.       });
  163.     case LOGOUT:
  164.       return Object.assign({}, state, {
  165.         token: null,
  166.         error: null
  167.       });
  168.     default:
  169.       return state;
  170.   }
  171. };
  172.  
  173. export default user;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement