Header.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { FC, useContext } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { makeStyles, Theme, createStyles, Typography } from '@material-ui/core';
  4. import { useNavigate } from 'react-router-dom';
  5. import { navContext, dataContext, authContext } from '@/context';
  6. import { MilvusHttp } from '@/http';
  7. import { MILVUS_ADDRESS } from '@/consts';
  8. import CustomSelector from '@/components/customSelector/CustomSelector';
  9. import icons from '../icons/Icons';
  10. import { HeaderType } from './Types';
  11. const useStyles = makeStyles((theme: Theme) =>
  12. createStyles({
  13. header: {
  14. display: 'flex',
  15. alignItems: 'center',
  16. color: theme.palette.common.black,
  17. marginRight: theme.spacing(5),
  18. },
  19. contentWrapper: {
  20. display: 'flex',
  21. justifyContent: 'space-between',
  22. alignItems: 'center',
  23. paddingTop: theme.spacing(3),
  24. paddingLeft: theme.spacing(3),
  25. flex: 1,
  26. },
  27. navigation: {
  28. display: 'flex',
  29. alignItems: 'center',
  30. },
  31. icon: {
  32. color: theme.palette.primary.main,
  33. cursor: 'pointer',
  34. marginRight: theme.spacing(1),
  35. },
  36. addressWrapper: {
  37. display: 'flex',
  38. alignItems: 'center',
  39. '& .text': {
  40. marginRight: theme.spacing(3),
  41. '& .address': {
  42. fontSize: '14px',
  43. lineHeight: '20px',
  44. color: '#545454',
  45. },
  46. '& .status': {
  47. fontSize: '12px',
  48. lineHeight: '16px',
  49. color: '#1ba954',
  50. },
  51. },
  52. },
  53. database: {
  54. width: theme.spacing(16),
  55. marginRight: theme.spacing(2),
  56. },
  57. })
  58. );
  59. const Header: FC<HeaderType> = props => {
  60. const classes = useStyles();
  61. const { navInfo } = useContext(navContext);
  62. const { database, databases, setDatabase } = useContext(dataContext);
  63. const { address, setAddress, setIsAuth } = useContext(authContext);
  64. const navigate = useNavigate();
  65. const { t: commonTrans } = useTranslation();
  66. const statusTrans = commonTrans('status');
  67. const { t: dbTrans } = useTranslation('database');
  68. const BackIcon = icons.back;
  69. const LogoutIcon = icons.logout;
  70. const handleBack = (path: string) => {
  71. navigate(path);
  72. };
  73. const handleLogout = async () => {
  74. setAddress('');
  75. setIsAuth(false);
  76. await MilvusHttp.closeConnection();
  77. window.localStorage.removeItem(MILVUS_ADDRESS);
  78. // make sure we clear state in all pages
  79. // navigate(0);
  80. };
  81. const useDatabase = async (database: string) => {
  82. await MilvusHttp.useDatabase({ database });
  83. };
  84. const dbOptions = databases.map(d => ({ value: d, label: d }));
  85. return (
  86. <header className={classes.header}>
  87. <div className={classes.contentWrapper}>
  88. <div className={classes.navigation}>
  89. {navInfo.backPath !== '' && (
  90. <BackIcon
  91. classes={{ root: classes.icon }}
  92. onClick={() => handleBack(navInfo.backPath)}
  93. />
  94. )}
  95. {navInfo.showDatabaseSelector ? (
  96. <CustomSelector
  97. label={dbTrans('database')}
  98. value={database}
  99. onChange={async (e: { target: { value: unknown } }) => {
  100. const database = e.target.value as string;
  101. await useDatabase(database);
  102. setDatabase(database);
  103. }}
  104. options={dbOptions}
  105. variant="filled"
  106. wrapperClass={classes.database}
  107. />
  108. ) : null}
  109. <Typography variant="h4" color="textPrimary">
  110. {navInfo.navTitle}
  111. </Typography>
  112. </div>
  113. <div className={classes.addressWrapper}>
  114. <div className="text">
  115. <Typography className="address">{address}</Typography>
  116. <Typography className="status">{statusTrans.running}</Typography>
  117. </div>
  118. <LogoutIcon classes={{ root: classes.icon }} onClick={handleLogout} />
  119. </div>
  120. </div>
  121. </header>
  122. );
  123. };
  124. export default Header;