Browse Source

use redux as auth handler method

amenpunk 2 years ago
parent
commit
3dab438365
5 changed files with 380 additions and 388 deletions
  1. 134 133
      src/Components/Dashboard.js
  2. 21 23
      src/Components/PrivateRoute.js
  3. 2 2
      src/Components/Routes.js
  4. 45 50
      src/Pages/Home.jsx
  5. 178 180
      src/Pages/Login.jsx

+ 134 - 133
src/Components/Dashboard.js

@@ -22,8 +22,9 @@ import Footer from "../Components/Footer";
22 22
 
23 23
 import { Drawer as MuiDrawer, AppBar as MuiAppBar } from "../Components/Navigation/AppBar"
24 24
 import { MainListItems, SecondaryListItems } from '../Components/Navigation/listItems';
25
-import useAuth from '../Auth/useAuth.js'
26 25
 import ProfilePicture from '../Images/man.png';
26
+import { useDispatch } from 'react-redux';
27
+import { removeToken } from '../Slices/tokenSlice';
27 28
 
28 29
 const drawerWidth = 240;
29 30
 const mdTheme = createTheme();
@@ -77,140 +78,140 @@ const Drawer = styled(MuiDrawer,
77 78
 
78 79
 function DashboardContent() {
79 80
 
80
-    const [open, setOpen] = React.useState(false);
81
-
82
-    const isMovil = Size('(max-width:770px)');
83
-    const auth = useAuth();
84
-    const navigate = useNavigate()
85
-
86
-    const CerrarSession = () => {
87
-        auth.logout();
88
-        navigate('/')
89
-    }
90
-
91
-    const [anchorEl, setAnchorEl] = React.useState(null);
92
-    const open_profile = Boolean(anchorEl);
93
-    const handleClick = (event) =>  setAnchorEl(event.currentTarget);
94
-    const handleClose = () => setAnchorEl(null)
95
-    const toggleDrawer = () => {
96
-        if(isMovil){
97
-            setAnchorElMov(!anchorElMovil)
98
-        }else{
99
-            setOpen(!open);
100
-        }
81
+  const [open, setOpen] = React.useState(false);
82
+
83
+  const isMovil = Size('(max-width:770px)');
84
+  const dispatch = useDispatch();
85
+  const navigate = useNavigate()
86
+
87
+  const CerrarSession = () => {
88
+    dispatch(removeToken())
89
+    navigate('/')
90
+  }
91
+
92
+  const [anchorEl, setAnchorEl] = React.useState(null);
93
+  const open_profile = Boolean(anchorEl);
94
+  const handleClick = (event) =>  setAnchorEl(event.currentTarget);
95
+  const handleClose = () => setAnchorEl(null)
96
+  const toggleDrawer = () => {
97
+    if(isMovil){
98
+      setAnchorElMov(!anchorElMovil)
99
+    }else{
100
+      setOpen(!open);
101 101
     }
102
-    const [anchorElMovil, setAnchorElMov] = React.useState(false);
103
-
104
-    return (
105
-        <ThemeProvider theme={mdTheme}>
106
-            <MenuMovil anchor={anchorElMovil} control={setAnchorElMov} />
107
-            <Box sx={{ display: 'flex' }}>
108
-                <AppBar style={{ backgroundColor: '#fff', boxShadow: 'None' }} position="absolute" open={open}>
109
-                    <Toolbar sx={{ pr: '24px', borderBottom: "1px solid #ec5e69" }} >
110
-                        <IconButton
111
-                            name="navigation_icon_button"
112
-                            edge="start"
113
-                            color="inherit"
114
-                            aria-label="open drawer"
115
-                            // onClick={isMovil ? MenuResponsive : toggleDrawer}
116
-                            onClick={toggleDrawer}
117
-                            sx={{ marginRight: '36px', ...( open && { display: 'none' }), }} >
118
-                            <MenuIcon style={{
119
-                                background: '#ec5e69',
120
-                                fontSize: "40",
121
-                                color: "#fff"
122
-                            }} />
123
-                        </IconButton>
124
-                        <Typography component="h1" variant="h6" color="inherit" noWrap sx={{ flexGrow: 1 }} >
125
-                            {
126
-                                open ? (
127
-                                    <React.Fragment>
128
-
129
-                                        <IconButton onClick={toggleDrawer}>
130
-                                            <LeftKey/>
131
-                                        </IconButton>
132
-
133
-                                        <IconButton onClick={(event) => event.target.requestFullscreen()}>
134
-                                            <FullscreenIcon style={{ paddinLeft: 15 }} />
135
-                                        </IconButton>
136
-                                    </React.Fragment>
137
-                                ) : undefined
138
-                            }
139
-                        </Typography>
140
-
141
-                        <Box sx={{ display: { xs: 'none', md: 'flex' } }}>
142
-                            <IconButton size="large" aria-label="show 4 new mails" color="inherit">
143
-                                <Badge badgeContent={4} color="error">
144
-                                    <MailIcon style={{ color : '#212529' }} />
145
-                                </Badge>
146
-                            </IconButton>
147
-                            <IconButton
148
-                                size="large"
149
-                                aria-label="show 17 new notifications"
150
-                                color="inherit">
151
-                                <Badge badgeContent={17} color="error">
152
-                                    <NotificationsIcon style={{ color : '#212529' }}/>
153
-                                </Badge>
154
-                            </IconButton>
155
-
156
-
157
-                            <IconButton
158
-                                size="small"
159
-                                edge="end"
160
-                                aria-label="account of current user"
161
-                                aria-haspopup="true"
162
-                                aria-expanded={open_profile ? 'true' : undefined}
163
-                                onClick={handleClick}
164
-                                color="inherit"
165
-                            >
166
-                                <Avatar alt="Cindy Baker" src={ProfilePicture} />
167
-
168
-                            </IconButton>
169
-                            <Menu
170
-                                id="basic-menu"
171
-                                anchorEl={anchorEl}
172
-                                open={open_profile}
173
-                                onClose={handleClose}
174
-                                MenuListProps={{ 'aria-labelledby': 'basic-button', }}>
175
-                                <MenuItem onClick={() => navigate('dashboard/perfil') }>Profile</MenuItem>
176
-                                <MenuItem onClick={() => console.log('opcion 2')}>My account</MenuItem>
177
-                                <MenuItem onClick={CerrarSession}>Logout</MenuItem>
178
-                            </Menu>
179
-                        </Box>
180
-
181
-
182
-                    </Toolbar>
183
-                </AppBar>
184
-                <Drawer variant="permanent" open={open} >
185
-                    <Toolbar
186
-                        sx={{
187
-                            display: 'flex',
188
-                            alignItems: 'center',
189
-                            justifyContent: 'flex-start',
190
-                            px: [1]
191
-                        }} >
192
-                        <div style={{ flat: 'righ' }} className="sidebar-header">
193
-                            <div className="width_img">
194
-                                <img src={Logo} alt="pruebas psicometricas" />
195
-                            </div>
196
-                        </div>
197
-                    </Toolbar>
198
-                    <Divider />
199
-                    <List>
200
-                        <MainListItems AppBarVisible={open} setAppBarVisible={setOpen} />
201
-                    </List>
202
-                    <Divider />
203
-                    <List>
204
-                        {SecondaryListItems}
205
-                    </List>
206
-                </Drawer>
207
-                <Container maxWidth="lg" sx={{ mt: 2, mb: 2 }}>
208
-                    <Outlet />
209
-                    <Footer />
210
-                </Container>
102
+  }
103
+  const [anchorElMovil, setAnchorElMov] = React.useState(false);
104
+
105
+  return (
106
+    <ThemeProvider theme={mdTheme}>
107
+      <MenuMovil anchor={anchorElMovil} control={setAnchorElMov} />
108
+      <Box sx={{ display: 'flex' }}>
109
+        <AppBar style={{ backgroundColor: '#fff', boxShadow: 'None' }} position="absolute" open={open}>
110
+          <Toolbar sx={{ pr: '24px', borderBottom: "1px solid #ec5e69" }} >
111
+            <IconButton
112
+              name="navigation_icon_button"
113
+              edge="start"
114
+              color="inherit"
115
+              aria-label="open drawer"
116
+              // onClick={isMovil ? MenuResponsive : toggleDrawer}
117
+              onClick={toggleDrawer}
118
+              sx={{ marginRight: '36px', ...( open && { display: 'none' }), }} >
119
+              <MenuIcon style={{
120
+                background: '#ec5e69',
121
+                fontSize: "40",
122
+                color: "#fff"
123
+              }} />
124
+            </IconButton>
125
+            <Typography component="h1" variant="h6" color="inherit" noWrap sx={{ flexGrow: 1 }} >
126
+              {
127
+              open ? (
128
+                <React.Fragment>
129
+
130
+                  <IconButton onClick={toggleDrawer}>
131
+                    <LeftKey/>
132
+                  </IconButton>
133
+
134
+                  <IconButton onClick={(event) => event.target.requestFullscreen()}>
135
+                    <FullscreenIcon style={{ paddinLeft: 15 }} />
136
+                  </IconButton>
137
+                </React.Fragment>
138
+              ) : undefined
139
+            }
140
+            </Typography>
141
+
142
+            <Box sx={{ display: { xs: 'none', md: 'flex' } }}>
143
+              <IconButton size="large" aria-label="show 4 new mails" color="inherit">
144
+                <Badge badgeContent={4} color="error">
145
+                  <MailIcon style={{ color : '#212529' }} />
146
+                </Badge>
147
+              </IconButton>
148
+              <IconButton
149
+                size="large"
150
+                aria-label="show 17 new notifications"
151
+                color="inherit">
152
+                <Badge badgeContent={17} color="error">
153
+                  <NotificationsIcon style={{ color : '#212529' }}/>
154
+                </Badge>
155
+              </IconButton>
156
+
157
+
158
+              <IconButton
159
+                size="small"
160
+                edge="end"
161
+                aria-label="account of current user"
162
+                aria-haspopup="true"
163
+                aria-expanded={open_profile ? 'true' : undefined}
164
+                onClick={handleClick}
165
+                color="inherit"
166
+              >
167
+                <Avatar alt="Cindy Baker" src={ProfilePicture} />
168
+
169
+              </IconButton>
170
+              <Menu
171
+                id="basic-menu"
172
+                anchorEl={anchorEl}
173
+                open={open_profile}
174
+                onClose={handleClose}
175
+                MenuListProps={{ 'aria-labelledby': 'basic-button', }}>
176
+                <MenuItem onClick={() => navigate('dashboard/perfil') }>Profile</MenuItem>
177
+                <MenuItem onClick={() => console.log('opcion 2')}>My account</MenuItem>
178
+                <MenuItem onClick={CerrarSession}>Logout</MenuItem>
179
+              </Menu>
211 180
             </Box>
212
-        </ThemeProvider>
213
-    );
181
+
182
+
183
+          </Toolbar>
184
+        </AppBar>
185
+        <Drawer variant="permanent" open={open} >
186
+          <Toolbar
187
+            sx={{
188
+              display: 'flex',
189
+              alignItems: 'center',
190
+              justifyContent: 'flex-start',
191
+              px: [1]
192
+            }} >
193
+            <div style={{ flat: 'righ' }} className="sidebar-header">
194
+              <div className="width_img">
195
+                <img src={Logo} alt="pruebas psicometricas" />
196
+              </div>
197
+            </div>
198
+          </Toolbar>
199
+          <Divider />
200
+          <List>
201
+            <MainListItems AppBarVisible={open} setAppBarVisible={setOpen} />
202
+          </List>
203
+          <Divider />
204
+          <List>
205
+            {SecondaryListItems}
206
+          </List>
207
+        </Drawer>
208
+        <Container maxWidth="lg" sx={{ mt: 2, mb: 2 }}>
209
+          <Outlet />
210
+          <Footer />
211
+        </Container>
212
+      </Box>
213
+    </ThemeProvider>
214
+  );
214 215
 }
215 216
 
216 217
 export function Dashboard() {

+ 21 - 23
src/Components/PrivateRoute.js

@@ -4,35 +4,33 @@ import { useSelector } from 'react-redux';
4 4
 
5 5
 export default function RequireAuth({ children }) {
6 6
 
7
-    let auth = useAuth();
8
-    let location = useLocation();
9
-    let { authorities } = auth.getRole();
10
-    authorities = authorities ? authorities.map( e => e.toUpperCase()) : [] ;
11
-
12
-    if (!auth.isLogged()) {
13
-        if( authorities.includes("CANDIDATO")){
14
-            console.log("redirigir candidato")
15
-            return <Navigate to="/logincd" state={{ from: location }} replace />;
16
-        }else{
17
-            console.log("redirigir recluter")
18
-            return <Navigate to="/login" state={{ from: location }} replace />;
19
-        }
7
+  let auth = useAuth();
8
+  let location = useLocation();
9
+  let { authorities } = auth.getRole();
10
+  authorities = authorities ? authorities.map(e => e.toUpperCase()) : [];
11
+
12
+  if (!auth.isLogged()) {
13
+    if (authorities.includes("CANDIDATO")) {
14
+      console.log("redirigir candidato")
15
+      return <Navigate to="/logincd" state={{ from: location }} replace />;
16
+    } else {
17
+      console.log("redirigir recluter")
18
+      return <Navigate to="/login" state={{ from: location }} replace />;
20 19
     }
20
+  }
21 21
 
22
-    return children;
22
+  return children;
23 23
 }
24 24
 
25 25
 export function RequireToken({ children }) {
26 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()) : [] ;
27
+  let token = useSelector((state) => state.token.token)
28
+  let location = useLocation();
31 29
 
32
-    if (!token) {
33
-      console.log('falta authorizacion user')
34
-      return <Navigate to="/logincd" state={{ from: location }} replace />;
35
-    }
30
+  if (!token) {
31
+    console.log('falta authorizacion user')
32
+    return <Navigate to="/logincd" state={{ from: location }} replace />;
33
+  }
36 34
 
37
-    return children;
35
+  return children;
38 36
 }

+ 2 - 2
src/Components/Routes.js

@@ -52,9 +52,9 @@ export default function MyRoutes() {
52 52
       <Route
53 53
         path="dashboard"
54 54
         element={
55
-          <RequireAuth>
55
+          <RequireToken>
56 56
             <Dashboard />
57
-          </RequireAuth>
57
+          </RequireToken>
58 58
         }
59 59
       >
60 60
         <Route path="home" element={<Home />} />

+ 45 - 50
src/Pages/Home.jsx

@@ -1,60 +1,55 @@
1
-import { Col, Row } from 'react-bootstrap'
2
-import React, { useEffect, useState } from 'react'
3
-
4
-import { PersonOutline, VerifiedUser, ListAlt  } from '@mui/icons-material/'
1
+import React from 'react'
5 2
 
3
+import { Col, Row } from 'react-bootstrap'
4
+import { PersonOutline, VerifiedUser, ListAlt } from '@mui/icons-material/'
6 5
 import Actividades from '../Components/Home/Actividades'
7 6
 import Candidatos from '../Components/Home/Candidatos'
8 7
 import { Card } from '../Components/Card';
8
+import { useSelector } from 'react-redux';
9 9
 
10
-import useAuth from '../Auth/useAuth';
11 10
 
12 11
 export function Home() {
13 12
 
14
-    const auth = useAuth();
15
-    const [nombre, setNombre] = useState(null);
16
-
17
-    useEffect(() => {
18
-        let { nombre: empresa } = auth.getProfile();
19
-        setNombre(empresa)
20
-    }, [auth])
21
-
22
-
23
-    return (
24
-        <section >
25
-            <div className="content-section">
26
-                <div className="main">
27
-
28
-                    <div id="start_title">
29
-                        <h1>Bienvenido de nuevo {nombre}</h1>
30
-                    </div>
31
-
32
-                    <div className="panel_options">
33
-                        <Row>
34
-                            <Col md="4">
35
-                                <Card quantity={120} to='/dashboard/contrasenas'  title='CONTRASEÑAS' icon={VerifiedUser}/>
36
-                            </Col>
37
-                            <Col md="4">
38
-                                <Card quantity={504} to='/dashboard/expedientes' title='EXPEDIENTES' icon={PersonOutline}/>
39
-                            </Col>
40
-                            <Col md="4">
41
-                                <Card quantity={343} to="/dashboard/puestos" title='PUESTOS' icon={ListAlt}/>
42
-                            </Col>
43
-                        </Row>
44
-                    </div>
45
-                    <div className="historial_candidatos">
46
-                        <Row>
47
-                            <Col md="8">
48
-                                <Candidatos/>
49
-                            </Col>
50
-                            <Col md="4">
51
-                                <Actividades/>
52
-                            </Col>
53
-                        </Row>
54
-                    </div>
55
-                </div>
56
-            </div>
57
-        </section>
58
-    )
13
+  const profile = useSelector((state) => state.user.profile)
14
+
15
+  return (
16
+    <section >
17
+      <div className="content-section">
18
+        <div className="main">
19
+
20
+          <div id="start_title">
21
+            <h1>Bienvenido de nuevo {profile.nombre}</h1>
22
+          </div>
23
+
24
+          <div className="panel_options">
25
+            <Row>
26
+              <Col md="4">
27
+                <Card
28
+                  quantity={120} to='/dashboard/contrasenas' title='CONTRASEÑAS' icon={VerifiedUser} />
29
+              </Col>
30
+              <Col md="4">
31
+                <Card
32
+                  quantity={504} to='/dashboard/expedientes' title='EXPEDIENTES' icon={PersonOutline} />
33
+              </Col>
34
+              <Col md="4">
35
+                <Card
36
+                  quantity={343} to="/dashboard/puestos" title='PUESTOS' icon={ListAlt} />
37
+              </Col>
38
+            </Row>
39
+          </div>
40
+          <div className="historial_candidatos">
41
+            <Row>
42
+              <Col md="8">
43
+                <Candidatos />
44
+              </Col>
45
+              <Col md="4">
46
+                <Actividades />
47
+              </Col>
48
+            </Row>
49
+          </div>
50
+        </div>
51
+      </div>
52
+    </section>
53
+  )
59 54
 
60 55
 }

+ 178 - 180
src/Pages/Login.jsx

@@ -1,11 +1,14 @@
1 1
 import * as React from 'react';
2 2
 import toast, { Toaster } from 'react-hot-toast';
3 3
 import jwt_decode from "jwt-decode";
4
-
5
-import { 
6
-    Paper, Box, Grid, Checkbox, FormControlLabel, Typography,
7
-    TextField, CssBaseline, Button, Avatar,
8
-    Backdrop, CircularProgress,
4
+import { useDispatch, useSelector } from 'react-redux';
5
+import { setToken } from '../Slices/tokenSlice'
6
+import { setRole, setProfile } from '../Slices/userSlice'
7
+
8
+import {
9
+  Paper, Box, Grid, Checkbox, FormControlLabel, Typography,
10
+  TextField, CssBaseline, Button, Avatar,
11
+  Backdrop, CircularProgress,
9 12
 } from '@mui/material'
10 13
 
11 14
 import { createTheme, ThemeProvider } from '@mui/material/styles';
@@ -14,7 +17,6 @@ import PersonIcon from '@mui/icons-material/Person';
14 17
 import { useNavigate } from 'react-router-dom'
15 18
 import { Copyright } from '../Components/Footer.js'
16 19
 import { Link } from 'react-router-dom'
17
-import useAuth from '../Auth/useAuth';
18 20
 
19 21
 import { useFormik } from 'formik';
20 22
 import * as Yup from 'yup';
@@ -22,11 +24,11 @@ import * as Yup from 'yup';
22 24
 import { Service } from '../Utils/HTTP.js'
23 25
 
24 26
 const LoginSchema = Yup.object().shape({
25
-    email : Yup
27
+  email: Yup
26 28
     .string()
27 29
     .email('El correo debe ser válido')
28 30
     .required('El correo o usuario es requerido'),
29
-    password : Yup
31
+  password: Yup
30 32
     .string()
31 33
     .required('El campo contraseña es requerido')
32 34
     .min(5, 'La contraseña debe contener mínimo 5 caracteres')
@@ -36,177 +38,173 @@ const theme = createTheme();
36 38
 
37 39
 export function Login() {
38 40
 
39
-    let auth = useAuth();
40
-    let navigate = useNavigate()
41
-
42
-    const [open, setOpen] = React.useState(false);
43
-    const handleClose = () => false
44
-
45
-    const formik = useFormik({
46
-        initialValues: {
47
-            email: '',
48
-            password: '',
49
-        },
50
-        validationSchema: LoginSchema,
51
-        onSubmit: async (values) => {
52
-
53
-            let { email, password } = values
54
-            setOpen(true)
55
-            let request = new Service(`/user?user=${email}&password=${password}&typeusr=isreclutador`)
56
-            request
57
-            .post({})
58
-            .then( response => {
59
-
60
-                console.log("Service Response :: ", response)
61
-                let { token, nombre, apelidos, empresa } = response;
62
-                toast.success(`Bienvenido ${nombre} ${apelidos}!!`)
63
-                token = token.replace("Bearer ", "")
64
-                console.log(token);
65
-
66
-                let body_token = jwt_decode(token);
67
-                console.log('',body_token)
68
-                // let timestamp = body_token.exp * 1000;
69
-                // let restante = timestamp - Date.now();
70
-
71
-                // setTimeout(() => alert("Token Expirado") , restante )
72
-                auth.setProfile(empresa)
73
-                auth.setRole(body_token)
74
-
75
-                setTimeout( () => {
76
-                    setOpen(false)
77
-                    auth.login(token)
78
-                }, 2000)
79
-
80
-            }) 
81
-            .catch( err => {
82
-                setOpen(false)
83
-                toast.error("Ups! usuario o contraseña incorrectos")
84
-                console.log("ERROR ", err)
85
-            })
86
-
87
-        },
88
-    });
89
-
90
-
91
-    React.useEffect(() => {
92
-        if(auth.isLogged()){
93
-            return navigate('/dashboard/home')
94
-        }
95
-    }, [auth,navigate])
96
-
97
-
98
-    return (
99
-        <ThemeProvider theme={theme}>
100
-            <Grid container component="main" sx={{ height: '100vh' }}>
101
-                <CssBaseline />
102
-                <Grid
103
-                    item
104
-                    xs={false}
105
-                    sm={4}
106
-                    md={7}
107
-                    sx={{
108
-                        backgroundImage: 'url(https://source.unsplash.com/random)',
109
-                        backgroundRepeat: 'no-repeat',
110
-                        backgroundColor: (t) => t.palette.mode === 'light' ? t.palette.grey[50] : t.palette.grey[900],
111
-                        backgroundSize: 'cover',
112
-                        backgroundPosition: 'center',
113
-                    }}
114
-                />
115
-                <Grid item xs={12} sm={8} md={5} component={Paper} elevation={6} square>
116
-
117
-                    <Box
118
-                        sx={{
119
-                            my: 8,
120
-                            mx: 4,
121
-                            display: 'flex',
122
-                            flexDirection: 'column',
123
-                            alignItems: 'center',
124
-                            marginTop : '25%'
125
-                        }}>
126
-                        <Avatar sx={{ m: 1, bgcolor: '#fd4b4b' }}>
127
-                            <PersonIcon />
128
-                        </Avatar>
129
-                        <Typography component="h1" variant="h5">
130
-                            Ingresar
131
-                        </Typography>
132
-
133
-                        <Box component="form" noValidate onSubmit={formik.handleSubmit} sx={{ mt: 1 }}>
134
-                            <TextField
135
-                                value={formik.values.email}
136
-                                onChange={formik.handleChange}
137
-                                error={formik.touched.email && Boolean(formik.errors.email)}
138
-                                helperText={formik.touched.email && formik.errors.email}
139
-                                margin="normal"
140
-                                required
141
-                                fullWidth
142
-                                id="email"
143
-                                name="email"
144
-                                label="Correo Electrónico"
145
-                                autoComplete="email"
146
-                                autoFocus
147
-                            />
148
-                            <TextField
149
-                                value={formik.values.password}
150
-                                onChange={formik.handleChange}
151
-                                error={formik.touched.password && Boolean(formik.errors.password)}
152
-                                helperText={formik.touched.password && formik.errors.password}
153
-                                margin="normal"
154
-                                required
155
-                                fullWidth
156
-                                label="Contraseña"
157
-                                name="password"
158
-                                type="password"
159
-                                id="password"
160
-                                autoComplete="current-password"
161
-                            />
162
-                            <FormControlLabel
163
-                                control={<Checkbox value="remember" sx={{ 
164
-                                    color: '#fd4b4b',
165
-                                    '&.Mui-checked': {
166
-                                        color: '#fd4b4b'
167
-                                    },
168
-                                }}/>}
169
-                                label="Recordarme"
170
-                            />
171
-                            <Button
172
-                                id="login_btn_fn"
173
-                                type="submit"
174
-                                fullWidth
175
-                                variant="contained"
176
-                                sx={{ mt: 3, mb: 2, bgcolor :'var(--main)'  }}
177
-                            >
178
-                                Ingresar
179
-                            </Button>
180
-                            <Grid container>
181
-                                <Grid item xs>
182
-                                    <Link className="login_link" to='/password/recuperar'>
183
-                                        ¿Olvidaste tu contraseña?
184
-                                    </Link>
185
-                                </Grid>
186
-                                <Grid item>
187
-                                    <Link className="login_link" to='/register'>
188
-                                        {"¿No tienes cuenta? Regístrate"}
189
-                                    </Link>
190
-                                </Grid>
191
-                            </Grid>
192
-                            <Copyright sx={{ mt: 5 }} />
193
-                        </Box>
194
-                    </Box>
41
+  const navigate = useNavigate()
42
+  const auth = useSelector((state) => state.token)
43
+  const dispatch = useDispatch();
44
+
45
+
46
+  const [open, setOpen] = React.useState(false);
47
+  const handleClose = () => false
48
+
49
+  const formik = useFormik({
50
+    initialValues: {
51
+      email: '',
52
+      password: '',
53
+    },
54
+    validationSchema: LoginSchema,
55
+    onSubmit: async (values) => {
56
+
57
+      let { email, password } = values
58
+      setOpen(true)
59
+      let request = new Service(`/user?user=${email}&password=${password}&typeusr=isreclutador`)
60
+      request
61
+        .post({})
62
+        .then(response => {
63
+
64
+          let { token, nombre, apelidos, empresa } = response;
65
+          toast.success(`Bienvenido ${nombre} ${apelidos} !!`)
66
+          token = token.replace("Bearer ", "")
67
+          let body_token = jwt_decode(token);
68
+          let timestamp = body_token.exp * 1000;
69
+          let restante = timestamp - Date.now();
70
+
71
+          setTimeout(() => alert("Token Expirado") , restante )
72
+          dispatch(setProfile(empresa))
73
+          dispatch(setRole(body_token))
74
+
75
+          setTimeout(() => {
76
+            setOpen(false)
77
+            dispatch(setToken(token))
78
+            // auth.login(token)
79
+          }, 2000)
80
+
81
+        })
82
+        .catch(err => {
83
+          setOpen(false)
84
+          toast.error("Ups! usuario o contraseña incorrectos")
85
+        })
86
+
87
+    },
88
+  });
89
+  
90
+  React.useEffect(() => {
91
+    if(auth.token){
92
+      navigate('/dashboard/home')
93
+    }
94
+  }, [auth, navigate])
95
+
96
+  return (
97
+    <ThemeProvider theme={theme}>
98
+      <Grid container component="main" sx={{ height: '100vh' }}>
99
+        <CssBaseline />
100
+        <Grid
101
+          item
102
+          xs={false}
103
+          sm={4}
104
+          md={7}
105
+          sx={{
106
+            backgroundImage: 'url(https://source.unsplash.com/random)',
107
+            backgroundRepeat: 'no-repeat',
108
+            backgroundColor: (t) => t.palette.mode === 'light' ? t.palette.grey[50] : t.palette.grey[900],
109
+            backgroundSize: 'cover',
110
+            backgroundPosition: 'center',
111
+          }}
112
+        />
113
+        <Grid item xs={12} sm={8} md={5} component={Paper} elevation={6} square>
114
+
115
+          <Box
116
+            sx={{
117
+              my: 8,
118
+              mx: 4,
119
+              display: 'flex',
120
+              flexDirection: 'column',
121
+              alignItems: 'center',
122
+              marginTop: '25%'
123
+            }}>
124
+            <Avatar sx={{ m: 1, bgcolor: '#fd4b4b' }}>
125
+              <PersonIcon />
126
+            </Avatar>
127
+            <Typography component="h1" variant="h5">
128
+              Ingresar
129
+            </Typography>
130
+
131
+            <Box component="form" noValidate onSubmit={formik.handleSubmit} sx={{ mt: 1 }}>
132
+              <TextField
133
+                value={formik.values.email}
134
+                onChange={formik.handleChange}
135
+                error={formik.touched.email && Boolean(formik.errors.email)}
136
+                helperText={formik.touched.email && formik.errors.email}
137
+                margin="normal"
138
+                required
139
+                fullWidth
140
+                id="email"
141
+                name="email"
142
+                label="Correo Electrónico"
143
+                autoComplete="email"
144
+                autoFocus
145
+              />
146
+              <TextField
147
+                value={formik.values.password}
148
+                onChange={formik.handleChange}
149
+                error={formik.touched.password && Boolean(formik.errors.password)}
150
+                helperText={formik.touched.password && formik.errors.password}
151
+                margin="normal"
152
+                required
153
+                fullWidth
154
+                label="Contraseña"
155
+                name="password"
156
+                type="password"
157
+                id="password"
158
+                autoComplete="current-password"
159
+              />
160
+              <FormControlLabel
161
+                control={<Checkbox value="remember" sx={{
162
+                  color: '#fd4b4b',
163
+                  '&.Mui-checked': {
164
+                    color: '#fd4b4b'
165
+                  },
166
+                }} />}
167
+                label="Recordarme"
168
+              />
169
+              <Button
170
+                id="login_btn_fn"
171
+                type="submit"
172
+                fullWidth
173
+                variant="contained"
174
+                sx={{ mt: 3, mb: 2, bgcolor: 'var(--main)' }}
175
+              >
176
+                Ingresar
177
+              </Button>
178
+              <Grid container>
179
+                <Grid item xs>
180
+                  <Link className="login_link" to='/password/recuperar'>
181
+                    ¿Olvidaste tu contraseña?
182
+                  </Link>
183
+                </Grid>
184
+                <Grid item>
185
+                  <Link className="login_link" to='/register'>
186
+                    {"¿No tienes cuenta? Regístrate"}
187
+                  </Link>
195 188
                 </Grid>
196
-            </Grid>
197
-            <Toaster
198
-                position="top-left"
199
-                reverseOrder={false}
200
-            />
201
-            <Backdrop
202
-                sx={{ color: '#fd4b4b', zIndex: (theme) => theme.zIndex.drawer + 1 }}
203
-                open={open}
204
-                onClick={handleClose}
205
-            >
206
-                <CircularProgress color="inherit" />
207
-            </Backdrop>
208
-
209
-        </ThemeProvider>
210
-
211
-    );
189
+              </Grid>
190
+              <Copyright sx={{ mt: 5 }} />
191
+            </Box>
192
+          </Box>
193
+        </Grid>
194
+      </Grid>
195
+      <Toaster
196
+        position="top-left"
197
+        reverseOrder={false}
198
+      />
199
+      <Backdrop
200
+        sx={{ color: '#fd4b4b', zIndex: (theme) => theme.zIndex.drawer + 1 }}
201
+        open={open}
202
+        onClick={handleClose}
203
+      >
204
+        <CircularProgress color="inherit" />
205
+      </Backdrop>
206
+
207
+    </ThemeProvider>
208
+
209
+  );
212 210
 }