From e1641b32d1fab9dfc7c100c19d05afdbbdfa4654 Mon Sep 17 00:00:00 2001 From: rui hildt Date: Tue, 18 Aug 2020 19:10:49 +0200 Subject: [PATCH] Add Login query --- package.json | 2 +- src/screens/App.js | 2 +- src/screens/Login.js | 135 ++++++++++++++++++++++++++++++++----------- src/utils/common.js | 23 ++++++++ 4 files changed, 125 insertions(+), 37 deletions(-) create mode 100644 src/utils/common.js diff --git a/package.json b/package.json index ba290dd..f71b540 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "rsuite": "^4.8.0" }, "scripts": { - "start": "react-app-rewired start", + "start": "PORT=8000 react-app-rewired start", "dev": "BROWSER=firefox-developer-edition react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test", diff --git a/src/screens/App.js b/src/screens/App.js index 2f6a6d8..a821f8e 100644 --- a/src/screens/App.js +++ b/src/screens/App.js @@ -25,7 +25,7 @@ export default function App() { - + diff --git a/src/screens/Login.js b/src/screens/Login.js index a9d2952..626f425 100644 --- a/src/screens/Login.js +++ b/src/screens/Login.js @@ -1,9 +1,106 @@ -import React from 'react'; - -import { Panel, Form, FormGroup, FormControl, ControlLabel, Button } from 'rsuite'; +import React, { useState, useEffect } from 'react'; +import { useHistory } from 'react-router-dom'; +import axios from 'axios'; +import { + Panel, + Form, + FormGroup, + FormControl, + ControlLabel, + Button, +} from 'rsuite'; +import { setUserSession } from '../utils/common'; import NavBar from './../components/Navbar/NavBar'; +export default function Login({ title }) { + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [credentials, setCredentials] = useState({ + email: '', + password: '', + }); + + const history = useHistory(); + + // handle input fields + const handleChange = (value, evt) => { + console.log(value, evt.target.name); + setCredentials({ + ...credentials, + [evt.target.name]: value, + }); + }; + + // handle button click of login form + const handleLogin = () => { + setError(null); + setLoading(true); + console.log(credentials.email, credentials.password); + axios + .post('http://localhost:3000/api/auth/login', credentials) + .then((response) => { + setLoading(false); + console.log('RESPONSE', response); + localStorage.setItem( + 'data', + JSON.stringify({ + token: response.data.token, + user: response.data.user, + }), + ); + // TODO: Working redirection + history.push(''); + }) + .catch((error) => { + console.log('ERROR', error); + setLoading(false); + if (error.response.status === 401) + setError(error.response.data.message); + else setError('Something went wrong. Please try again later.'); + }); + }; + + return ( + <> + + +
+ + Email + + + Password + + + + + + + +
+
+ + ); +} + // TODO Move to a .less file const boxStyle = { maxWidth: 373, @@ -14,35 +111,3 @@ const boxStyle = { marginBottom: '10vh', padding: '1rem', }; - -export default function Login({ title }) { - return ( - <> - - -
- - Email - - - Password - - - - - - - -
-
- - ); -} diff --git a/src/utils/common.js b/src/utils/common.js new file mode 100644 index 0000000..7e7fb06 --- /dev/null +++ b/src/utils/common.js @@ -0,0 +1,23 @@ +// return the user data from the session storage +export const getUser = () => { + const userStr = sessionStorage.getItem('user'); + if (userStr) return JSON.parse(userStr); + else return null; +}; + +// return the token from the session storage +export const getToken = () => { + return sessionStorage.getItem('token') || null; +}; + +// remove the token and user from the session storage +export const removeUserSession = () => { + sessionStorage.removeItem('token'); + sessionStorage.removeItem('user'); +}; + +// set the token and user from the session storage +export const setUserSession = (token, user) => { + sessionStorage.setItem('token', token); + sessionStorage.setItem('user', JSON.stringify(user)); +};