From 79449f2d8b0c26c1b22ffc684df17715aaa1e250 Mon Sep 17 00:00:00 2001
From: lumb19 <lumb19@inf.ufpr.br>
Date: Tue, 27 Feb 2024 11:44:39 -0300
Subject: [PATCH] Issue #18: ADD local storage integration

---
 src/app/handlers/localStorageHandler.js |  8 +++
 src/app/login/components/Highlights.js  | 16 ++---
 src/app/login/components/LoginForm.js   | 21 ++++---
 src/app/login/page.js                   | 83 ++++++++++++++-----------
 4 files changed, 75 insertions(+), 53 deletions(-)
 create mode 100644 src/app/handlers/localStorageHandler.js

diff --git a/src/app/handlers/localStorageHandler.js b/src/app/handlers/localStorageHandler.js
new file mode 100644
index 00000000..74d14d10
--- /dev/null
+++ b/src/app/handlers/localStorageHandler.js
@@ -0,0 +1,8 @@
+export const getStoredValue = (attr) => {
+    return localStorage.getItem(attr) || "";
+}
+
+export async function saveToLocalStorage(attr, val) {
+    console.log(val);
+    localStorage.setItem(attr, val);
+}
\ No newline at end of file
diff --git a/src/app/login/components/Highlights.js b/src/app/login/components/Highlights.js
index 48d764f3..bf88e242 100644
--- a/src/app/login/components/Highlights.js
+++ b/src/app/login/components/Highlights.js
@@ -3,14 +3,14 @@ import { useEffect, useState } from "react";
 import mecredApi from "@/axiosConfig";
 
 export default function Hightlights() {
-
   const [statistics, setStatistics] = useState({});
 
   useEffect(() => {
-    mecredApi.get('/statistics')
-      .then(({data}) => setStatistics(data))
-      .catch(error => console.log(error))
-  }, [])
+    mecredApi
+      .get("/statistics")
+      .then(({ data }) => setStatistics(data))
+      .catch((error) => console.log(error));
+  }, []);
 
   return (
     <div className="flex flex-col text-center">
@@ -20,8 +20,10 @@ export default function Hightlights() {
       <h1 className="text-lg text-gray-400 mb-5">
         Encontre e compartilhe vídeos, animações e muitos outros recursos.
       </h1>
-      <h1 className="text-base">{statistics.count} recursos disponíveis 
-        | {statistics.month_downloads} recursos baixados este mês</h1>
+      <h1 className="text-base">
+        {statistics.count} recursos disponíveis | {statistics.month_downloads}{" "}
+        recursos baixados este mês
+      </h1>
       {/*<div className="flex flex-wrap justify-center max-w-[70%] items-center">
             <div className="m-1 min-w-24 h-24 bg-black  items-center"></div>
             <div className="m-1 min-w-24 h-24 bg-black  items-center"></div>
diff --git a/src/app/login/components/LoginForm.js b/src/app/login/components/LoginForm.js
index 8b269678..c0d28092 100644
--- a/src/app/login/components/LoginForm.js
+++ b/src/app/login/components/LoginForm.js
@@ -1,17 +1,20 @@
 "use client";
 import Image from "next/image";
-import { Button, Paper, SvgIcon, TextField } from "@mui/material";
+import { Button, Paper, Divider, SvgIcon, TextField } from "@mui/material";
 import theme from "@/app/theme";
 import { ThemeProvider } from "@emotion/react";
 
 export default function LoginForm({
   handleEmailChange,
   handlePasswordChange,
-  handleButtonClick,
+  handleSubmit,
 }) {
   return (
     <ThemeProvider theme={theme}>
-      <div className="flex flex-col items-center justify-center">
+      <form
+        onSubmit={handleSubmit}
+        className="flex flex-col items-center justify-center"
+      >
         <Paper
           elevation={0}
           className="w-96 flex flex-col items-center p-5 rounded-xl"
@@ -25,14 +28,14 @@ export default function LoginForm({
           />
           <TextField
             fullWidth
-            label="E-mail *"
+            label="E-mail"
             className="m-5"
             onChange={handleEmailChange}
           />
           <TextField
             fullWidth
             type="password"
-            label="Senha *"
+            label="Senha"
             className="mb-5"
             onChange={handlePasswordChange}
           />
@@ -40,11 +43,13 @@ export default function LoginForm({
             fullWidth
             disableElevation
             className="bg-secondary text-white hover:bg-secondary"
-            onClick={handleButtonClick}
+            type="submit"
           >
             Entrar
           </Button>
-          <p className="mt-2 text-gray-400 text-md">OU</p>
+          <Divider flexItem className="mt-2">
+            <p className="text-gray-400 text-md">OU</p>
+          </Divider>
           <Button
             fullWidth
             disableElevation
@@ -61,7 +66,7 @@ export default function LoginForm({
         <p className="mt-5 text-xs text-gray-400">
           Não tem uma conta? <a className="text-secondary">Cadastre-se.</a>
         </p>
-      </div>
+      </form>
     </ThemeProvider>
   );
 }
diff --git a/src/app/login/page.js b/src/app/login/page.js
index 585454f0..2e48de11 100644
--- a/src/app/login/page.js
+++ b/src/app/login/page.js
@@ -1,47 +1,54 @@
-"use client"
-import Grid from '@mui/material/Unstable_Grid2';
-import Paper from '@mui/material/Paper'
-import Hightlights from './components/Highlights';
-import LoginForm from './components/LoginForm';
-import { useState } from 'react';
-import mecredApi from '@/axiosConfig';
+"use client";
+import Grid from "@mui/material/Unstable_Grid2";
+import Paper from "@mui/material/Paper";
+import Hightlights from "./components/Highlights";
+import LoginForm from "./components/LoginForm";
+import { useState } from "react";
+import mecredApi from "@/axiosConfig";
+import { getStoredValue, saveToLocalStorage } from "../handlers/localStorageHandler";
 
 export default function Login() {
+  const [userEmail, setUserEmail] = useState("");
+  const [userPassword, setUserPassword] = useState("");
 
-    const [userEmail, setUserEmail] = useState("");
-    const [userPassword, setUserPassword] = useState("");
+  const handleEmailChange = (e) => {
+    setUserEmail(e.target.value);
+    console.log(e.target.value);
+  };
 
-    const handleEmailChange = (e) => {
-        setUserEmail(e.target.value);
-        console.log(e.target.value);
-    }
-    
-    const handlePasswordChange = (e) => {
-        setUserPassword(e.target.value);
-    }
+  const handlePasswordChange = (e) => {
+    setUserPassword(e.target.value);
+  };
 
-    const userLogin = async (email, password) => {
+  const userLogin = async (event, email, password) => {
+    event.preventDefault();
 
-        mecredApi.post('/auth/sign_in', {
-            email: userEmail,
-            password: userPassword
+    let access_token = getStoredValue("access_token");
+    console.log("Opa");
+    if (!access_token) {
+      console.log("oi");
+      mecredApi
+        .post("/auth/sign_in", {
+          email: userEmail,
+          password: userPassword,
         })
-        .then(response => console.log(response))
-        .catch(error => console.log(error.response))
+        .then(({ headers }) => saveToLocalStorage("access_token", headers["access-token"]))
+        .catch((error) => console.log(error.response));
     }
+  };
 
-
-    return (
-        <Grid container className="min-h-screen bg-main items-center">
-            <Grid xs={12} md={7} lg={7} className="">
-                <Hightlights/>
-            </Grid>
-            <Grid xs={12} md={5} lg={5} >
-                <LoginForm handleEmailChange={handleEmailChange} 
-                    handlePasswordChange={handlePasswordChange}
-                    handleButtonClick={userLogin}
-                />
-            </Grid>
-        </Grid>
-    )
-}
\ No newline at end of file
+  return (
+    <Grid container className="min-h-screen bg-[#f5f9f9] items-center">
+      <Grid xs={12} md={7} lg={7} className="">
+        <Hightlights />
+      </Grid>
+      <Grid xs={12} md={5} lg={5}>
+        <LoginForm
+          handleEmailChange={handleEmailChange}
+          handlePasswordChange={handlePasswordChange}
+          handleSubmit={userLogin}
+        />
+      </Grid>
+    </Grid>
+  );
+}
-- 
GitLab