Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

index.tsx 6.1KB

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