Add username in navbar

This commit is contained in:
Grégoire Delattre 2016-11-15 22:42:14 +01:00
parent 0ed8759bab
commit 1bb5433b0d
4 changed files with 57 additions and 6 deletions

View File

@ -1,5 +1,6 @@
export const ADD_MOVIES = 'ADD_MOVIES' export const ADD_MOVIES = 'ADD_MOVIES'
export const SELECT_MOVIE = 'SELECT_MOVIE' export const SELECT_MOVIE = 'SELECT_MOVIE'
export const IS_USER_LOGGED_IN = 'IS_USER_LOGGED_IN'
// Select Movie // Select Movie
export function selectMovie(index) { export function selectMovie(index) {
@ -15,3 +16,9 @@ export function addMovies(movies) {
movies movies
} }
} }
export function isUserLoggedIn() {
return {
type: IS_USER_LOGGED_IN,
}
}

View File

@ -19,7 +19,7 @@ class Main extends React.Component {
return ( return (
<div> <div>
<div className="navbar navbar-inverse navbar-fixed-top"> <div className="navbar navbar-inverse navbar-fixed-top">
<NavBar /> <NavBar {...this.props}/>
</div> </div>
<div className="container-fluid"> <div className="container-fluid">
<div className="container"> <div className="container">

View File

@ -1,8 +1,15 @@
import React from 'react' import React from 'react'
import { Link } from 'react-router' import { Link } from 'react-router'
import { store } from '../store'
import { isUserLoggedIn } from '../actions/actionCreators'
export default class NavBar extends React.Component { export default class NavBar extends React.Component {
componentDidMount() {
this.props.isUserLoggedIn()
}
render() { render() {
const username = this.props.userStore.username;
const isLoggedIn = username !== "" ? true : false;
return ( return (
<div className="container-fluid"> <div className="container-fluid">
<div className="navbar-header"> <div className="navbar-header">
@ -14,10 +21,20 @@ export default class NavBar extends React.Component {
</button> </button>
<a className="navbar-brand" href="#">Canape</a> <a className="navbar-brand" href="#">Canape</a>
</div> </div>
<div className="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <div className="collapse navbar-collapse">
<ul className="nav navbar-nav"> <ul className="nav navbar-nav">
<li><Link to="/movies/popular">Movies</Link></li> <li><Link to="/movies/popular">Movies</Link></li>
<li><Link to="/users/login">Login</Link></li> </ul>
<ul className="nav navbar-nav navbar-right">
{isLoggedIn &&
<li><Link to="/users/details">{username} / Edit</Link></li>
}
{isLoggedIn ||
<li><Link to="/users/login">Login</Link></li>
}
{isLoggedIn &&
<li><Link to="/users/logout">Logout</Link></li>
}
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -1,5 +1,10 @@
import { IS_USER_LOGGED_IN } from '../actions/actionCreators'
import jwtDecode from 'jwt-decode'
const defaultState = { const defaultState = {
userLoading: false, userLoading: false,
username: "",
isAdmin: false,
}; };
// This actions are generated from the promise middleware // This actions are generated from the promise middleware
@ -11,10 +16,32 @@ export default function userStore(state = defaultState, action) {
userLoading: true, userLoading: true,
}) })
case 'USER_LOGIN_FULFILLED': case 'USER_LOGIN_FULFILLED':
return Object.assign({}, state, { if (action.payload.data.type === "error") {
userLoading: false, return logoutUser(state)
}) }
return updateFromToken(state, action.payload.data.token)
case IS_USER_LOGGED_IN:
let localToken = localStorage.getItem('token');
if (localToken === "") {
return state;
}
return updateFromToken(state, localToken)
default: default:
return state; return state;
} }
} }
function logoutUser(state) {
localStorage.removeItem('token');
return Object.assign({}, state, defaultState)
}
function updateFromToken(state, token) {
const decodedToken = jwtDecode(token);
localStorage.setItem('token', token);
return Object.assign({}, state, {
userLoading: false,
isAdmin: decodedToken.isAdmin,
username: decodedToken.username,
})
}