mirror of
https://github.com/D4M13N-D3V/comissions-app-ui.git
synced 2025-03-14 08:15:08 +00:00
154 lines
4.5 KiB
TypeScript
154 lines
4.5 KiB
TypeScript
// ** React Import
|
|
import { ReactNode, useRef, useState } from 'react'
|
|
|
|
// ** MUI Import
|
|
import List from '@mui/material/List'
|
|
import Box, { BoxProps } from '@mui/material/Box'
|
|
import { styled, useTheme } from '@mui/material/styles'
|
|
|
|
// ** Third Party Components
|
|
import PerfectScrollbar from 'react-perfect-scrollbar'
|
|
|
|
// ** Type Import
|
|
import { Settings } from '../../../../../core/context/settingsContext'
|
|
import { VerticalNavItemsType } from '../../../../../core/layouts/types'
|
|
|
|
// ** Component Imports
|
|
import Drawer from './Drawer'
|
|
import VerticalNavItems from './VerticalNavItems'
|
|
import VerticalNavHeader from './VerticalNavHeader'
|
|
|
|
// ** Util Import
|
|
import { hexToRGBA } from '../../../../../core/utils/hex-to-rgba'
|
|
|
|
interface Props {
|
|
hidden: boolean
|
|
navWidth: number
|
|
settings: Settings
|
|
children: ReactNode
|
|
navVisible: boolean
|
|
toggleNavVisibility: () => void
|
|
setNavVisible: (value: boolean) => void
|
|
verticalNavItems?: VerticalNavItemsType
|
|
saveSettings: (values: Settings) => void
|
|
verticalNavMenuContent?: (props?: any) => ReactNode
|
|
afterVerticalNavMenuContent?: (props?: any) => ReactNode
|
|
beforeVerticalNavMenuContent?: (props?: any) => ReactNode
|
|
}
|
|
|
|
const StyledBoxForShadow = styled(Box)<BoxProps>({
|
|
top: 50,
|
|
left: -8,
|
|
zIndex: 2,
|
|
height: 75,
|
|
display: 'none',
|
|
position: 'absolute',
|
|
pointerEvents: 'none',
|
|
width: 'calc(100% + 15px)',
|
|
'&.d-block': {
|
|
display: 'block'
|
|
}
|
|
})
|
|
|
|
const Navigation = (props: Props) => {
|
|
// ** Props
|
|
const {
|
|
hidden,
|
|
afterVerticalNavMenuContent,
|
|
beforeVerticalNavMenuContent,
|
|
verticalNavMenuContent: userVerticalNavMenuContent
|
|
} = props
|
|
|
|
// ** States
|
|
const [groupActive, setGroupActive] = useState<string[]>([])
|
|
const [currentActiveGroup, setCurrentActiveGroup] = useState<string[]>([])
|
|
|
|
// ** Ref
|
|
const shadowRef = useRef(null)
|
|
|
|
// ** Hooks
|
|
const theme = useTheme()
|
|
|
|
// ** Fixes Navigation InfiniteScroll
|
|
const handleInfiniteScroll = (ref: HTMLElement) => {
|
|
if (ref) {
|
|
// @ts-ignore
|
|
ref._getBoundingClientRect = ref.getBoundingClientRect
|
|
|
|
ref.getBoundingClientRect = () => {
|
|
// @ts-ignore
|
|
const original = ref._getBoundingClientRect()
|
|
|
|
return { ...original, height: Math.floor(original.height) }
|
|
}
|
|
}
|
|
}
|
|
|
|
// ** Scroll Menu
|
|
const scrollMenu = (container: any) => {
|
|
container = hidden ? container.target : container
|
|
if (shadowRef && container.scrollTop > 0) {
|
|
// @ts-ignore
|
|
if (!shadowRef.current.classList.contains('d-block')) {
|
|
// @ts-ignore
|
|
shadowRef.current.classList.add('d-block')
|
|
}
|
|
} else {
|
|
// @ts-ignore
|
|
shadowRef.current.classList.remove('d-block')
|
|
}
|
|
}
|
|
|
|
const ScrollWrapper = hidden ? Box : PerfectScrollbar
|
|
|
|
return (
|
|
<Drawer {...props}>
|
|
<VerticalNavHeader {...props} />
|
|
<StyledBoxForShadow
|
|
ref={shadowRef}
|
|
sx={{
|
|
background: `linear-gradient(${theme.palette.background.default} 40%,${hexToRGBA(
|
|
theme.palette.background.default,
|
|
0.1
|
|
)} 95%,${hexToRGBA(theme.palette.background.default, 0.05)})`
|
|
}}
|
|
/>
|
|
<Box sx={{ height: '100%', position: 'relative', overflow: 'hidden' }}>
|
|
{/* @ts-ignore */}
|
|
<ScrollWrapper
|
|
{...(hidden
|
|
? {
|
|
onScroll: (container: any) => scrollMenu(container),
|
|
sx: { height: '100%', overflowY: 'auto', overflowX: 'hidden' }
|
|
}
|
|
: {
|
|
options: { wheelPropagation: false },
|
|
onScrollY: (container: any) => scrollMenu(container),
|
|
containerRef: (ref: any) => handleInfiniteScroll(ref)
|
|
})}
|
|
>
|
|
{beforeVerticalNavMenuContent ? beforeVerticalNavMenuContent(props) : null}
|
|
<Box sx={{ height: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'space-between' }}>
|
|
{userVerticalNavMenuContent ? (
|
|
userVerticalNavMenuContent(props)
|
|
) : (
|
|
<List className='nav-items' sx={{ transition: 'padding .25s ease', pr: 4.5 }}>
|
|
<VerticalNavItems
|
|
groupActive={groupActive}
|
|
setGroupActive={setGroupActive}
|
|
currentActiveGroup={currentActiveGroup}
|
|
setCurrentActiveGroup={setCurrentActiveGroup}
|
|
{...props}
|
|
/>
|
|
</List>
|
|
)}
|
|
</Box>
|
|
</ScrollWrapper>
|
|
</Box>
|
|
{afterVerticalNavMenuContent ? afterVerticalNavMenuContent(props) : null}
|
|
</Drawer>
|
|
)
|
|
}
|
|
|
|
export default Navigation
|