Reac front end for psicometric app

Dashboard.js 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. import React, { useEffect, useState, useRef } from 'react';
  2. import { styled, createTheme, ThemeProvider } from '@mui/material/styles';
  3. import CssBaseline from '@mui/material/CssBaseline';
  4. import MuiDrawer from '@mui/material/Drawer';
  5. import Box from '@mui/material/Box';
  6. import MuiAppBar from '@mui/material/AppBar';
  7. import Toolbar from '@mui/material/Toolbar';
  8. import List from '@mui/material/List';
  9. import Typography from '@mui/material/Typography';
  10. import Divider from '@mui/material/Divider';
  11. import IconButton from '@mui/material/IconButton';
  12. import Badge from '@mui/material/Badge';
  13. import Container from '@mui/material/Container';
  14. import Avatar from '@mui/material/Avatar';
  15. import MenuIcon from '@mui/icons-material/Menu';
  16. import FullscreenIcon from '@mui/icons-material/Fullscreen';
  17. import NotificationsIcon from '@mui/icons-material/Notifications';
  18. import { MainListItems, secondaryListItems } from './listItems';
  19. import Menu from '@mui/material/Menu';
  20. import MenuItem from '@mui/material/MenuItem';
  21. import MailIcon from '@mui/icons-material/Mail';
  22. import Logo from '../Images/logo.png';
  23. import ProfilePicture from '../Images/man.png';
  24. import useAuth from '../Auth/useAuth';
  25. import { Outlet, useNavigate} from "react-router-dom";
  26. import Footer from "../Components/Footer";
  27. const drawerWidth = 240;
  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 useCheckMobileScreen = () => {
  46. const [width, setWidth] = useState(window.innerWidth);
  47. const handleWindowSizeChange = () => {
  48. let size = window.innerWidth;
  49. setWidth(size);
  50. }
  51. useEffect(() => {
  52. window.addEventListener('resize', handleWindowSizeChange);
  53. return () => {
  54. window.removeEventListener('resize', handleWindowSizeChange);
  55. }
  56. }, []);
  57. let isMobile = width <= 1000
  58. return (isMobile);
  59. }
  60. const Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open' })(
  61. ({ theme, open }) => ({
  62. '& .MuiDrawer-paper': {
  63. position: 'relative',
  64. whiteSpace: 'nowrap',
  65. width: drawerWidth,
  66. transition: theme.transitions.create('width', {
  67. easing: theme.transitions.easing.sharp,
  68. duration: theme.transitions.duration.enteringScreen,
  69. }),
  70. boxSizing: 'border-box',
  71. ...(!open && {
  72. overflowX: 'hidden',
  73. transition: theme.transitions.create('width', {
  74. easing: theme.transitions.easing.sharp,
  75. duration: theme.transitions.duration.leavingScreen,
  76. }),
  77. width: theme.spacing(7),
  78. [theme.breakpoints.up('sm')]: {
  79. width: theme.spacing(9),
  80. },
  81. }),
  82. },
  83. }),
  84. );
  85. const mdTheme = createTheme();
  86. function DashboardContent() {
  87. const [open, setOpen] = React.useState(false);
  88. const elRef = useRef();
  89. const toggleDrawer = () => setOpen(!open);
  90. const auth = useAuth();
  91. const navigate = useNavigate()
  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 [anchorElMovil, setAnchorElMov] = React.useState(null);
  97. const openMov = Boolean(anchorElMovil);
  98. const handleCloseMov = () => {
  99. setAnchorElMov(null);
  100. };
  101. const MenuResponsive = () => {
  102. setAnchorElMov(elRef.current);
  103. }
  104. const CerrarSession = () => {
  105. console.log('cerrando session')
  106. auth.logout();
  107. navigate('/')
  108. }
  109. return (
  110. <ThemeProvider theme={mdTheme}>
  111. <Box sx={{ display: 'flex' }}>
  112. <CssBaseline />
  113. <AppBar style={{ backgroundColor : '#fff', boxShadow : 'None' }} position="absolute" open={useCheckMobileScreen() ? false : open}>
  114. <Toolbar sx={{ pr: '24px' , borderBottom : "1px solid #ec5e69"}} >
  115. <div ref={elRef}>
  116. <IconButton
  117. edge="start"
  118. color="inherit"
  119. aria-label="open drawer"
  120. onClick={ useCheckMobileScreen() ? MenuResponsive : toggleDrawer }
  121. sx={{ marginRight: '36px', ...( !useCheckMobileScreen() && open && { display: 'none' }), }} >
  122. <MenuIcon style={{
  123. background: '#ec5e69',
  124. fontSize: "40",
  125. color: "#fff"
  126. }}/>
  127. </IconButton>
  128. <Menu
  129. id="basic-menu"
  130. anchorEl={anchorElMovil}
  131. open={openMov}
  132. onClose={handleCloseMov}
  133. MenuListProps={{
  134. 'aria-labelledby': 'basic-button',
  135. }}>
  136. <MenuItem onClick={ () => navigate('/perfil') }>Perfil</MenuItem>
  137. <MenuItem onClick={handleCloseMov}>My account</MenuItem>
  138. <MenuItem onClick={handleCloseMov}>Logout</MenuItem>
  139. </Menu>
  140. </div>
  141. <Typography component="h1" variant="h6" color="inherit" noWrap sx={{ flexGrow: 1 }} >
  142. {
  143. !useCheckMobileScreen() && open ? (
  144. <React.Fragment>
  145. <IconButton onClick={toggleDrawer}>
  146. <MenuIcon />
  147. </IconButton>
  148. <IconButton onClick={ (event) => event.target.requestFullscreen() }>
  149. <FullscreenIcon style={{ paddinLeft : 15 }}/>
  150. </IconButton>
  151. </React.Fragment>
  152. ) : undefined
  153. }
  154. </Typography>
  155. <Box sx={{ display: { xs: 'none', md: 'flex' } }}>
  156. <IconButton size="large" aria-label="show 4 new mails" color="inherit">
  157. <Badge badgeContent={4} color="error">
  158. <MailIcon style={{ color : '#212529' }} />
  159. </Badge>
  160. </IconButton>
  161. <IconButton
  162. size="large"
  163. aria-label="show 17 new notifications"
  164. color="inherit">
  165. <Badge badgeContent={17} color="error">
  166. <NotificationsIcon style={{ color : '#212529' }}/>
  167. </Badge>
  168. </IconButton>
  169. <IconButton
  170. size="small"
  171. edge="end"
  172. aria-label="account of current user"
  173. aria-haspopup="true"
  174. aria-expanded={open_profile ? 'true' : undefined}
  175. onClick={handleClick}
  176. color="inherit"
  177. >
  178. <Avatar alt="Cindy Baker" src={ProfilePicture} />
  179. </IconButton>
  180. <Menu
  181. id="basic-menu"
  182. anchorEl={anchorEl}
  183. open={open_profile}
  184. onClose={handleClose}
  185. MenuListProps={{ 'aria-labelledby': 'basic-button', }}>
  186. <MenuItem onClick={() => navigate('perfil') }>Profile</MenuItem>
  187. <MenuItem onClick={() => console.log('opcion 2')}>My account</MenuItem>
  188. <MenuItem onClick={CerrarSession}>Logout</MenuItem>
  189. </Menu>
  190. </Box>
  191. </Toolbar>
  192. </AppBar>
  193. <Drawer variant="permanent" open={open}>
  194. <Toolbar
  195. sx={{
  196. display: 'flex',
  197. alignItems: 'center',
  198. justifyContent: 'flex-start',
  199. px: [1],
  200. }} >
  201. <div style={{ flat : 'righ' }} className="sidebar-header">
  202. <div className="width_img">
  203. <img src={Logo} alt="pruebas psicometricas"/>
  204. </div>
  205. </div>
  206. </Toolbar>
  207. <Divider />
  208. <List>
  209. <MainListItems
  210. AppBarVisible={open}
  211. setAppBarVisible={setOpen}
  212. />
  213. </List>
  214. <Divider />
  215. <List>
  216. {secondaryListItems}
  217. </List>
  218. </Drawer>
  219. {/* <Box component="main" sx={{ backgroundColor: (theme) => theme.palette.mode === 'light' ? theme.palette.grey[100] : theme.palette.grey[900], flexGrow: 1, height: '100vh', overflow: 'auto', }} > */}
  220. <Toolbar />
  221. <Container maxWidth="lg" sx={{ mt: 2 , mb: 2 }}>
  222. <Outlet/>
  223. <Footer/>
  224. </Container>
  225. {/* </Box> */}
  226. </Box>
  227. </ThemeProvider>
  228. );
  229. }
  230. export function Dashboard() {
  231. return <DashboardContent />;
  232. }