Header.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import { FC, useContext } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import {
  4. makeStyles,
  5. Theme,
  6. createStyles,
  7. Typography,
  8. Tooltip,
  9. } from '@material-ui/core';
  10. import { useNavigate } from 'react-router-dom';
  11. import { navContext, dataContext, authContext } from '@/context';
  12. import { MilvusService } from '@/http';
  13. import CustomSelector from '@/components/customSelector/CustomSelector';
  14. import icons from '../icons/Icons';
  15. const useStyles = makeStyles((theme: Theme) =>
  16. createStyles({
  17. header: {
  18. display: 'flex',
  19. alignItems: 'center',
  20. color: theme.palette.common.black,
  21. paddingRight: theme.spacing(1),
  22. backgroundColor: '#fff',
  23. borderBottom: '1px solid #e0e0e0',
  24. minHeight: 56,
  25. },
  26. contentWrapper: {
  27. display: 'flex',
  28. justifyContent: 'space-between',
  29. alignItems: 'center',
  30. paddingLeft: theme.spacing(1.5),
  31. flex: 1,
  32. },
  33. navigation: {
  34. display: 'flex',
  35. alignItems: 'center',
  36. },
  37. icon: {
  38. color: theme.palette.primary.main,
  39. cursor: 'pointer',
  40. marginRight: theme.spacing(1),
  41. width: '20px',
  42. },
  43. addressWrapper: {
  44. display: 'flex',
  45. alignItems: 'center',
  46. '& .text': {
  47. marginRight: theme.spacing(2),
  48. '& .address': {
  49. fontSize: '14px',
  50. lineHeight: '20px',
  51. color: '#545454',
  52. },
  53. '& .status': {
  54. fontSize: '12px',
  55. lineHeight: '16px',
  56. color: '#1ba954',
  57. },
  58. },
  59. },
  60. database: {
  61. width: theme.spacing(16),
  62. marginRight: theme.spacing(2),
  63. },
  64. })
  65. );
  66. const Header: FC = () => {
  67. const classes = useStyles();
  68. const { navInfo } = useContext(navContext);
  69. const { database, databases, setDatabase, loading } = useContext(dataContext);
  70. const { address, username, logout } = useContext(authContext);
  71. const navigate = useNavigate();
  72. const { t: commonTrans } = useTranslation();
  73. const statusTrans = commonTrans('status');
  74. const { t: dbTrans } = useTranslation('database');
  75. const BackIcon = icons.back;
  76. const LogoutIcon = icons.logout;
  77. const Avatar = icons.avatar;
  78. const handleBack = (path: string) => {
  79. navigate(path);
  80. };
  81. const handleLogout = async () => {
  82. logout();
  83. };
  84. const useDatabase = async (database: string) => {
  85. await MilvusService.useDatabase({ database });
  86. };
  87. const dbOptions = databases.map(d => ({ value: d.name, label: d.name }));
  88. return (
  89. <header className={classes.header}>
  90. <div className={classes.contentWrapper}>
  91. <div className={classes.navigation}>
  92. {navInfo.backPath !== '' && (
  93. <BackIcon
  94. classes={{ root: classes.icon }}
  95. onClick={() => handleBack(navInfo.backPath)}
  96. />
  97. )}
  98. {navInfo.showDatabaseSelector ? (
  99. <CustomSelector
  100. label={dbTrans('database')}
  101. value={database}
  102. onChange={async (e: { target: { value: unknown } }) => {
  103. const database = e.target.value as string;
  104. await useDatabase(database);
  105. setDatabase(database);
  106. // if url contains databases, go to the database page
  107. if (window.location.hash.includes('databases')) {
  108. navigate(`/databases/${database}`);
  109. }
  110. }}
  111. options={dbOptions}
  112. variant="filled"
  113. wrapperClass={classes.database}
  114. disabled={loading}
  115. />
  116. ) : null}
  117. <Typography variant="h5" color="textPrimary">
  118. {navInfo.navTitle}
  119. </Typography>
  120. {navInfo.extra}
  121. </div>
  122. <div className={classes.addressWrapper}>
  123. <div className="text">
  124. <Typography className="address">{address}</Typography>
  125. <Typography className="status">{statusTrans.running}</Typography>
  126. </div>
  127. {username && (
  128. <Tooltip title={username}>
  129. <div>
  130. <Avatar classes={{ root: classes.icon }} />
  131. </div>
  132. </Tooltip>
  133. )}
  134. <Tooltip title={''}>
  135. <div>
  136. <LogoutIcon
  137. classes={{ root: classes.icon }}
  138. onClick={handleLogout}
  139. />
  140. </div>
  141. </Tooltip>
  142. </div>
  143. </div>
  144. </header>
  145. );
  146. };
  147. export default Header;