| | import { useEffect, useRef, useState } from 'react'; |
| |
|
| | |
| | import { useTheme } from '@mui/material/styles'; |
| | import Avatar from '@mui/material/Avatar'; |
| | import Card from '@mui/material/Card'; |
| | import CardContent from '@mui/material/CardContent'; |
| | import Chip from '@mui/material/Chip'; |
| | import ClickAwayListener from '@mui/material/ClickAwayListener'; |
| | import Divider from '@mui/material/Divider'; |
| | import InputAdornment from '@mui/material/InputAdornment'; |
| | import List from '@mui/material/List'; |
| | import ListItemButton from '@mui/material/ListItemButton'; |
| | import ListItemIcon from '@mui/material/ListItemIcon'; |
| | import ListItemText from '@mui/material/ListItemText'; |
| | import OutlinedInput from '@mui/material/OutlinedInput'; |
| | import Paper from '@mui/material/Paper'; |
| | import Popper from '@mui/material/Popper'; |
| | import Stack from '@mui/material/Stack'; |
| | import Switch from '@mui/material/Switch'; |
| | import Typography from '@mui/material/Typography'; |
| | import Box from '@mui/material/Box'; |
| |
|
| | |
| | import UpgradePlanCard from './UpgradePlanCard'; |
| | import MainCard from 'ui-component/cards/MainCard'; |
| | import Transitions from 'ui-component/extended/Transitions'; |
| | import useConfig from 'hooks/useConfig'; |
| |
|
| | |
| | import User1 from 'assets/images/users/user-round.svg'; |
| | import { IconLogout, IconSearch, IconSettings, IconUser } from '@tabler/icons-react'; |
| |
|
| | |
| |
|
| | export default function ProfileSection() { |
| | const theme = useTheme(); |
| | const { |
| | state: { borderRadius } |
| | } = useConfig(); |
| |
|
| | const [sdm, setSdm] = useState(true); |
| | const [value, setValue] = useState(''); |
| | const [notification, setNotification] = useState(false); |
| | const [open, setOpen] = useState(false); |
| |
|
| | |
| | |
| | |
| | const anchorRef = useRef(null); |
| |
|
| | const handleToggle = () => { |
| | setOpen((prevOpen) => !prevOpen); |
| | }; |
| |
|
| | const handleClose = (event) => { |
| | if (anchorRef.current && anchorRef.current.contains(event.target)) { |
| | return; |
| | } |
| |
|
| | setOpen(false); |
| | }; |
| |
|
| | const prevOpen = useRef(open); |
| | useEffect(() => { |
| | if (prevOpen.current === true && open === false) { |
| | anchorRef.current.focus(); |
| | } |
| |
|
| | prevOpen.current = open; |
| | }, [open]); |
| |
|
| | return ( |
| | <> |
| | <Chip |
| | slotProps={{ label: { sx: { lineHeight: 0 } } }} |
| | sx={{ ml: 2, height: '48px', alignItems: 'center', borderRadius: '27px' }} |
| | icon={ |
| | <Avatar |
| | src={User1} |
| | alt="user-images" |
| | sx={{ typography: 'mediumAvatar', margin: '8px 0 8px 8px !important', cursor: 'pointer' }} |
| | ref={anchorRef} |
| | aria-controls={open ? 'menu-list-grow' : undefined} |
| | aria-haspopup="true" |
| | color="inherit" |
| | /> |
| | } |
| | label={<IconSettings stroke={1.5} size="24px" />} |
| | ref={anchorRef} |
| | aria-controls={open ? 'menu-list-grow' : undefined} |
| | aria-haspopup="true" |
| | onClick={handleToggle} |
| | color="primary" |
| | aria-label="user-account" |
| | /> |
| | <Popper |
| | placement="bottom" |
| | open={open} |
| | anchorEl={anchorRef.current} |
| | role={undefined} |
| | transition |
| | disablePortal |
| | modifiers={[ |
| | { |
| | name: 'offset', |
| | options: { |
| | offset: [0, 14] |
| | } |
| | } |
| | ]} |
| | > |
| | {({ TransitionProps }) => ( |
| | <ClickAwayListener onClickAway={handleClose}> |
| | <Transitions in={open} {...TransitionProps}> |
| | <Paper> |
| | {open && ( |
| | <MainCard border={false} elevation={16} content={false} boxShadow shadow={theme.shadows[16]}> |
| | <Box sx={{ p: 2, pb: 0 }}> |
| | <Stack> |
| | <Stack direction="row" sx={{ alignItems: 'center', gap: 0.5 }}> |
| | <Typography variant="h4">Good Morning,</Typography> |
| | <Typography component="span" variant="h4" sx={{ fontWeight: 400 }}> |
| | Johne Doe |
| | </Typography> |
| | </Stack> |
| | <Typography variant="subtitle2">Project Admin</Typography> |
| | </Stack> |
| | <OutlinedInput |
| | sx={{ width: '100%', pr: 1, pl: 2, my: 2 }} |
| | id="input-search-profile" |
| | value={value} |
| | onChange={(e) => setValue(e.target.value)} |
| | placeholder="Search profile options" |
| | startAdornment={ |
| | <InputAdornment position="start"> |
| | <IconSearch stroke={1.5} size="16px" /> |
| | </InputAdornment> |
| | } |
| | aria-describedby="search-helper-text" |
| | slotProps={{ input: { 'aria-label': 'weight' } }} |
| | /> |
| | <Divider /> |
| | </Box> |
| | <Box |
| | sx={{ |
| | p: 2, |
| | py: 0, |
| | height: '100%', |
| | maxHeight: 'calc(100vh - 250px)', |
| | overflowX: 'hidden', |
| | '&::-webkit-scrollbar': { width: 5 } |
| | }} |
| | > |
| | <UpgradePlanCard /> |
| | <Divider /> |
| | <Card sx={{ bgcolor: 'primary.light', my: 2 }}> |
| | <CardContent> |
| | <Stack sx={{ gap: 3 }}> |
| | <Stack direction="row" sx={{ alignItems: 'center', justifyContent: 'space-between' }}> |
| | <Typography variant="subtitle1">Start DND Mode</Typography> |
| | <Switch color="primary" checked={sdm} onChange={(e) => setSdm(e.target.checked)} name="sdm" size="small" /> |
| | </Stack> |
| | <Stack direction="row" sx={{ alignItems: 'center', justifyContent: 'space-between' }}> |
| | <Typography variant="subtitle1">Allow Notifications</Typography> |
| | <Switch checked={notification} onChange={(e) => setNotification(e.target.checked)} name="sdm" size="small" /> |
| | </Stack> |
| | </Stack> |
| | </CardContent> |
| | </Card> |
| | <Divider /> |
| | <List |
| | component="nav" |
| | sx={{ |
| | width: '100%', |
| | maxWidth: 350, |
| | minWidth: 300, |
| | borderRadius: `${borderRadius}px`, |
| | '& .MuiListItemButton-root': { mt: 0.5 } |
| | }} |
| | > |
| | <ListItemButton sx={{ borderRadius: `${borderRadius}px` }}> |
| | <ListItemIcon> |
| | <IconSettings stroke={1.5} size="20px" /> |
| | </ListItemIcon> |
| | <ListItemText primary={<Typography variant="body2">Account Settings</Typography>} /> |
| | </ListItemButton> |
| | <ListItemButton sx={{ borderRadius: `${borderRadius}px` }}> |
| | <ListItemIcon> |
| | <IconUser stroke={1.5} size="20px" /> |
| | </ListItemIcon> |
| | <ListItemText |
| | primary={ |
| | <Stack direction="row" sx={{ alignItems: 'center', justifyContent: 'space-between' }}> |
| | <Typography variant="body2">Social Profile</Typography> |
| | <Chip |
| | slotProps={{ |
| | label: { sx: { mt: 0.25 } } |
| | }} |
| | label="02" |
| | variant="filled" |
| | size="small" |
| | color="warning" |
| | /> |
| | </Stack> |
| | } |
| | /> |
| | </ListItemButton> |
| | <ListItemButton sx={{ borderRadius: `${borderRadius}px` }}> |
| | <ListItemIcon> |
| | <IconLogout stroke={1.5} size="20px" /> |
| | </ListItemIcon> |
| | <ListItemText primary={<Typography variant="body2">Logout</Typography>} /> |
| | </ListItemButton> |
| | </List> |
| | </Box> |
| | </MainCard> |
| | )} |
| | </Paper> |
| | </Transitions> |
| | </ClickAwayListener> |
| | )} |
| | </Popper> |
| | </> |
| | ); |
| | } |
| |
|