Skip to content
Snippets Groups Projects

Login demo

Merged Ghost User requested to merge login-demo into development
12 files
+ 607
36
Compare changes
  • Side-by-side
  • Inline
Files
12
+ 100
0
import React from 'react';
import LoginForm from './LoginForm';
import RegisterForm from './RegisterForm';
class Header extends React.Component {
state = {
login: false,
register: false,
username: null,
token: null
};
// toggles the login/register view
toggleView = view => {
this.setState(prevState => {
return {
[view]: view === 'login' ? !prevState.login : !prevState.register
};
});
};
handleState = data => {
sessionStorage.setItem('name', data.name);
sessionStorage.setItem('token', data.token);
this.setState({ username: data.name, token: data.token });
};
handleLogout = () => {
this.setState({ username: null, token: null });
sessionStorage.removeItem('token');
};
// verifies the token (if it exists) on element mount with backend server
componentDidMount() {
let token = sessionStorage.getItem('token');
if (token) {
fetch('http://localhost:5000/user/verify', {
headers: {
Authorization: 'Bearer ' + token
}
})
.then(res => res.json())
.then(
result => {
// if token is still valid, login user
if (result === true) {
this.setState({
username: sessionStorage.getItem('name'),
token: token
});
// logout user if token has expired / is invalid
} else {
this.handleLogout();
}
},
error => {
console.log(error);
}
);
}
}
render() {
return (
<div>
<div className='header'>
{!this.state.username && (
<button onClick={() => this.toggleView('register')}>
register
</button>
)}
{!this.state.username && (
<button onClick={() => this.toggleView('login')}>login</button>
)}
{this.state.username && (
<button onClick={this.handleLogout}>logout</button>
)}
{this.state.username && <button>{this.state.username}</button>}
</div>
{this.state.register && (
<RegisterForm
view='register'
handleState={this.handleState}
toggleView={this.toggleView}
/>
)}
{this.state.login && (
<LoginForm
view='login'
handleState={this.handleState}
toggleView={this.toggleView}
/>
)}
</div>
);
}
}
export default Header;
Loading