react-garden
Version:
React + TypeScript + ThreeJS app using Material UI on NextJS, Apollo Client, GraphQL + WordPress REST APIs, for ThreeD web development.. a part of the threed.ai code family.
154 lines (138 loc) • 4.47 kB
JavaScript
// ** Next Import
import Link from 'next/link'
import Image from 'next/future/image'
// ** MUI Imports
import { styled, useTheme } from '@mui/material/styles'
import IconButton from '@mui/material/IconButton'
import Box from '@mui/material/Box'
import Typography from '@mui/material/Typography'
// ** Icons
import Close from 'mdi-material-ui/Close'
import CircleOutline from 'mdi-material-ui/Menu'
import RecordCircleOutline from 'mdi-material-ui/MenuOpen'
// ** Configs
import themeConfig from '~/configs/themeConfig'
// images
import favicon from "~/assets/images/logos/favicon.png"
import appleIcon from "~/assets/images/logos/apple-icon.png"
import brandLight from "~/assets/images/logos/logo-threedgarden.png"
import brandDark from "~/assets/images/logos/logo-threedgarden-alt.png"
import brandText from "~/assets/images/logos/logo-threedgarden-text.png"
// ** Styled Components
const MenuHeaderWrapper = styled(Box)(({ theme }) => ({
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
paddingRight: theme.spacing(4.5),
transition: 'padding .25s ease-in-out',
minHeight: theme.mixins.toolbar.minHeight
}))
const HeaderTitle = styled(Typography)(({ theme }) => ({
fontWeight: 600,
lineHeight: 'normal',
textTransform: 'uppercase',
color: theme.palette.text.primary,
transition: 'opacity .25s ease-in-out, margin .25s ease-in-out'
}))
const StyledLink = styled('a')({
display: 'flex',
alignItems: 'center',
textDecoration: 'none'
})
const VerticalNavHeader = props => {
// ** Props
const {
hidden,
navHover,
settings,
saveSettings,
collapsedNavWidth,
toggleNavVisibility,
navigationBorderWidth,
menuLockedIcon: userMenuLockedIcon,
menuUnlockedIcon: userMenuUnlockedIcon,
verticalNavMenuBranding: userVerticalNavMenuBranding
} = props
// ** Hooks & Vars
const theme = useTheme()
const { navCollapsed } = settings
const menuCollapsedStyles = navCollapsed && !navHover ? { opacity: 0 } : { opacity: 1 }
const menuHeaderPaddingLeft = () => {
if (navCollapsed && !navHover) {
if (userVerticalNavMenuBranding) {
return 0
} else {
return (collapsedNavWidth - navigationBorderWidth - 30) / 14
}
} else {
return (collapsedNavWidth - navigationBorderWidth - 30) / 14
// return 6
}
}
const MenuLockedIcon = () =>
userMenuLockedIcon || (
<RecordCircleOutline
sx={{
mr: '0.95rem',
fontSize: '1.25rem',
pointerEvents: 'none',
...menuCollapsedStyles,
transition: 'opacity .25s ease-in-out'
}}
/>
)
const MenuUnlockedIcon = () =>
userMenuUnlockedIcon || (
<CircleOutline
sx={{
mr: '1rem',
fontSize: '1.25rem',
pointerEvents: 'none',
...menuCollapsedStyles,
transition: 'opacity .25s ease-in-out'
}}
/>
)
return (
<MenuHeaderWrapper className='nav-header' sx={{ pl: menuHeaderPaddingLeft() }}>
{userVerticalNavMenuBranding ? (
userVerticalNavMenuBranding(props)
) : (
<Link href='/' passHref>
<StyledLink>
<Image
src={brandDark.src}
alt={themeConfig.templateName}
width={48}
height={48}
layout='raw'
/>
<HeaderTitle variant='h6' sx={{ ...menuCollapsedStyles, ...(navCollapsed && !navHover ? {} : { ml: 3 }) }}>
{themeConfig.templateName}
</HeaderTitle>
</StyledLink>
</Link>
)}
{hidden ? (
<IconButton
disableRipple
disableFocusRipple
onClick={toggleNavVisibility}
sx={{ p: 0, backgroundColor: 'transparent !important' }}
>
<Close fontSize='small' />
</IconButton>
) : (
<IconButton
disableRipple
disableFocusRipple
onClick={() => saveSettings({ ...settings, navCollapsed: !navCollapsed })}
sx={{ p: 0, color: 'text.primary', backgroundColor: 'transparent !important' }}
>
{navCollapsed ? MenuUnlockedIcon() : MenuLockedIcon()}
</IconButton>
)}
</MenuHeaderWrapper>
)
}
export default VerticalNavHeader