mirror of
				https://github.com/D4M13N-D3V/comissions-app-ui.git
				synced 2025-10-31 17:45:21 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			143 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| // ** React Imports
 | |
| import { useState, SyntheticEvent, Fragment, useEffect } from 'react'
 | |
| 
 | |
| // ** Next Import
 | |
| import { useRouter } from 'next/router'
 | |
| 
 | |
| // ** MUI Imports
 | |
| import Box from '@mui/material/Box'
 | |
| import Menu from '@mui/material/Menu'
 | |
| import Badge from '@mui/material/Badge'
 | |
| import Avatar from '@mui/material/Avatar'
 | |
| import Divider from '@mui/material/Divider'
 | |
| import MenuItem from '@mui/material/MenuItem'
 | |
| import { styled } from '@mui/material/styles'
 | |
| import Typography from '@mui/material/Typography'
 | |
| 
 | |
| // ** Icons Imports
 | |
| import CogOutline from 'mdi-material-ui/CogOutline'
 | |
| import CurrencyUsd from 'mdi-material-ui/CurrencyUsd'
 | |
| import EmailOutline from 'mdi-material-ui/EmailOutline'
 | |
| import LogoutVariant from 'mdi-material-ui/LogoutVariant'
 | |
| import AccountOutline from 'mdi-material-ui/AccountOutline'
 | |
| import MessageOutline from 'mdi-material-ui/MessageOutline'
 | |
| import HelpCircleOutline from 'mdi-material-ui/HelpCircleOutline'
 | |
| 
 | |
| import { useUser } from '@auth0/nextjs-auth0/client'
 | |
| 
 | |
| // ** Styled Components
 | |
| const BadgeContentSpan = styled('span')(({ theme }) => ({
 | |
|   width: 8,
 | |
|   height: 8,
 | |
|   borderRadius: '50%',
 | |
|   backgroundColor: theme.palette.success.main,
 | |
|   boxShadow: `0 0 0 2px ${theme.palette.background.paper}`
 | |
| }))
 | |
| 
 | |
| const UserDropdown = () => {
 | |
|   const { user, isLoading } = useUser();
 | |
| 
 | |
|   const [appUser, setAppUser] = useState(null);
 | |
| 
 | |
|   useEffect(() => {
 | |
|     getData()
 | |
|   }, []);
 | |
| 
 | |
|   const getData = async () => { 
 | |
|     var userResponse = await fetch('/api/me');
 | |
|     var user = await userResponse.json();
 | |
|     setAppUser(user); 
 | |
|   }
 | |
|   // ** States
 | |
|   const [anchorEl, setAnchorEl] = useState<Element | null>(null)
 | |
| 
 | |
|   // ** Hooks
 | |
|   const router = useRouter()
 | |
| 
 | |
|   const handleDropdownOpen = (event: SyntheticEvent) => {
 | |
|     setAnchorEl(event.currentTarget)
 | |
|   }
 | |
| 
 | |
|   const handleDropdownClose = (url?: string) => {
 | |
|     if (url) {
 | |
|       router.push(url)
 | |
|     }
 | |
|     setAnchorEl(null)
 | |
|   }
 | |
| 
 | |
|   const styles = {
 | |
|     py: 2,
 | |
|     px: 4,
 | |
|     width: '100%',
 | |
|     display: 'flex',
 | |
|     alignItems: 'center',
 | |
|     color: 'text.primary',
 | |
|     textDecoration: 'none',
 | |
|     '& svg': {
 | |
|       fontSize: '1.375rem',
 | |
|       color: 'text.secondary'
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return (
 | |
|     (!isLoading && user && appUser) ? (
 | |
|       <Fragment>
 | |
|         <Badge
 | |
|           overlap='circular'
 | |
|           onClick={handleDropdownOpen}
 | |
|           sx={{ ml: 2, cursor: 'pointer' }}
 | |
|           badgeContent={<BadgeContentSpan />}
 | |
|           anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
 | |
|         >
 | |
|           <Avatar
 | |
|             alt={user.nickname}
 | |
|             onClick={handleDropdownOpen}
 | |
|             sx={{ width: 40, height: 40 }}
 | |
|             src={user.picture}
 | |
|           />
 | |
|         </Badge>
 | |
|         <Menu
 | |
|           anchorEl={anchorEl}
 | |
|           open={Boolean(anchorEl)}
 | |
|           onClose={() => handleDropdownClose()}
 | |
|           sx={{ '& .MuiMenu-paper': { width: 230, marginTop: 4 } }}
 | |
|           anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
 | |
|           transformOrigin={{ vertical: 'top', horizontal: 'right' }}
 | |
|         >
 | |
|           <Box sx={{ pt: 2, pb: 3, px: 4 }}>
 | |
|             <Box sx={{ display: 'flex', alignItems: 'center' }}>
 | |
|               <Badge
 | |
|                 overlap='circular'
 | |
|                 badgeContent={<BadgeContentSpan />}
 | |
|                 anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
 | |
|               >
 | |
|                 <Avatar alt={appUser["displayName"]} src={user.picture} sx={{ width: '2.5rem', height: '2.5rem' }} />
 | |
|               </Badge>
 | |
|               <Box sx={{ display: 'flex', marginLeft: 3, alignItems: 'flex-start', flexDirection: 'column' }}>
 | |
|                 <Typography sx={{ fontWeight: 600 }}>{appUser["displayName"]}</Typography>
 | |
|                 <Typography variant='body2' sx={{ fontSize: '0.8rem', color: 'text.disabled' }}>
 | |
|                   Welcome back!
 | |
|                 </Typography>
 | |
|               </Box>
 | |
|             </Box>
 | |
|           </Box>
 | |
|           <Divider sx={{ mt: 0, mb: 1 }} />
 | |
|           <MenuItem sx={{ p: 0 }} onClick={() => router.push("/dashboard/settings")}>
 | |
|             <Box sx={styles}>
 | |
|               <CogOutline sx={{ marginRight: 2 }} />
 | |
|               Settings
 | |
|             </Box>
 | |
|           </MenuItem>
 | |
|           <Divider />
 | |
|           <MenuItem sx={{ py: 2 }} onClick={() => handleDropdownClose('/api/auth/logout')}>
 | |
|             <LogoutVariant sx={{ marginRight: 2, fontSize: '1.375rem', color: 'text.secondary' }} />
 | |
|             Logout
 | |
|           </MenuItem>
 | |
|         </Menu>
 | |
|       </Fragment>
 | |
|     ): null
 | |
|   )
 | |
| }
 | |
| 
 | |
| export default UserDropdown
 | 
