Layout.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import GlobalEffect from './GlobalEffect';
  2. import Header from './Header';
  3. import { makeStyles, Theme, createStyles } from '@material-ui/core';
  4. import NavMenu from '../menu/NavMenu';
  5. import { NavMenuItem } from '../menu/Types';
  6. import { useContext, useMemo } from 'react';
  7. import icons from '../icons/Icons';
  8. import { useTranslation } from 'react-i18next';
  9. import { useHistory, useLocation } from 'react-router-dom';
  10. import { authContext } from '../../context/Auth';
  11. const PLUGIN_DEV = process.env?.REACT_APP_PLUGIN_DEV;
  12. const useStyles = makeStyles((theme: Theme) =>
  13. createStyles({
  14. root: {
  15. minHeight: '100vh',
  16. backgroundColor: '#f5f5f5',
  17. },
  18. content: {
  19. display: 'flex',
  20. '& .normalSearchIcon': {
  21. '& path': {
  22. fill: theme.palette.milvusGrey.dark,
  23. },
  24. },
  25. '& .activeSearchIcon': {
  26. '& path': {
  27. fill: theme.palette.primary.main,
  28. },
  29. },
  30. },
  31. body: {
  32. flex: 1,
  33. display: 'flex',
  34. flexDirection: 'column',
  35. height: '100vh',
  36. overflowY: 'scroll',
  37. },
  38. })
  39. );
  40. const Layout = (props: any) => {
  41. const history = useHistory();
  42. const { isAuth } = useContext(authContext);
  43. const { t: navTrans } = useTranslation('nav');
  44. const classes = useStyles();
  45. const location = useLocation();
  46. const defaultActive = useMemo(() => {
  47. if (location.pathname.includes('collection')) {
  48. return navTrans('collection');
  49. }
  50. if (location.pathname.includes('search')) {
  51. return navTrans('search');
  52. }
  53. if (location.pathname.includes('system')) {
  54. return navTrans('system');
  55. }
  56. return navTrans('overview');
  57. }, [location, navTrans]);
  58. const menuItems: NavMenuItem[] = [
  59. {
  60. icon: icons.navOverview,
  61. label: navTrans('overview'),
  62. onClick: () => history.push('/'),
  63. },
  64. // {
  65. // icon: icons.navSystem,
  66. // label: navTrans('system'),
  67. // onClick: () => history.push('/system'),
  68. // },
  69. {
  70. icon: icons.navCollection,
  71. label: navTrans('collection'),
  72. onClick: () => history.push('/collections'),
  73. },
  74. {
  75. icon: icons.navSearch,
  76. label: navTrans('search'),
  77. onClick: () => history.push('/search'),
  78. iconActiveClass: 'activeSearchIcon',
  79. iconNormalClass: 'normalSearchIcon',
  80. },
  81. ];
  82. function importAll(r: any) {
  83. r.keys().forEach((key: any) => {
  84. const content = r(key);
  85. const pathName = content.client?.path;
  86. const icon = content.client?.icon || icons.navSystem;
  87. const iconActiveClass =
  88. content.client?.iconActiveClass || 'activeSearchIcon';
  89. const iconNormalClass =
  90. content.client?.iconNormalClass || 'normalSearchIcon';
  91. if (!pathName) return;
  92. menuItems.push({
  93. icon,
  94. label: content.client?.label,
  95. onClick: () => history.push(`${pathName}`),
  96. iconActiveClass,
  97. iconNormalClass,
  98. });
  99. });
  100. }
  101. importAll(require.context('../../plugins', true, /config\.json$/));
  102. PLUGIN_DEV &&
  103. importAll(require.context('all_plugins/', true, /config\.json$/));
  104. return (
  105. <div className={classes.root}>
  106. <GlobalEffect>
  107. <div className={classes.content}>
  108. {isAuth && (
  109. <NavMenu
  110. width="200px"
  111. data={menuItems}
  112. defaultActive={defaultActive}
  113. // used for nested child menu
  114. defaultOpen={{ [navTrans('overview')]: true }}
  115. />
  116. )}
  117. <div className={classes.body}>
  118. {isAuth && <Header />}
  119. {props.children}
  120. </div>
  121. </div>
  122. </GlobalEffect>
  123. </div>
  124. );
  125. };
  126. export default Layout;