Browse Source

change auth provider by redux

amenpunk 2 years ago
parent
commit
690384722d

+ 15 - 0
src/Components/PrivateRoute.js

@@ -1,5 +1,6 @@
1 1
 import { Navigate, useLocation } from 'react-router-dom';
2 2
 import useAuth from '../Auth/useAuth';
3
+import { useSelector } from 'react-redux';
3 4
 
4 5
 export default function RequireAuth({ children }) {
5 6
 
@@ -21,3 +22,17 @@ export default function RequireAuth({ children }) {
21 22
     return children;
22 23
 }
23 24
 
25
+export function RequireToken({ children }) {
26
+
27
+    let token = useSelector((state) => state.token.token)
28
+    let location = useLocation();
29
+    // let { authorities } = auth.getRole();
30
+    // authorities = authorities ? authorities.map( e => e.toUpperCase()) : [] ;
31
+
32
+    if (!token) {
33
+      console.log('falta authorizacion user')
34
+      return <Navigate to="/logincd" state={{ from: location }} replace />;
35
+    }
36
+
37
+    return children;
38
+}

+ 4 - 4
src/Components/Routes.js

@@ -23,7 +23,7 @@ import { RestorePassword } from '../Pages/RestorePassword'
23 23
 import { HomeUser } from '../Pages/HomeUser'
24 24
 import { Prueba } from '../Pages/Prueba.jsx'
25 25
 
26
-import RequireAuth from '../Components/PrivateRoute'
26
+import RequireAuth, { RequireToken } from '../Components/PrivateRoute'
27 27
 
28 28
 export default function MyRoutes() {
29 29
 
@@ -39,9 +39,9 @@ export default function MyRoutes() {
39 39
       <Route
40 40
         path="user"
41 41
         element={
42
-          <RequireAuth>
43
-            <User />
44
-          </RequireAuth>
42
+          <RequireToken>
43
+            <User/>
44
+          </RequireToken>
45 45
         }
46 46
       >
47 47
         <Route path="home" element={<HomeUser />} />

+ 4 - 2
src/Components/User.jsx

@@ -81,7 +81,7 @@ export function User() {
81 81
 
82 82
     const [open, setOpen] = React.useState(true);
83 83
 
84
-    const isMovil = Size('(max-width:770px)');
84
+    const isMovil = Size('(max-width:1000px)');
85 85
     const auth = useAuth();
86 86
     const navigate = useNavigate()
87 87
     let dispatch = useDispatch()
@@ -97,6 +97,7 @@ export function User() {
97 97
     const handleClick = (event) =>  setAnchorEl(event.currentTarget);
98 98
     const handleClose = () => setAnchorEl(null)
99 99
     const toggleDrawer = () => {
100
+        console.log('toggle drawer')
100 101
         if(isMovil){
101 102
             setAnchorElMov(!anchorElMovil)
102 103
         }else{
@@ -104,6 +105,7 @@ export function User() {
104 105
         }
105 106
     }
106 107
     const [anchorElMovil, setAnchorElMov] = React.useState(false);
108
+    React.useEffect(() => isMovil ? setOpen(false) : null , [isMovil])
107 109
 
108 110
     return (
109 111
         <ThemeProvider theme={mdTheme}>
@@ -119,7 +121,7 @@ export function User() {
119 121
                             color="inherit"
120 122
                             aria-label="open drawer"
121 123
                             onClick={toggleDrawer}
122
-                            sx={{ marginRight: '36px', ...( open && { display: 'none' }), }} >
124
+                            sx={{ marginRight: '36px', ...( open  && { display: 'none' }), }} >
123 125
                             <MenuIcon style={{
124 126
                                 background: 'var(--main)',
125 127
                                 fontSize: "40",

+ 23 - 33
src/Pages/Logincs.jsx

@@ -1,10 +1,11 @@
1 1
 import * as React from 'react';
2 2
 import toast, { Toaster } from 'react-hot-toast';
3
-import { useNavigate } from 'react-router-dom'
3
+import { Navigate, useNavigate } from 'react-router-dom'
4 4
 import jwt_decode from "jwt-decode";
5
-import { useDispatch } from "react-redux";
5
+import { useDispatch , useSelector } from "react-redux";
6 6
 
7 7
 import { setToken } from '../Slices/tokenSlice'
8
+import { setProfile, setRole } from '../Slices/userSlice.js'
8 9
 
9 10
 import {
10 11
   Paper, Box, Grid, Typography, TextField, Button, Avatar,
@@ -15,7 +16,6 @@ import { createTheme, ThemeProvider } from '@mui/material/styles';
15 16
 
16 17
 import PersonIcon from '@mui/icons-material/Person';
17 18
 import { Copyright } from '../Components/Footer.js'
18
-import useAuth from '../Auth/useAuth';
19 19
 
20 20
 import { useFormik } from 'formik';
21 21
 import * as Yup from 'yup';
@@ -37,12 +37,18 @@ const theme = createTheme();
37 37
 
38 38
 export function LoginCs() {
39 39
 
40
-  let auth = useAuth();
41
-  let navigate = useNavigate()
42
-
43 40
   const [open, setOpen] = React.useState(false);
44 41
   const dispatch = useDispatch();
45 42
   const handleClose = () => false
43
+  const navigate = useNavigate();
44
+  let token = useSelector((state) => state.token.token)
45
+
46
+  React.useEffect(() => {
47
+    if(token){
48
+      navigate('/user/home')
49
+    }
50
+  }, [token, navigate])
51
+
46 52
 
47 53
   const formik = useFormik({
48 54
     initialValues: {
@@ -52,14 +58,11 @@ export function LoginCs() {
52 58
     validationSchema: LoginSchema,
53 59
     onSubmit: async (values) => {
54 60
 
55
-      //
56
-      // QW5hbGlzdGEgZGUgY29tcHJhcw==
57
-      //
58
-
59 61
       let { email, password } = values
60 62
       setOpen(true)
61 63
 
62
-      let request = new Service(`/user?user=${email}&password=${password}&typeusr=iscandidato`)
64
+      let url = `/user?user=${email}&password=${password}&typeusr=iscandidato`
65
+      let request = new Service(url);
63 66
       request
64 67
         .post({})
65 68
         .then(response => {
@@ -68,30 +71,26 @@ export function LoginCs() {
68 71
           let { token, nombre, apelidos, id: pass_id } = response;
69 72
           toast.success(`Bienvenido ${nombre} ${apelidos}!!`)
70 73
           token = token.replace("Bearer ", "")
71
-          // console.log(token);
72
-
73
-          // let { exp } = jwt_decode(token);
74
+          let { exp } = jwt_decode(token);
74 75
           let body_token = jwt_decode(token);
75 76
           body_token['pass'] = password;
76 77
           body_token['passid'] = pass_id;
77
-          console.log("BODY TOKEN: ", body_token)
78
-          dispatch(setToken(token))
79
-          // let timestamp = exp * 1000;
80
-          // let restante = timestamp - Date.now();
81 78
 
82
-          // setTimeout(() => alert("Token Expirado"), restante)
83
-          auth.setProfile({
79
+          let timestamp = exp * 1000;
80
+          let exp_in = timestamp - Date.now();
81
+          let profile = {
84 82
             email,
85 83
             password,
86 84
             passid: pass_id,
87 85
             pass: password,
88 86
             assingid: 'ok'
89
-          })
90
-          auth.setRole(body_token)
91
-
87
+          }
88
+          setTimeout(() => alert("Token Expirado"), exp_in)
92 89
           setTimeout(() => {
93 90
             setOpen(false)
94
-            auth.login(token)
91
+            dispatch(setRole(body_token))
92
+            dispatch(setProfile(profile))
93
+            dispatch(setToken({ token : token, exp : exp_in }))
95 94
           }, 2000)
96 95
 
97 96
         })
@@ -104,12 +103,6 @@ export function LoginCs() {
104 103
     },
105 104
   });
106 105
 
107
-  React.useEffect(() => {
108
-    if (auth.isLogged()) {
109
-      return navigate('/user/home')
110
-    }
111
-  }, [auth, navigate])
112
-
113 106
   return (
114 107
     <ThemeProvider theme={theme}>
115 108
       <Grid container component="main" sx={{ height: '100vh' }}>
@@ -192,6 +185,3 @@ export function LoginCs() {
192 185
 
193 186
   );
194 187
 }
195
-
196
-
197
-// export default connect(mapStateToProps, mapDispatchToProps)(LoginCs);

+ 3 - 1
src/Reducers/index.js

@@ -1,8 +1,10 @@
1 1
 import { combineReducers } from '@reduxjs/toolkit'
2 2
 import tokenReducer from '../Slices/tokenSlice.js';
3
+import userReducer from '../Slices/userSlice.js';
3 4
 
4 5
 const rootReducer = combineReducers({
5
-  token : tokenReducer
6
+  token : tokenReducer,
7
+  user: userReducer
6 8
 });
7 9
 
8 10
 export default rootReducer;

+ 1 - 4
src/Slices/tokenSlice.js

@@ -1,8 +1,5 @@
1 1
 import { createSlice } from '@reduxjs/toolkit';
2
-// import Cookies from 'js-cookie'
3
-
4
-// let token = Cookies.get('token') ? Cookies.get('token') : null;
5
-const initialState = { token : null };
2
+const initialState = { token : null, exp : 0 };
6 3
 
7 4
 export const tokenSlice = createSlice({
8 5
   name: "token",

+ 19 - 0
src/Slices/userSlice.js

@@ -0,0 +1,19 @@
1
+import { createSlice } from '@reduxjs/toolkit';
2
+
3
+const initialState = { profile : null, role :null }
4
+
5
+export const userSlice = createSlice({
6
+  name: 'user',
7
+  initialState,
8
+  reducers: {
9
+    setProfile: (state, action) => {
10
+      state.data = action.payload;
11
+    },
12
+    setRole : (state, action ) => {
13
+      state.role = action.payload;
14
+    }
15
+  }
16
+})
17
+
18
+export const { setProfile, setRole } = userSlice.actions;
19
+export default userSlice.reducer;

+ 0 - 1
src/Utils/state.js

@@ -5,7 +5,6 @@ export const loadState = () => {
5 5
       return undefined
6 6
     }
7 7
     let data = JSON.parse(serializedData)
8
-    console.log('data serializada', data)
9 8
     return data
10 9
   } catch (error) {
11 10
     return undefined