diff --git a/frontend/.env b/frontend/.env
deleted file mode 100644
index 1786301..0000000
--- a/frontend/.env
+++ /dev/null
@@ -1 +0,0 @@
-REACT_APP_DEVCHALLENGE_API=http://localhost:3333
\ No newline at end of file
diff --git a/frontend/src/App.js b/frontend/src/App.js
index c368411..ccf2d83 100644
--- a/frontend/src/App.js
+++ b/frontend/src/App.js
@@ -1,8 +1,14 @@
import React from 'react';
import Routes from './routes';
+import { AuthProvider } from './contexts/AuthContext';
+
function App() {
- return ;
+ return (
+
+
+
+ );
}
export default App;
diff --git a/frontend/src/components/Header/index.js b/frontend/src/components/Header/index.js
index 270470b..a0a5ece 100644
--- a/frontend/src/components/Header/index.js
+++ b/frontend/src/components/Header/index.js
@@ -4,7 +4,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faBars, faTimes } from '@fortawesome/free-solid-svg-icons';
import { faGithub } from '@fortawesome/free-brands-svg-icons';
-import Logo from '../Logo'
+import Logo from '../Logo';
import * as S from './styled';
@@ -49,7 +49,10 @@ export default function Header() {
-
+
Entrar
{
+ const [user, setUser] = useState({});
+
+ return (
+
+ {children}
+
+ );
+};
+
+export { AuthContext, AuthProvider };
diff --git a/frontend/src/pages/CallbackPage/index.js b/frontend/src/pages/CallbackPage/index.js
new file mode 100644
index 0000000..a13f3a6
--- /dev/null
+++ b/frontend/src/pages/CallbackPage/index.js
@@ -0,0 +1,48 @@
+/* eslint-disable no-shadow */
+import React, { useEffect, useCallback, useContext } from 'react';
+import { useHistory, useLocation } from 'react-router-dom';
+
+import { AuthContext } from '../../contexts/AuthContext';
+
+import api from '../../services/api';
+import { login } from '../../services/authentication';
+
+import Logo from '../../components/Logo';
+
+import * as S from './styled';
+
+export default function CallbackPage() {
+ const history = useHistory();
+
+ const { search } = useLocation();
+ const searchParam = new URLSearchParams(search);
+
+ const code = searchParam.get('code');
+
+ const { setUser } = useContext(AuthContext);
+
+ const authenticateUserWithGithub = useCallback(
+ async (code) => {
+ const response = await api.get(
+ `http://localhost:3333/auth/${code}`
+ );
+ if (response.status === 200 || response.status === 201) {
+ setUser(response.data.user);
+ login(response.data.token);
+ history.push('/dashboard');
+ }
+ },
+ [history, setUser]
+ );
+
+ useEffect(() => {
+ authenticateUserWithGithub(code);
+ }, [code, authenticateUserWithGithub]);
+
+ return (
+
+
+ Aguardando as informações...
+
+ );
+}
diff --git a/frontend/src/pages/CallbackPage/styled.js b/frontend/src/pages/CallbackPage/styled.js
new file mode 100644
index 0000000..e12830d
--- /dev/null
+++ b/frontend/src/pages/CallbackPage/styled.js
@@ -0,0 +1,15 @@
+import styled from 'styled-components';
+
+export const Container = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ margin-top: 10%;
+
+ h2 {
+ color: white;
+ margin-top: 20px;
+ }
+
+`
diff --git a/frontend/src/pages/ConstructPage/index.js b/frontend/src/pages/ConstructPage/index.js
deleted file mode 100644
index 29e12b0..0000000
--- a/frontend/src/pages/ConstructPage/index.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import React from 'react';
-
-import pageInConstruction from '../../assets/page-under-construction.png';
-import Header from '../../components/Header';
-
-function ConstructPage() {
- return (
- <>
-
-
-

-
Pagina em Construção
-
- >
- );
-}
-
-export default ConstructPage;
diff --git a/frontend/src/routes.js b/frontend/src/routes.js
index 082d594..a666709 100644
--- a/frontend/src/routes.js
+++ b/frontend/src/routes.js
@@ -1,6 +1,8 @@
import React from 'react';
import { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom';
+import { isAuthenticated as logged } from './services/authentication';
+
import { ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import Home from './pages/Home';
@@ -15,15 +17,15 @@ import Footer from './components/Footer';
import ToDoChallenge from './pages/ToDoChallenge';
import { Container } from './styles/GlobalStyles';
-import ConstructPage from './pages/ConstructPage';
+import CallbackPage from './pages/CallbackPage';
-const logged = false;
const LoggedRoute = ({ component: Component, ...rest }) => (
+
- logged ? (
+ logged() ? (
) : (
+
@@ -55,7 +58,6 @@ function Routes() {
component={MyChallenges}
/>
-
diff --git a/frontend/src/services/authentication.js b/frontend/src/services/authentication.js
new file mode 100644
index 0000000..992a9ed
--- /dev/null
+++ b/frontend/src/services/authentication.js
@@ -0,0 +1,11 @@
+export const TOKEN_KEY = "@DevChallenge-Token";
+
+export const isAuthenticated = () => localStorage.getItem(TOKEN_KEY) !== null;
+
+export const login = token => {
+ localStorage.setItem(TOKEN_KEY, token);
+};
+
+export const logout = () => {
+ localStorage.removeItem(TOKEN_KEY);
+};