Reac front end for psicometric app

User.jsx 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import React from 'react';
  2. import { ThemeProvider, styled, createTheme } from '@mui/material/styles';
  3. import '../Css/user.css'
  4. import { removeToken } from '../Slices/tokenSlice'
  5. import { useDispatch, useSelector } from 'react-redux'
  6. import {
  7. Container, IconButton, Divider,
  8. Typography, List, Toolbar, useMediaQuery as Size,
  9. Box, Badge, Menu, Avatar, MenuItem
  10. } from '@mui/material'
  11. import {
  12. Fullscreen as FullscreenIcon,
  13. Menu as MenuIcon,
  14. KeyboardDoubleArrowLeft as LeftKey,
  15. Notifications as NotificationsIcon,
  16. } from '@mui/icons-material'
  17. import { stringAvatar } from '../Utils/avatar'
  18. import Logo from '../Images/evaluacion.jpeg';
  19. import { Outlet, useNavigate } from "react-router-dom";
  20. import { MenuMovil } from '../Components/Navigation/MenuMovil';
  21. import Footer from "../Components/Footer";
  22. import { Drawer as MuiDrawer, AppBar as MuiAppBar } from "../Components/Navigation/AppBar"
  23. import { UserListItems, SecondaryListItems } from '../Components/Navigation/listItems';
  24. import jwtDecode from 'jwt-decode';
  25. // import ProfilePicture from '../Images/man.png';
  26. const drawerWidth = 240;
  27. const mdTheme = createTheme();
  28. const AppBar = styled(MuiAppBar, {
  29. shouldForwardProp: (prop) => prop !== 'open',
  30. })(({ theme, open }) => ({
  31. zIndex: theme.zIndex.drawer + 1,
  32. transition: theme.transitions.create(['width', 'margin'], {
  33. easing: theme.transitions.easing.sharp,
  34. duration: theme.transitions.duration.leavingScreen,
  35. }),
  36. ...(open && {
  37. marginLeft: drawerWidth,
  38. width: `calc(100% - ${drawerWidth}px)`,
  39. transition: theme.transitions.create(['width', 'margin'], {
  40. easing: theme.transitions.easing.sharp,
  41. duration: theme.transitions.duration.enteringScreen,
  42. }),
  43. }),
  44. }));
  45. const Drawer = styled(MuiDrawer,
  46. { shouldForwardProp: (prop) => prop !== 'open' })(
  47. ({ theme, open }) => ({
  48. '& .MuiDrawer-paper': {
  49. position: 'relative',
  50. whiteSpace: 'nowrap',
  51. width: drawerWidth,
  52. transition: theme.transitions.create('width', {
  53. easing: theme.transitions.easing.sharp,
  54. duration: theme.transitions.duration.enteringScreen,
  55. }),
  56. boxSizing: 'border-box',
  57. ...(!open && {
  58. overflowX: 'hidden',
  59. transition: theme.transitions.create('width', {
  60. easing: theme.transitions.easing.sharp,
  61. duration: theme.transitions.duration.leavingScreen,
  62. }),
  63. width: theme.spacing(7),
  64. [theme.breakpoints.up('sm')]: {
  65. width: theme.spacing(9),
  66. },
  67. }),
  68. },
  69. }),
  70. );
  71. export function User() {
  72. const [open, setOpen] = React.useState(true);
  73. const isMovil = Size('(max-width:1000px)');
  74. const navigate = useNavigate()
  75. let dispatch = useDispatch()
  76. let profile = useSelector((state) => state.user.profile)
  77. const auth = useSelector((state) => state.token.candi)
  78. let name = profile ? `${(profile?.email?.substring(0, 1))} ${profile?.email?.substring(1, 2)}` : ""
  79. const CerrarSession = () => {
  80. dispatch(removeToken({ candi: true }))
  81. navigate('/logincd')
  82. }
  83. const [anchorEl, setAnchorEl] = React.useState(null);
  84. const open_profile = Boolean(anchorEl);
  85. const handleClick = (event) => setAnchorEl(event.currentTarget);
  86. const handleClose = () => setAnchorEl(null)
  87. const toggleDrawer = () => {
  88. if (isMovil) {
  89. setAnchorElMov(!anchorElMovil)
  90. } else {
  91. setOpen(!open);
  92. }
  93. }
  94. const [anchorElMovil, setAnchorElMov] = React.useState(false);
  95. React.useEffect(() => {
  96. const { exp } = jwtDecode(auth.token)
  97. let timestamp = exp * 1000;
  98. let exp_in = timestamp - Date.now();
  99. console.log("EXP IN : ", exp_in)
  100. if(exp_in <= 0 ){
  101. alert("TOKEN EXPIRADO, PORFAVOR INICIA SESSION")
  102. dispatch(removeToken({ candi: true}))
  103. }
  104. setTimeout(() => {
  105. alert("TOKEN EXPIRADO, PORFAVOR INICIA SESSION")
  106. }, exp_in)
  107. if(isMovil){
  108. setOpen(false)
  109. }
  110. }, [isMovil, auth, dispatch])
  111. return (
  112. <ThemeProvider theme={mdTheme}>
  113. <MenuMovil anchor={anchorElMovil} control={setAnchorElMov} />
  114. <Box sx={{ display: 'flex' }}>
  115. <AppBar style={{ backgroundColor: '#fff', boxShadow: 'None' }} position="absolute" open={open}>
  116. <Toolbar sx={{ pr: '24px', borderBottom: "1px solid var(--main)" }} >
  117. <IconButton
  118. name="navigation_icon_button"
  119. edge="start"
  120. color="inherit"
  121. aria-label="open drawer"
  122. onClick={toggleDrawer}
  123. sx={{ marginRight: '36px', ...(open && { display: 'none' }), }} >
  124. <MenuIcon style={{
  125. background: 'var(--main)',
  126. fontSize: "40",
  127. color: "#fff"
  128. }} />
  129. </IconButton>
  130. <Typography component="h1" variant="h6" color="inherit" noWrap sx={{ flexGrow: 1 }} >
  131. {
  132. open ? (
  133. <React.Fragment>
  134. <IconButton onClick={toggleDrawer}>
  135. <LeftKey />
  136. </IconButton>
  137. <IconButton onClick={(event) => event.target.requestFullscreen()}>
  138. <FullscreenIcon style={{ paddinLeft: 15 }} />
  139. </IconButton>
  140. </React.Fragment>
  141. ) : undefined
  142. }
  143. </Typography>
  144. <Box sx={{ display: { xs: 'none', md: 'flex' } }}>
  145. <IconButton
  146. size="large"
  147. aria-label="show 17 new notifications"
  148. color="inherit">
  149. <Badge badgeContent={1} color="error">
  150. <NotificationsIcon style={{ color: '#212529' }} />
  151. </Badge>
  152. </IconButton>
  153. <IconButton
  154. size="small"
  155. edge="end"
  156. aria-label="account of current user"
  157. aria-haspopup="true"
  158. aria-expanded={open_profile ? 'true' : undefined}
  159. onClick={handleClick}
  160. color="inherit"
  161. >
  162. <Avatar {...stringAvatar(name)} />
  163. </IconButton>
  164. <Menu
  165. id="basic-menu"
  166. anchorEl={anchorEl}
  167. open={open_profile}
  168. onClose={handleClose}
  169. MenuListProps={{ 'aria-labelledby': 'basic-button', }}>
  170. <MenuItem onClick={() => navigate('dashboard/perfil')}>Profile</MenuItem>
  171. <MenuItem onClick={() => console.log('opcion 2')}>My account</MenuItem>
  172. <MenuItem onClick={CerrarSession}>Logout</MenuItem>
  173. </Menu>
  174. </Box>
  175. </Toolbar>
  176. </AppBar>
  177. <Drawer variant="permanent" open={open} >
  178. <Toolbar
  179. sx={{
  180. display: 'flex',
  181. alignItems: 'center',
  182. justifyContent: 'flex-start',
  183. px: [1]
  184. }} >
  185. <div style={{ flat: 'righ' }} className="sidebar-header">
  186. <div className="width_img">
  187. <img src={Logo} alt="pruebas psicometricas" />
  188. </div>
  189. </div>
  190. </Toolbar>
  191. <Divider />
  192. <List>
  193. <UserListItems AppBarVisible={open} setAppBarVisible={setOpen} />
  194. </List>
  195. <Divider />
  196. <List>
  197. {SecondaryListItems}
  198. </List>
  199. </Drawer>
  200. <Container maxWidth="lg" sx={{ mt: 2, mb: 2 }}>
  201. <Outlet />
  202. <Footer />
  203. </Container>
  204. </Box>
  205. </ThemeProvider>
  206. );
  207. }