You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

143 rivejä
4.0 KiB

  1. import PropTypes from 'prop-types';
  2. import { forwardRef, useEffect } from 'react';
  3. import { Link, useLocation } from 'react-router-dom';
  4. import { useDispatch, useSelector } from 'react-redux';
  5. // material-ui
  6. import { useTheme } from '@mui/material/styles';
  7. import { Avatar, Chip, ListItemButton, ListItemIcon, ListItemText, Typography } from '@mui/material';
  8. // project import
  9. import { activeItem } from 'store/reducers/menu';
  10. // ==============================|| NAVIGATION - LIST ITEM ||============================== //
  11. const NavItem = ({ item, level }) => {
  12. const theme = useTheme();
  13. const dispatch = useDispatch();
  14. const { pathname } = useLocation();
  15. const { drawerOpen, openItem } = useSelector((state) => state.menu);
  16. let itemTarget = '_self';
  17. if (item.target) {
  18. itemTarget = '_blank';
  19. }
  20. let listItemProps = { component: forwardRef((props, ref) => <Link ref={ref} {...props} to={item.url} target={itemTarget} />) };
  21. if (item?.external) {
  22. listItemProps = { component: 'a', href: item.url, target: itemTarget };
  23. }
  24. const itemHandler = (id) => {
  25. dispatch(activeItem({ openItem: [id] }));
  26. };
  27. const Icon = item.icon;
  28. const itemIcon = item.icon ? <Icon style={{ fontSize: drawerOpen ? '1rem' : '1.25rem' }} /> : false;
  29. const isSelected = openItem.findIndex((id) => id === item.id) > -1;
  30. // active menu item on page load
  31. useEffect(() => {
  32. if (pathname.includes(item.url)) {
  33. dispatch(activeItem({ openItem: [item.id] }));
  34. }
  35. // eslint-disable-next-line
  36. }, [pathname]);
  37. const textColor = 'text.primary';
  38. const iconSelectedColor = 'primary.main';
  39. return (
  40. <ListItemButton
  41. {...listItemProps}
  42. disabled={item.disabled}
  43. onClick={() => itemHandler(item.id)}
  44. selected={isSelected}
  45. sx={{
  46. zIndex: 1201,
  47. pl: drawerOpen ? `${level * 28}px` : 1.5,
  48. py: !drawerOpen && level === 1 ? 1.25 : 1,
  49. ...(drawerOpen && {
  50. '&:hover': {
  51. bgcolor: 'primary.lighter'
  52. },
  53. '&.Mui-selected': {
  54. bgcolor: 'primary.lighter',
  55. borderRight: `2px solid ${theme.palette.primary.main}`,
  56. color: iconSelectedColor,
  57. '&:hover': {
  58. color: iconSelectedColor,
  59. bgcolor: 'primary.lighter'
  60. }
  61. }
  62. }),
  63. ...(!drawerOpen && {
  64. '&:hover': {
  65. bgcolor: 'transparent'
  66. },
  67. '&.Mui-selected': {
  68. '&:hover': {
  69. bgcolor: 'transparent'
  70. },
  71. bgcolor: 'transparent'
  72. }
  73. })
  74. }}
  75. >
  76. {itemIcon && (
  77. <ListItemIcon
  78. sx={{
  79. minWidth: 28,
  80. color: isSelected ? iconSelectedColor : textColor,
  81. ...(!drawerOpen && {
  82. borderRadius: 1.5,
  83. width: 36,
  84. height: 36,
  85. alignItems: 'center',
  86. justifyContent: 'center',
  87. '&:hover': {
  88. bgcolor: 'secondary.lighter'
  89. }
  90. }),
  91. ...(!drawerOpen &&
  92. isSelected && {
  93. bgcolor: 'primary.lighter',
  94. '&:hover': {
  95. bgcolor: 'primary.lighter'
  96. }
  97. })
  98. }}
  99. >
  100. {itemIcon}
  101. </ListItemIcon>
  102. )}
  103. {(drawerOpen || (!drawerOpen && level !== 1)) && (
  104. <ListItemText
  105. primary={
  106. <Typography variant="h6" sx={{ color: isSelected ? iconSelectedColor : textColor }}>
  107. {item.title}
  108. </Typography>
  109. }
  110. />
  111. )}
  112. {(drawerOpen || (!drawerOpen && level !== 1)) && item.chip && (
  113. <Chip
  114. color={item.chip.color}
  115. variant={item.chip.variant}
  116. size={item.chip.size}
  117. label={item.chip.label}
  118. avatar={item.chip.avatar && <Avatar>{item.chip.avatar}</Avatar>}
  119. />
  120. )}
  121. </ListItemButton>
  122. );
  123. };
  124. NavItem.propTypes = {
  125. item: PropTypes.object,
  126. level: PropTypes.number
  127. };
  128. export default NavItem;