|
import PropTypes from 'prop-types' |
|
import { useSelector, useDispatch } from 'react-redux' |
|
import { useState } from 'react' |
|
import { useNavigate } from 'react-router-dom' |
|
|
|
|
|
import { useTheme } from '@mui/material/styles' |
|
import { Avatar, Box, ButtonBase, Switch } from '@mui/material' |
|
import { styled } from '@mui/material/styles' |
|
|
|
|
|
import LogoSection from '../LogoSection' |
|
import ProfileSection from './ProfileSection' |
|
|
|
|
|
import { IconMenu2 } from '@tabler/icons' |
|
|
|
|
|
import { SET_DARKMODE } from 'store/actions' |
|
|
|
|
|
|
|
const MaterialUISwitch = styled(Switch)(({ theme }) => ({ |
|
width: 62, |
|
height: 34, |
|
padding: 7, |
|
'& .MuiSwitch-switchBase': { |
|
margin: 1, |
|
padding: 0, |
|
transform: 'translateX(6px)', |
|
'&.Mui-checked': { |
|
color: '#fff', |
|
transform: 'translateX(22px)', |
|
'& .MuiSwitch-thumb:before': { |
|
backgroundImage: `url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 20 20"><path fill="${encodeURIComponent( |
|
'#fff' |
|
)}" d="M4.2 2.5l-.7 1.8-1.8.7 1.8.7.7 1.8.6-1.8L6.7 5l-1.9-.7-.6-1.8zm15 8.3a6.7 6.7 0 11-6.6-6.6 5.8 5.8 0 006.6 6.6z"/></svg>')` |
|
}, |
|
'& + .MuiSwitch-track': { |
|
opacity: 1, |
|
backgroundColor: theme.palette.mode === 'dark' ? '#8796A5' : '#aab4be' |
|
} |
|
} |
|
}, |
|
'& .MuiSwitch-thumb': { |
|
backgroundColor: theme.palette.mode === 'dark' ? '#003892' : '#001e3c', |
|
width: 32, |
|
height: 32, |
|
'&:before': { |
|
content: "''", |
|
position: 'absolute', |
|
width: '100%', |
|
height: '100%', |
|
left: 0, |
|
top: 0, |
|
backgroundRepeat: 'no-repeat', |
|
backgroundPosition: 'center', |
|
backgroundImage: `url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 20 20"><path fill="${encodeURIComponent( |
|
'#fff' |
|
)}" d="M9.305 1.667V3.75h1.389V1.667h-1.39zm-4.707 1.95l-.982.982L5.09 6.072l.982-.982-1.473-1.473zm10.802 0L13.927 5.09l.982.982 1.473-1.473-.982-.982zM10 5.139a4.872 4.872 0 00-4.862 4.86A4.872 4.872 0 0010 14.862 4.872 4.872 0 0014.86 10 4.872 4.872 0 0010 5.139zm0 1.389A3.462 3.462 0 0113.471 10a3.462 3.462 0 01-3.473 3.472A3.462 3.462 0 016.527 10 3.462 3.462 0 0110 6.528zM1.665 9.305v1.39h2.083v-1.39H1.666zm14.583 0v1.39h2.084v-1.39h-2.084zM5.09 13.928L3.616 15.4l.982.982 1.473-1.473-.982-.982zm9.82 0l-.982.982 1.473 1.473.982-.982-1.473-1.473zM9.305 16.25v2.083h1.389V16.25h-1.39z"/></svg>')` |
|
} |
|
}, |
|
'& .MuiSwitch-track': { |
|
opacity: 1, |
|
backgroundColor: theme.palette.mode === 'dark' ? '#8796A5' : '#aab4be', |
|
borderRadius: 20 / 2 |
|
} |
|
})) |
|
|
|
const Header = ({ handleLeftDrawerToggle }) => { |
|
const theme = useTheme() |
|
const navigate = useNavigate() |
|
|
|
const customization = useSelector((state) => state.customization) |
|
|
|
const [isDark, setIsDark] = useState(customization.isDarkMode) |
|
const dispatch = useDispatch() |
|
|
|
const changeDarkMode = () => { |
|
dispatch({ type: SET_DARKMODE, isDarkMode: !isDark }) |
|
setIsDark((isDark) => !isDark) |
|
localStorage.setItem('isDarkMode', !isDark) |
|
} |
|
|
|
const signOutClicked = () => { |
|
localStorage.removeItem('username') |
|
localStorage.removeItem('password') |
|
navigate('/', { replace: true }) |
|
navigate(0) |
|
} |
|
|
|
return ( |
|
<> |
|
{/* logo & toggler button */} |
|
<Box |
|
sx={{ |
|
width: 228, |
|
display: 'flex', |
|
[theme.breakpoints.down('md')]: { |
|
width: 'auto' |
|
} |
|
}} |
|
> |
|
<Box component='span' sx={{ display: { xs: 'none', md: 'block' }, flexGrow: 1 }}> |
|
<LogoSection /> |
|
</Box> |
|
<ButtonBase sx={{ borderRadius: '12px', overflow: 'hidden' }}> |
|
<Avatar |
|
variant='rounded' |
|
sx={{ |
|
...theme.typography.commonAvatar, |
|
...theme.typography.mediumAvatar, |
|
transition: 'all .2s ease-in-out', |
|
background: theme.palette.secondary.light, |
|
color: theme.palette.secondary.dark, |
|
'&:hover': { |
|
background: theme.palette.secondary.dark, |
|
color: theme.palette.secondary.light |
|
} |
|
}} |
|
onClick={handleLeftDrawerToggle} |
|
color='inherit' |
|
> |
|
<IconMenu2 stroke={1.5} size='1.3rem' /> |
|
</Avatar> |
|
</ButtonBase> |
|
</Box> |
|
<Box sx={{ flexGrow: 1 }} /> |
|
<MaterialUISwitch checked={isDark} onChange={changeDarkMode} /> |
|
<Box sx={{ ml: 2 }}></Box> |
|
<ProfileSection handleLogout={signOutClicked} username={localStorage.getItem('username') ?? ''} /> |
|
</> |
|
) |
|
} |
|
|
|
Header.propTypes = { |
|
handleLeftDrawerToggle: PropTypes.func |
|
} |
|
|
|
export default Header |
|
|