浏览代码

change auth provider by redux

amenpunk 2 年之前
父节点
当前提交
690384722d

+ 15 - 0
src/Components/PrivateRoute.js

1
 import { Navigate, useLocation } from 'react-router-dom';
1
 import { Navigate, useLocation } from 'react-router-dom';
2
 import useAuth from '../Auth/useAuth';
2
 import useAuth from '../Auth/useAuth';
3
+import { useSelector } from 'react-redux';
3
 
4
 
4
 export default function RequireAuth({ children }) {
5
 export default function RequireAuth({ children }) {
5
 
6
 
21
     return children;
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
 import { HomeUser } from '../Pages/HomeUser'
23
 import { HomeUser } from '../Pages/HomeUser'
24
 import { Prueba } from '../Pages/Prueba.jsx'
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
 export default function MyRoutes() {
28
 export default function MyRoutes() {
29
 
29
 
39
       <Route
39
       <Route
40
         path="user"
40
         path="user"
41
         element={
41
         element={
42
-          <RequireAuth>
43
-            <User />
44
-          </RequireAuth>
42
+          <RequireToken>
43
+            <User/>
44
+          </RequireToken>
45
         }
45
         }
46
       >
46
       >
47
         <Route path="home" element={<HomeUser />} />
47
         <Route path="home" element={<HomeUser />} />

+ 4 - 2
src/Components/User.jsx

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

+ 23 - 33
src/Pages/Logincs.jsx

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

+ 3 - 1
src/Reducers/index.js

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

+ 1 - 4
src/Slices/tokenSlice.js

1
 import { createSlice } from '@reduxjs/toolkit';
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
 export const tokenSlice = createSlice({
4
 export const tokenSlice = createSlice({
8
   name: "token",
5
   name: "token",

+ 19 - 0
src/Slices/userSlice.js

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
       return undefined
5
       return undefined
6
     }
6
     }
7
     let data = JSON.parse(serializedData)
7
     let data = JSON.parse(serializedData)
8
-    console.log('data serializada', data)
9
     return data
8
     return data
10
   } catch (error) {
9
   } catch (error) {
11
     return undefined
10
     return undefined