Reac front end for psicometric app

Login.jsx 7.8KB

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