Connect.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { Theme, makeStyles, Typography } from '@material-ui/core';
  2. import { useTranslation } from 'react-i18next';
  3. import { ITextfieldConfig } from '../../components/customInput/Types';
  4. import icons from '../../components/icons/Icons';
  5. import ConnectContainer from './ConnectContainer';
  6. import CustomInput from '../../components/customInput/CustomInput';
  7. import { useContext, useMemo, useState } from 'react';
  8. import { formatForm } from '../../utils/Form';
  9. import { useFormValidation } from '../../hooks/Form';
  10. import CustomButton from '../../components/customButton/CustomButton';
  11. import { useHistory } from 'react-router-dom';
  12. import { authContext } from '../../context/Auth';
  13. import { MilvusHttp } from '../../http/Milvus';
  14. import { rootContext } from '../../context/Root';
  15. import { MILVUS_ADDRESS } from '../../consts/Localstorage';
  16. const useStyles = makeStyles((theme: Theme) => ({
  17. wrapper: {
  18. display: 'flex',
  19. flexDirection: 'column',
  20. alignItems: 'flex-end',
  21. padding: theme.spacing(0, 3),
  22. },
  23. titleWrapper: {
  24. display: 'flex',
  25. padding: theme.spacing(3),
  26. margin: '0 auto',
  27. '& .title': {
  28. margin: 0,
  29. color: '#323232',
  30. fontWeight: 'bold',
  31. },
  32. },
  33. logo: {
  34. width: '42px',
  35. height: 'auto',
  36. marginRight: theme.spacing(2),
  37. },
  38. input: {
  39. margin: theme.spacing(3, 0, 0.5),
  40. },
  41. }));
  42. const Connect = () => {
  43. const history = useHistory();
  44. const { setAddress } = useContext(authContext);
  45. const { openSnackBar } = useContext(rootContext);
  46. const classes = useStyles();
  47. const { t } = useTranslation();
  48. const { t: warningTrans } = useTranslation('warning');
  49. const milvusTrans: { [key in string]: string } = t('milvus');
  50. const { t: btnTrans } = useTranslation('btn');
  51. const { t: successTrans } = useTranslation('success');
  52. const [form, setForm] = useState({
  53. address: '',
  54. });
  55. const checkedForm = useMemo(() => {
  56. const { address } = form;
  57. return formatForm({ address });
  58. }, [form]);
  59. const { validation, checkIsValid, disabled } = useFormValidation(checkedForm);
  60. const Logo = icons.milvus;
  61. const handleInputChange = (value: string) => {
  62. setForm({ address: value });
  63. };
  64. const handleConnect = async () => {
  65. await MilvusHttp.connect(form.address);
  66. openSnackBar(successTrans('connect'));
  67. setAddress(form.address);
  68. window.localStorage.setItem(MILVUS_ADDRESS, form.address);
  69. history.push('/');
  70. };
  71. const addressInputConfig: ITextfieldConfig = {
  72. label: milvusTrans.address,
  73. key: 'address',
  74. onChange: handleInputChange,
  75. variant: 'filled',
  76. className: classes.input,
  77. placeholder: milvusTrans.address,
  78. fullWidth: true,
  79. validations: [
  80. {
  81. rule: 'require',
  82. errorText: warningTrans('required', { name: milvusTrans.address }),
  83. },
  84. ],
  85. };
  86. return (
  87. <ConnectContainer>
  88. <section className={classes.wrapper}>
  89. <div className={classes.titleWrapper}>
  90. <Logo classes={{ root: classes.logo }} />
  91. <Typography variant="h2" className="title">
  92. {milvusTrans.admin}
  93. </Typography>
  94. </div>
  95. <CustomInput
  96. type="text"
  97. textConfig={addressInputConfig}
  98. checkValid={checkIsValid}
  99. validInfo={validation}
  100. />
  101. <CustomButton
  102. variant="contained"
  103. disabled={disabled}
  104. onClick={handleConnect}
  105. >
  106. {btnTrans('connect')}
  107. </CustomButton>
  108. </section>
  109. </ConnectContainer>
  110. );
  111. };
  112. export default Connect;