Layout.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 useStyles = makeStyles((theme: Theme) =>
  12. createStyles({
  13. root: {
  14. minHeight: '100vh',
  15. backgroundColor: '#f5f5f5',
  16. },
  17. content: {
  18. display: 'flex',
  19. },
  20. body: {
  21. flex: 1,
  22. display: 'flex',
  23. flexDirection: 'column',
  24. height: '100vh',
  25. overflowY: 'scroll',
  26. },
  27. activeConsole: {
  28. '& path': {
  29. fill: theme.palette.primary.main,
  30. },
  31. },
  32. normalConsole: {
  33. '& path': {
  34. fill: theme.palette.milvusGrey.dark,
  35. },
  36. },
  37. })
  38. );
  39. const Layout = (props: any) => {
  40. const history = useHistory();
  41. const { isAuth } = useContext(authContext);
  42. const { t: navTrans } = useTranslation('nav');
  43. const classes = useStyles();
  44. const location = useLocation();
  45. const defaultActive = useMemo(
  46. () =>
  47. location.pathname.includes('collection')
  48. ? navTrans('collection')
  49. : navTrans('overview'),
  50. [location, navTrans]
  51. );
  52. const menuItems: NavMenuItem[] = [
  53. {
  54. icon: icons.navOverview,
  55. label: navTrans('overview'),
  56. onClick: () => history.push('/'),
  57. },
  58. {
  59. icon: icons.navCollection,
  60. label: navTrans('collection'),
  61. onClick: () => history.push('/collections'),
  62. },
  63. ];
  64. return (
  65. <div className={classes.root}>
  66. <GlobalEffect>
  67. <div className={classes.content}>
  68. {isAuth && (
  69. <NavMenu
  70. width="200px"
  71. data={menuItems}
  72. defaultActive={defaultActive}
  73. // used for nested child menu
  74. defaultOpen={{ [navTrans('overview')]: true }}
  75. />
  76. )}
  77. <div className={classes.body}>
  78. {isAuth && <Header />}
  79. {props.children}
  80. </div>
  81. </div>
  82. </GlobalEffect>
  83. </div>
  84. );
  85. };
  86. export default Layout;