implemented user login and logout
This commit is contained in:
parent
337b12ad29
commit
a915b36967
28
src/App.js
28
src/App.js
@ -19,6 +19,7 @@ import {
|
|||||||
import { updateProfile } from './controllers/profile'
|
import { updateProfile } from './controllers/profile'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
Login,
|
||||||
About,
|
About,
|
||||||
Tasks,
|
Tasks,
|
||||||
UpdateTask,
|
UpdateTask,
|
||||||
@ -33,7 +34,7 @@ console.log('Using API at ' + API)
|
|||||||
|
|
||||||
const defaultState = {
|
const defaultState = {
|
||||||
loading: true,
|
loading: true,
|
||||||
user: { name: 'Scott' },
|
user: {},
|
||||||
tasks: [],
|
tasks: [],
|
||||||
projects: [],
|
projects: [],
|
||||||
component: 'projects',
|
component: 'projects',
|
||||||
@ -52,6 +53,8 @@ class App extends React.Component {
|
|||||||
this.handleChange = this.handleChange.bind(this)
|
this.handleChange = this.handleChange.bind(this)
|
||||||
this.handleSubmit = this.handleSubmit.bind(this)
|
this.handleSubmit = this.handleSubmit.bind(this)
|
||||||
|
|
||||||
|
this.login = this.login.bind(this)
|
||||||
|
|
||||||
this.createTask = createTask.bind(this)
|
this.createTask = createTask.bind(this)
|
||||||
this.updateTask = updateTask.bind(this)
|
this.updateTask = updateTask.bind(this)
|
||||||
this.deleteTask = deleteTask.bind(this)
|
this.deleteTask = deleteTask.bind(this)
|
||||||
@ -86,6 +89,19 @@ class App extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async login(userData) {
|
||||||
|
try {
|
||||||
|
const { data } = await axios.post(API + '/login', userData)
|
||||||
|
console.log('login retrieved data:', data)
|
||||||
|
if (data.name) {
|
||||||
|
this.setState({ user: data })
|
||||||
|
this.navigate('projects')
|
||||||
|
} else this.setState({ error: 'no user found.' })
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async fetchData() {
|
async fetchData() {
|
||||||
const tasks = await this.fetchTasks()
|
const tasks = await this.fetchTasks()
|
||||||
const projects = await this.fetchProjects()
|
const projects = await this.fetchProjects()
|
||||||
@ -112,6 +128,8 @@ class App extends React.Component {
|
|||||||
return <div>Loading...</div>
|
return <div>Loading...</div>
|
||||||
}
|
}
|
||||||
renderError() {
|
renderError() {
|
||||||
|
const { error } = this.state
|
||||||
|
if (error) {
|
||||||
if (this.state.error.message === 'Network Error') {
|
if (this.state.error.message === 'Network Error') {
|
||||||
alert(`Failed to reach backend at\n${this.state.error.config.url}.`)
|
alert(`Failed to reach backend at\n${this.state.error.config.url}.`)
|
||||||
} else {
|
} else {
|
||||||
@ -129,6 +147,8 @@ class App extends React.Component {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return <div>Uncaught error. You probably forgot to render something.</div>
|
||||||
|
}
|
||||||
renderProfile() {
|
renderProfile() {
|
||||||
return (
|
return (
|
||||||
<Profile
|
<Profile
|
||||||
@ -170,6 +190,10 @@ class App extends React.Component {
|
|||||||
renderAbout() {
|
renderAbout() {
|
||||||
return <About {...this.state} />
|
return <About {...this.state} />
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderLogin() {
|
||||||
|
return <Login login={this.login} {...this.state} />
|
||||||
|
}
|
||||||
renderTasks(filtered, completed) {
|
renderTasks(filtered, completed) {
|
||||||
return (
|
return (
|
||||||
<Tasks
|
<Tasks
|
||||||
@ -229,6 +253,8 @@ class App extends React.Component {
|
|||||||
? this.renderProjects()
|
? this.renderProjects()
|
||||||
: this.state.component === 'project'
|
: this.state.component === 'project'
|
||||||
? this.renderProject()
|
? this.renderProject()
|
||||||
|
: this.state.component === 'login'
|
||||||
|
? this.renderLogin()
|
||||||
: this.renderError()
|
: this.renderError()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
export { default as Login } from './login'
|
||||||
export { default as Navbar } from './navbar'
|
export { default as Navbar } from './navbar'
|
||||||
export { default as About } from './about'
|
export { default as About } from './about'
|
||||||
export { default as Tasks } from './tasks'
|
export { default as Tasks } from './tasks'
|
||||||
|
62
src/components/login.js
Normal file
62
src/components/login.js
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
const initialState = { email: '', password: '' }
|
||||||
|
|
||||||
|
class Login extends React.Component {
|
||||||
|
constructor() {
|
||||||
|
super()
|
||||||
|
this.state = initialState
|
||||||
|
this.handleChange = this.handleChange.bind(this)
|
||||||
|
this.handleSubmit = this.handleSubmit.bind(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
handleChange(e) {
|
||||||
|
this.setState({ [e.target.name]: e.target.value })
|
||||||
|
}
|
||||||
|
|
||||||
|
handleSubmit(e) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.setState(initialState)
|
||||||
|
const email = e.target.email.value
|
||||||
|
const password = e.target.password.value // hash dis b4 send on frontend
|
||||||
|
return this.props.login({ email, password })
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<form onSubmit={this.handleSubmit}>
|
||||||
|
<div className="form-group row">
|
||||||
|
<label htmlFor="email" className="col-sm-2 col-form-label">
|
||||||
|
Email
|
||||||
|
</label>
|
||||||
|
<div className="col-sm-10">
|
||||||
|
<input
|
||||||
|
type="email"
|
||||||
|
className="form-control"
|
||||||
|
id="email"
|
||||||
|
placeholder="Email"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-group row">
|
||||||
|
<label htmlFor="password" className="col-sm-2 col-form-label">
|
||||||
|
Password
|
||||||
|
</label>
|
||||||
|
<div className="col-sm-10">
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
className="form-control"
|
||||||
|
id="password"
|
||||||
|
placeholder="Password"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button type="submit" onSubmit={this.handleSubmit}>
|
||||||
|
Log In
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Login
|
@ -3,6 +3,7 @@ import React from 'react'
|
|||||||
function Navbar(props) {
|
function Navbar(props) {
|
||||||
return (
|
return (
|
||||||
<nav className="navbar navbar-expand-lg navbar-light bg-light">
|
<nav className="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
{props.user && props.user.name ? (
|
||||||
<a
|
<a
|
||||||
className="navbar-brand"
|
className="navbar-brand"
|
||||||
href="#profile"
|
href="#profile"
|
||||||
@ -10,6 +11,15 @@ function Navbar(props) {
|
|||||||
>
|
>
|
||||||
{`Hello, ${props.user.name}!`}
|
{`Hello, ${props.user.name}!`}
|
||||||
</a>
|
</a>
|
||||||
|
) : (
|
||||||
|
<a
|
||||||
|
className="navbar-brand"
|
||||||
|
href="#login"
|
||||||
|
onClick={() => props.navigate('login')}
|
||||||
|
>
|
||||||
|
Log in
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
<button
|
<button
|
||||||
className="navbar-toggler"
|
className="navbar-toggler"
|
||||||
type="button"
|
type="button"
|
||||||
@ -53,6 +63,19 @@ function Navbar(props) {
|
|||||||
About
|
About
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
{props.user && props.user.name ? (
|
||||||
|
<li className="nav-item" onClick={() => props.logout()}>
|
||||||
|
<a className="nav-link" href="#logout">
|
||||||
|
Logout
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
) : (
|
||||||
|
<li className="nav-item" onClick={() => props.navigate('login')}>
|
||||||
|
<a className="nav-link" href="#login">
|
||||||
|
Login
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
)}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
Loading…
Reference in New Issue
Block a user