您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

index.tsx 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import { useLogin, useRegister } from '@/hooks/login-hooks';
  2. import { rsaPsw } from '@/utils';
  3. import { Button, Checkbox, Form, Input } from 'antd';
  4. import { useEffect, useState } from 'react';
  5. import { useTranslation } from 'react-i18next';
  6. import { Icon, useNavigate } from 'umi';
  7. import RightPanel from './right-panel';
  8. import { Domain } from '@/constants/common';
  9. import styles from './index.less';
  10. const Login = () => {
  11. const [title, setTitle] = useState('login');
  12. const navigate = useNavigate();
  13. const { login, loading: signLoading } = useLogin();
  14. const { register, loading: registerLoading } = useRegister();
  15. const { t } = useTranslation('translation', { keyPrefix: 'login' });
  16. const loading = signLoading || registerLoading;
  17. const changeTitle = () => {
  18. setTitle((title) => (title === 'login' ? 'register' : 'login'));
  19. };
  20. const [form] = Form.useForm();
  21. useEffect(() => {
  22. form.validateFields(['nickname']);
  23. }, [form]);
  24. const onCheck = async () => {
  25. try {
  26. const params = await form.validateFields();
  27. const rsaPassWord = rsaPsw(params.password) as string;
  28. if (title === 'login') {
  29. const code = await login({
  30. email: params.email,
  31. password: rsaPassWord,
  32. });
  33. if (code === 0) {
  34. navigate('/knowledge');
  35. }
  36. } else {
  37. const code = await register({
  38. nickname: params.nickname,
  39. email: params.email,
  40. password: rsaPassWord,
  41. });
  42. if (code === 0) {
  43. setTitle('login');
  44. }
  45. }
  46. } catch (errorInfo) {
  47. console.log('Failed:', errorInfo);
  48. }
  49. };
  50. const formItemLayout = {
  51. labelCol: { span: 6 },
  52. // wrapperCol: { span: 8 },
  53. };
  54. const toGoogle = () => {
  55. window.location.href =
  56. 'https://github.com/login/oauth/authorize?scope=user:email&client_id=302129228f0d96055bee';
  57. };
  58. return (
  59. <div className={styles.loginPage}>
  60. <div className={styles.loginLeft}>
  61. <div className={styles.leftContainer}>
  62. <div className={styles.loginTitle}>
  63. <div>{title === 'login' ? t('login') : t('register')}</div>
  64. <span>
  65. {title === 'login'
  66. ? t('loginDescription')
  67. : t('registerDescription')}
  68. </span>
  69. </div>
  70. <Form
  71. form={form}
  72. layout="vertical"
  73. name="dynamic_rule"
  74. style={{ maxWidth: 600 }}
  75. >
  76. <Form.Item
  77. {...formItemLayout}
  78. name="email"
  79. label={t('emailLabel')}
  80. rules={[{ required: true, message: t('emailPlaceholder') }]}
  81. >
  82. <Input size="large" placeholder={t('emailPlaceholder')} />
  83. </Form.Item>
  84. {title === 'register' && (
  85. <Form.Item
  86. {...formItemLayout}
  87. name="nickname"
  88. label={t('nicknameLabel')}
  89. rules={[{ required: true, message: t('nicknamePlaceholder') }]}
  90. >
  91. <Input size="large" placeholder={t('nicknamePlaceholder')} />
  92. </Form.Item>
  93. )}
  94. <Form.Item
  95. {...formItemLayout}
  96. name="password"
  97. label={t('passwordLabel')}
  98. rules={[{ required: true, message: t('passwordPlaceholder') }]}
  99. >
  100. <Input.Password
  101. size="large"
  102. placeholder={t('passwordPlaceholder')}
  103. onPressEnter={onCheck}
  104. />
  105. </Form.Item>
  106. {title === 'login' && (
  107. <Form.Item name="remember" valuePropName="checked">
  108. <Checkbox> {t('rememberMe')}</Checkbox>
  109. </Form.Item>
  110. )}
  111. <div>
  112. {title === 'login' && (
  113. <div>
  114. {t('signInTip')}
  115. <Button type="link" onClick={changeTitle}>
  116. {t('signUp')}
  117. </Button>
  118. </div>
  119. )}
  120. {title === 'register' && (
  121. <div>
  122. {t('signUpTip')}
  123. <Button type="link" onClick={changeTitle}>
  124. {t('login')}
  125. </Button>
  126. </div>
  127. )}
  128. </div>
  129. <Button
  130. type="primary"
  131. block
  132. size="large"
  133. onClick={onCheck}
  134. loading={loading}
  135. >
  136. {title === 'login' ? t('login') : t('continue')}
  137. </Button>
  138. {title === 'login' && (
  139. <>
  140. {/* <Button
  141. block
  142. size="large"
  143. onClick={toGoogle}
  144. style={{ marginTop: 15 }}
  145. >
  146. <div>
  147. <Icon
  148. icon="local:google"
  149. style={{ verticalAlign: 'middle', marginRight: 5 }}
  150. />
  151. Sign in with Google
  152. </div>
  153. </Button> */}
  154. {location.host === Domain && (
  155. <Button
  156. block
  157. size="large"
  158. onClick={toGoogle}
  159. style={{ marginTop: 15 }}
  160. >
  161. <div>
  162. <Icon
  163. icon="local:github"
  164. style={{ verticalAlign: 'middle', marginRight: 5 }}
  165. />
  166. Sign in with Github
  167. </div>
  168. </Button>
  169. )}
  170. </>
  171. )}
  172. </Form>
  173. </div>
  174. </div>
  175. <div className={styles.loginRight}>
  176. <RightPanel></RightPanel>
  177. </div>
  178. </div>
  179. );
  180. };
  181. export default Login;