index.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { useMemo, useContext } from 'react';
  2. import { Outlet, useNavigate, useLocation, Navigate } from 'react-router-dom';
  3. import { useTranslation } from 'react-i18next';
  4. import GlobalEffect from '@/components/layout/GlobalEffect';
  5. import Header from '@/components/layout/Header';
  6. import NavMenu from '@/components/menu/NavMenu';
  7. import { NavMenuItem } from '@/components/menu/Types';
  8. import icons from '@/components/icons/Icons';
  9. import { authContext, rootContext, dataContext } from '@/context';
  10. import Overview from '@/pages/home/Home';
  11. import Box from '@mui/material/Box';
  12. function Index() {
  13. const { isAuth, isManaged, isDedicated, authReq } = useContext(authContext);
  14. const { database } = useContext(dataContext);
  15. const { versionInfo } = useContext(rootContext);
  16. const { t: navTrans } = useTranslation('nav');
  17. const navigate = useNavigate();
  18. const location = useLocation();
  19. const navMap = [
  20. { key: 'databases', label: 'database' },
  21. { key: 'search', label: 'search' },
  22. { key: 'system', label: 'system' },
  23. { key: 'users', label: 'user' },
  24. { key: 'roles', label: 'user' },
  25. { key: 'privilege-groups', label: 'user' },
  26. { key: 'play', label: 'play' },
  27. ];
  28. const defaultActive = useMemo(() => {
  29. const found = navMap.find(item => location.pathname.includes(item.key));
  30. return navTrans(found?.label || 'overview');
  31. }, [location.pathname, navTrans]);
  32. const baseMenu: NavMenuItem[] = [
  33. {
  34. icon: icons.attu,
  35. label: navTrans('overview'),
  36. onClick: () => navigate('/'),
  37. },
  38. {
  39. icon: icons.database,
  40. label: navTrans('database'),
  41. onClick: () => navigate(`/databases/${database}/collections`),
  42. },
  43. {
  44. icon: icons.code,
  45. label: navTrans('play'),
  46. onClick: () => navigate('/play'),
  47. },
  48. ];
  49. const menuItems = [...baseMenu];
  50. if (!isManaged || isDedicated) {
  51. menuItems.push({
  52. icon: icons.navPerson,
  53. label: navTrans('user'),
  54. onClick: () => navigate('/users'),
  55. });
  56. }
  57. if (!isManaged) {
  58. menuItems.push(
  59. {
  60. icon: icons.navSystem,
  61. label: navTrans('system'),
  62. onClick: () => navigate('/system'),
  63. },
  64. {
  65. icon: icons.newWindow,
  66. label: 'Milvus WebUI',
  67. onClick: () => {
  68. window.open(
  69. `http://${authReq.address.split(':')[0]}:9091/webui`,
  70. '_blank'
  71. );
  72. },
  73. }
  74. );
  75. }
  76. if (!isAuth) {
  77. return <Navigate to="/connect" />;
  78. }
  79. return (
  80. <Box
  81. sx={{
  82. minHeight: '100vh',
  83. backgroundColor: theme => theme.palette.background.default,
  84. }}
  85. >
  86. <GlobalEffect>
  87. <Box
  88. sx={{
  89. display: 'flex',
  90. }}
  91. >
  92. <NavMenu
  93. width="172px"
  94. data={menuItems}
  95. defaultActive={defaultActive}
  96. defaultOpen={{ [navTrans('overview')]: true }}
  97. versionInfo={versionInfo}
  98. />
  99. <Box
  100. sx={{
  101. flex: 1,
  102. display: 'flex',
  103. flexDirection: 'column',
  104. height: '100vh',
  105. overflowY: 'scroll',
  106. }}
  107. >
  108. <Header />
  109. {location.pathname === '/' ? <Overview /> : <Outlet />}
  110. </Box>
  111. </Box>
  112. </GlobalEffect>
  113. </Box>
  114. );
  115. }
  116. export default Index;