balibabu commited on
Commit
e441caf
·
1 Parent(s): 72412ac

remove showDeleteConfirm function and center the Empty of knowledge list and extract the text of the login page to en.json (#203)

Browse files

feat: remove showDeleteConfirm function
feat: center the Empty of knowledge list
feat: extract the text of the login page to en.json
#204

web/src/app.tsx CHANGED
@@ -1,16 +1,16 @@
1
- import { ConfigProvider } from 'antd';
2
- import React, { ReactNode } from 'react';
3
 
4
  export function rootContainer(container: ReactNode) {
5
- return React.createElement(
6
- ConfigProvider,
7
- {
8
- theme: {
9
  token: {
10
  fontFamily: 'Inter',
11
  },
12
- },
13
- },
14
- container,
 
15
  );
16
  }
 
1
+ import { App, ConfigProvider } from 'antd';
2
+ import { ReactNode } from 'react';
3
 
4
  export function rootContainer(container: ReactNode) {
5
+ return (
6
+ <ConfigProvider
7
+ theme={{
 
8
  token: {
9
  fontFamily: 'Inter',
10
  },
11
+ }}
12
+ >
13
+ <App> {container}</App>
14
+ </ConfigProvider>
15
  );
16
  }
web/src/components/deleting-confirm/index.less DELETED
File without changes
web/src/components/deleting-confirm/index.tsx DELETED
@@ -1,39 +0,0 @@
1
- import { ExclamationCircleFilled } from '@ant-design/icons';
2
- import { Modal } from 'antd';
3
-
4
- const { confirm } = Modal;
5
-
6
- interface IProps {
7
- onOk?: (...args: any[]) => any;
8
- onCancel?: (...args: any[]) => any;
9
- }
10
-
11
- export const showDeleteConfirm = ({
12
- onOk,
13
- onCancel,
14
- }: IProps): Promise<number> => {
15
- return new Promise((resolve, reject) => {
16
- confirm({
17
- title: 'Are you sure delete this item?',
18
- icon: <ExclamationCircleFilled />,
19
- content: 'Some descriptions',
20
- okText: 'Yes',
21
- okType: 'danger',
22
- cancelText: 'No',
23
- async onOk() {
24
- try {
25
- const ret = await onOk?.();
26
- resolve(ret);
27
- console.info(ret);
28
- } catch (error) {
29
- reject(error);
30
- }
31
- },
32
- onCancel() {
33
- onCancel?.();
34
- },
35
- });
36
- });
37
- };
38
-
39
- export default showDeleteConfirm;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
web/src/components/svg-icon.tsx CHANGED
@@ -4,7 +4,6 @@ import { IconComponentProps } from '@ant-design/icons/lib/components/Icon';
4
  const importAll = (requireContext: __WebpackModuleApi.RequireContext) => {
5
  const list = requireContext.keys().map((key) => {
6
  const name = key.replace(/\.\/(.*)\.\w+$/, '$1');
7
- console.log(name, requireContext(key));
8
  return { name, value: requireContext(key) };
9
  });
10
  return list;
 
4
  const importAll = (requireContext: __WebpackModuleApi.RequireContext) => {
5
  const list = requireContext.keys().map((key) => {
6
  const name = key.replace(/\.\/(.*)\.\w+$/, '$1');
 
7
  return { name, value: requireContext(key) };
8
  });
9
  return list;
web/src/hooks/{commonHooks.ts → commonHooks.tsx} RENAMED
@@ -1,5 +1,8 @@
 
 
1
  import isEqual from 'lodash/isEqual';
2
- import { useEffect, useRef, useState } from 'react';
 
3
 
4
  export const useSetModalState = () => {
5
  const [visible, setVisible] = useState(false);
@@ -72,3 +75,43 @@ export function useDynamicSVGImport(
72
 
73
  return { error, loading, SvgIcon: ImportedIconRef.current };
74
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { ExclamationCircleFilled } from '@ant-design/icons';
2
+ import { App } from 'antd';
3
  import isEqual from 'lodash/isEqual';
4
+ import { useCallback, useEffect, useRef, useState } from 'react';
5
+ import { useTranslation } from 'react-i18next';
6
 
7
  export const useSetModalState = () => {
8
  const [visible, setVisible] = useState(false);
 
75
 
76
  return { error, loading, SvgIcon: ImportedIconRef.current };
77
  }
78
+
79
+ interface IProps {
80
+ onOk?: (...args: any[]) => any;
81
+ onCancel?: (...args: any[]) => any;
82
+ }
83
+
84
+ export const useShowDeleteConfirm = () => {
85
+ const { modal } = App.useApp();
86
+ const { t } = useTranslation();
87
+
88
+ const showDeleteConfirm = useCallback(
89
+ ({ onOk, onCancel }: IProps): Promise<number> => {
90
+ return new Promise((resolve, reject) => {
91
+ modal.confirm({
92
+ title: t('common.deleteModalTitle'),
93
+ icon: <ExclamationCircleFilled />,
94
+ // content: 'Some descriptions',
95
+ okText: 'Yes',
96
+ okType: 'danger',
97
+ cancelText: 'No',
98
+ async onOk() {
99
+ try {
100
+ const ret = await onOk?.();
101
+ resolve(ret);
102
+ console.info(ret);
103
+ } catch (error) {
104
+ reject(error);
105
+ }
106
+ },
107
+ onCancel() {
108
+ onCancel?.();
109
+ },
110
+ });
111
+ });
112
+ },
113
+ [t, modal],
114
+ );
115
+
116
+ return showDeleteConfirm;
117
+ };
web/src/hooks/knowledgeHook.ts CHANGED
@@ -1,4 +1,4 @@
1
- import showDeleteConfirm from '@/components/deleting-confirm';
2
  import { IKnowledge } from '@/interfaces/database/knowledge';
3
  import { useCallback, useEffect, useMemo } from 'react';
4
  import { useDispatch, useSearchParams, useSelector } from 'umi';
@@ -17,6 +17,7 @@ export const useDeleteDocumentById = (): {
17
  } => {
18
  const dispatch = useDispatch();
19
  const knowledgeBaseId = useKnowledgeBaseId();
 
20
 
21
  const removeDocument = (documentId: string) => () => {
22
  return dispatch({
@@ -79,6 +80,7 @@ export const useDeleteChunkByIds = (): {
79
  removeChunk: (chunkIds: string[], documentId: string) => Promise<number>;
80
  } => {
81
  const dispatch = useDispatch();
 
82
 
83
  const removeChunk = useCallback(
84
  (chunkIds: string[], documentId: string) => () => {
@@ -97,7 +99,7 @@ export const useDeleteChunkByIds = (): {
97
  (chunkIds: string[], documentId: string): Promise<number> => {
98
  return showDeleteConfirm({ onOk: removeChunk(chunkIds, documentId) });
99
  },
100
- [removeChunk],
101
  );
102
 
103
  return {
 
1
+ import { useShowDeleteConfirm } from '@/hooks/commonHooks';
2
  import { IKnowledge } from '@/interfaces/database/knowledge';
3
  import { useCallback, useEffect, useMemo } from 'react';
4
  import { useDispatch, useSearchParams, useSelector } from 'umi';
 
17
  } => {
18
  const dispatch = useDispatch();
19
  const knowledgeBaseId = useKnowledgeBaseId();
20
+ const showDeleteConfirm = useShowDeleteConfirm();
21
 
22
  const removeDocument = (documentId: string) => () => {
23
  return dispatch({
 
80
  removeChunk: (chunkIds: string[], documentId: string) => Promise<number>;
81
  } => {
82
  const dispatch = useDispatch();
83
+ const showDeleteConfirm = useShowDeleteConfirm();
84
 
85
  const removeChunk = useCallback(
86
  (chunkIds: string[], documentId: string) => () => {
 
99
  (chunkIds: string[], documentId: string): Promise<number> => {
100
  return showDeleteConfirm({ onOk: removeChunk(chunkIds, documentId) });
101
  },
102
+ [removeChunk, showDeleteConfirm],
103
  );
104
 
105
  return {
web/src/layouts/components/header/index.tsx CHANGED
@@ -8,6 +8,7 @@ import styles from './index.less';
8
 
9
  import { useNavigateWithFromState } from '@/hooks/routeHook';
10
  import { useCallback, useMemo } from 'react';
 
11
  import { useLocation } from 'umi';
12
 
13
  const { Header } = Layout;
@@ -18,14 +19,15 @@ const RagHeader = () => {
18
  } = theme.useToken();
19
  const navigate = useNavigateWithFromState();
20
  const { pathname } = useLocation();
 
21
 
22
  const tagsData = useMemo(
23
  () => [
24
- { path: '/knowledge', name: 'Knowledge Base', icon: KnowledgeBaseIcon },
25
- { path: '/chat', name: 'Chat', icon: StarIon },
26
  // { path: '/file', name: 'File Management', icon: FileIcon },
27
  ],
28
- [],
29
  );
30
 
31
  const currentPath = useMemo(() => {
 
8
 
9
  import { useNavigateWithFromState } from '@/hooks/routeHook';
10
  import { useCallback, useMemo } from 'react';
11
+ import { useTranslation } from 'react-i18next';
12
  import { useLocation } from 'umi';
13
 
14
  const { Header } = Layout;
 
19
  } = theme.useToken();
20
  const navigate = useNavigateWithFromState();
21
  const { pathname } = useLocation();
22
+ const { t } = useTranslation('translation', { keyPrefix: 'header' });
23
 
24
  const tagsData = useMemo(
25
  () => [
26
+ { path: '/knowledge', name: t('knowledgeBase'), icon: KnowledgeBaseIcon },
27
+ { path: '/chat', name: t('chat'), icon: StarIon },
28
  // { path: '/file', name: 'File Management', icon: FileIcon },
29
  ],
30
+ [t],
31
  );
32
 
33
  const currentPath = useMemo(() => {
web/src/locales/en.json CHANGED
@@ -1,12 +1,41 @@
1
  {
2
- "login": { "login": "Sign in" },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  "header": {
 
 
4
  "register": "Register",
5
  "signin": "Sign in",
6
  "home": "Home",
7
  "setting": "用户设置",
8
  "logout": "登出"
9
  },
 
 
 
 
 
 
 
10
  "footer": {
11
  "detail": "All rights reserved @ React"
12
  },
 
1
  {
2
+ "common": {
3
+ "delete": "Delete",
4
+ "deleteModalTitle": "Are you sure delete this item?"
5
+ },
6
+ "login": {
7
+ "login": "Sign in",
8
+ "signUp": "Sign up",
9
+ "loginDescription": "We’re so excited to see you again!",
10
+ "registerDescription": "Glad to have you on board!",
11
+ "emailLabel": "Email",
12
+ "emailPlaceholder": "Please input email",
13
+ "passwordLabel": "Password",
14
+ "passwordPlaceholder": "Please input password",
15
+ "rememberMe": "Remember me",
16
+ "signInTip": "Don’t have an account?",
17
+ "signUpTip": "Already have an account?",
18
+ "nicknameLabel": "Nickname",
19
+ "nicknamePlaceholder": "Please input nickname",
20
+ "register": "Create an account",
21
+ "continue": "Continue"
22
+ },
23
  "header": {
24
+ "knowledgeBase": "Knowledge Base",
25
+ "chat": "Chat",
26
  "register": "Register",
27
  "signin": "Sign in",
28
  "home": "Home",
29
  "setting": "用户设置",
30
  "logout": "登出"
31
  },
32
+ "knowledgeList": {
33
+ "welcome": "Welcome back",
34
+ "description": "Which database are we going to use today?",
35
+ "createKnowledgeBase": "Create knowledge base",
36
+ "name": "Name",
37
+ "namePlaceholder": "Please input name!"
38
+ },
39
  "footer": {
40
  "detail": "All rights reserved @ React"
41
  },
web/src/pages/add-knowledge/components/knowledge-file/model.ts CHANGED
@@ -203,7 +203,6 @@ const model: DvaModel<KFModelState> = {
203
  const documentId = payload;
204
  try {
205
  const ret = yield call(getDocumentFile, documentId);
206
- console.info('fetch_document_file:', ret);
207
  return ret;
208
  } catch (error) {
209
  console.warn(error);
@@ -238,7 +237,6 @@ const model: DvaModel<KFModelState> = {
238
  payload: { current: 1, pageSize: 10 },
239
  });
240
  }
241
- console.info(location);
242
  });
243
  },
244
  },
 
203
  const documentId = payload;
204
  try {
205
  const ret = yield call(getDocumentFile, documentId);
 
206
  return ret;
207
  } catch (error) {
208
  console.warn(error);
 
237
  payload: { current: 1, pageSize: 10 },
238
  });
239
  }
 
240
  });
241
  },
242
  },
web/src/pages/add-knowledge/components/knowledge-file/parsing-action-cell/index.tsx CHANGED
@@ -1,4 +1,4 @@
1
- import showDeleteConfirm from '@/components/deleting-confirm';
2
  import { useRemoveDocument } from '@/hooks/documentHooks';
3
  import { IKnowledgeFile } from '@/interfaces/database/knowledge';
4
  import { api_host } from '@/utils/api';
@@ -31,6 +31,7 @@ const ParsingActionCell = ({
31
  const isRunning = isParserRunning(record.run);
32
 
33
  const removeDocument = useRemoveDocument(documentId);
 
34
 
35
  const onRmDocument = () => {
36
  if (!isRunning) {
 
1
+ import { useShowDeleteConfirm } from '@/hooks/commonHooks';
2
  import { useRemoveDocument } from '@/hooks/documentHooks';
3
  import { IKnowledgeFile } from '@/interfaces/database/knowledge';
4
  import { api_host } from '@/utils/api';
 
31
  const isRunning = isParserRunning(record.run);
32
 
33
  const removeDocument = useRemoveDocument(documentId);
34
+ const showDeleteConfirm = useShowDeleteConfirm();
35
 
36
  const onRmDocument = () => {
37
  if (!isRunning) {
web/src/pages/chat/hooks.ts CHANGED
@@ -1,7 +1,6 @@
1
- import showDeleteConfirm from '@/components/deleting-confirm';
2
  import { MessageType } from '@/constants/chat';
3
  import { fileIconMap } from '@/constants/common';
4
- import { useSetModalState } from '@/hooks/commonHooks';
5
  import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks';
6
  import { IConversation, IDialog } from '@/interfaces/database/chat';
7
  import { IChunk } from '@/interfaces/database/knowledge';
@@ -150,6 +149,7 @@ export const useSelectPromptConfigParameters = (): VariableTableDataType[] => {
150
 
151
  export const useRemoveDialog = () => {
152
  const dispatch = useDispatch();
 
153
 
154
  const removeDocument = (dialogIds: Array<string>) => () => {
155
  return dispatch({
@@ -668,6 +668,7 @@ export const useRemoveConversation = () => {
668
  const dispatch = useDispatch();
669
  const { dialogId } = useGetChatSearchParams();
670
  const { handleClickConversation } = useClickConversationCard();
 
671
 
672
  const removeConversation = (conversationIds: Array<string>) => async () => {
673
  const ret = await dispatch<any>({
 
 
1
  import { MessageType } from '@/constants/chat';
2
  import { fileIconMap } from '@/constants/common';
3
+ import { useSetModalState, useShowDeleteConfirm } from '@/hooks/commonHooks';
4
  import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks';
5
  import { IConversation, IDialog } from '@/interfaces/database/chat';
6
  import { IChunk } from '@/interfaces/database/knowledge';
 
149
 
150
  export const useRemoveDialog = () => {
151
  const dispatch = useDispatch();
152
+ const showDeleteConfirm = useShowDeleteConfirm();
153
 
154
  const removeDocument = (dialogIds: Array<string>) => () => {
155
  return dispatch({
 
668
  const dispatch = useDispatch();
669
  const { dialogId } = useGetChatSearchParams();
670
  const { handleClickConversation } = useClickConversationCard();
671
+ const showDeleteConfirm = useShowDeleteConfirm();
672
 
673
  const removeConversation = (conversationIds: Array<string>) => async () => {
674
  const ret = await dispatch<any>({
web/src/pages/knowledge/index.less CHANGED
@@ -44,4 +44,7 @@
44
  .knowledgeCardContainer {
45
  padding: 0 60px;
46
  overflow: auto;
 
 
 
47
  }
 
44
  .knowledgeCardContainer {
45
  padding: 0 60px;
46
  overflow: auto;
47
+ .knowledgeEmpty {
48
+ width: 100%;
49
+ }
50
  }
web/src/pages/knowledge/index.tsx CHANGED
@@ -6,22 +6,22 @@ import { Button, Empty, Flex, Space, Spin } from 'antd';
6
  import KnowledgeCard from './knowledge-card';
7
  import KnowledgeCreatingModal from './knowledge-creating-modal';
8
 
 
9
  import styles from './index.less';
10
 
11
  const Knowledge = () => {
12
  const { list, loading } = useFetchKnowledgeList();
13
  const userInfo = useSelectUserInfo();
 
14
 
15
  return (
16
  <Flex className={styles.knowledge} vertical flex={1}>
17
  <div className={styles.topWrapper}>
18
  <div>
19
  <span className={styles.title}>
20
- Welcome back, {userInfo.nickname}
21
  </span>
22
- <p className={styles.description}>
23
- Which database are we going to use today?
24
- </p>
25
  </div>
26
  <Space size={'large'}>
27
  {/* <Button icon={<FilterIcon />} className={styles.filterButton}>
@@ -38,7 +38,7 @@ const Knowledge = () => {
38
  }}
39
  className={styles.topButton}
40
  >
41
- Create knowledge base
42
  </Button>
43
  <KnowledgeCreatingModal
44
  visible={visible}
@@ -62,7 +62,7 @@ const Knowledge = () => {
62
  );
63
  })
64
  ) : (
65
- <Empty></Empty>
66
  )}
67
  </Flex>
68
  </Spin>
 
6
  import KnowledgeCard from './knowledge-card';
7
  import KnowledgeCreatingModal from './knowledge-creating-modal';
8
 
9
+ import { useTranslation } from 'react-i18next';
10
  import styles from './index.less';
11
 
12
  const Knowledge = () => {
13
  const { list, loading } = useFetchKnowledgeList();
14
  const userInfo = useSelectUserInfo();
15
+ const { t } = useTranslation('translation', { keyPrefix: 'knowledgeList' });
16
 
17
  return (
18
  <Flex className={styles.knowledge} vertical flex={1}>
19
  <div className={styles.topWrapper}>
20
  <div>
21
  <span className={styles.title}>
22
+ {t('welcome')}, {userInfo.nickname}
23
  </span>
24
+ <p className={styles.description}>{t('description')}</p>
 
 
25
  </div>
26
  <Space size={'large'}>
27
  {/* <Button icon={<FilterIcon />} className={styles.filterButton}>
 
38
  }}
39
  className={styles.topButton}
40
  >
41
+ {t('createKnowledgeBase')}
42
  </Button>
43
  <KnowledgeCreatingModal
44
  visible={visible}
 
62
  );
63
  })
64
  ) : (
65
+ <Empty className={styles.knowledgeEmpty}></Empty>
66
  )}
67
  </Flex>
68
  </Spin>
web/src/pages/knowledge/knowledge-card/index.tsx CHANGED
@@ -1,5 +1,6 @@
1
  import { ReactComponent as MoreIcon } from '@/assets/svg/more.svg';
2
  import { KnowledgeRouteKey } from '@/constants/knowledge';
 
3
  import { IKnowledge } from '@/interfaces/database/knowledge';
4
  import { formatDate } from '@/utils/date';
5
  import {
@@ -11,7 +12,6 @@ import {
11
  import { Avatar, Card, Dropdown, MenuProps, Space } from 'antd';
12
  import { useDispatch, useNavigate } from 'umi';
13
 
14
- import showDeleteConfirm from '@/components/deleting-confirm';
15
  import styles from './index.less';
16
 
17
  interface IProps {
@@ -21,6 +21,7 @@ interface IProps {
21
  const KnowledgeCard = ({ item }: IProps) => {
22
  const navigate = useNavigate();
23
  const dispatch = useDispatch();
 
24
 
25
  const removeKnowledge = () => {
26
  return dispatch({
 
1
  import { ReactComponent as MoreIcon } from '@/assets/svg/more.svg';
2
  import { KnowledgeRouteKey } from '@/constants/knowledge';
3
+ import { useShowDeleteConfirm } from '@/hooks/commonHooks';
4
  import { IKnowledge } from '@/interfaces/database/knowledge';
5
  import { formatDate } from '@/utils/date';
6
  import {
 
12
  import { Avatar, Card, Dropdown, MenuProps, Space } from 'antd';
13
  import { useDispatch, useNavigate } from 'umi';
14
 
 
15
  import styles from './index.less';
16
 
17
  interface IProps {
 
21
  const KnowledgeCard = ({ item }: IProps) => {
22
  const navigate = useNavigate();
23
  const dispatch = useDispatch();
24
+ const showDeleteConfirm = useShowDeleteConfirm();
25
 
26
  const removeKnowledge = () => {
27
  return dispatch({
web/src/pages/knowledge/knowledge-creating-modal/index.tsx CHANGED
@@ -1,6 +1,7 @@
1
  import { IModalManagerChildrenProps } from '@/components/modal-manager';
2
  import { KnowledgeRouteKey } from '@/constants/knowledge';
3
  import { Form, Input, Modal } from 'antd';
 
4
  import { useDispatch, useNavigate, useSelector } from 'umi';
5
 
6
  type FieldType = {
@@ -17,6 +18,7 @@ const KnowledgeCreatingModal = ({
17
  (state: any) => state.loading.effects['kSModel/createKb'],
18
  );
19
  const navigate = useNavigate();
 
20
 
21
  const handleOk = async () => {
22
  const ret = await form.validateFields();
@@ -50,7 +52,7 @@ const KnowledgeCreatingModal = ({
50
 
51
  return (
52
  <Modal
53
- title="Create knowledge base"
54
  open={visible}
55
  onOk={handleOk}
56
  onCancel={handleCancel}
@@ -67,11 +69,11 @@ const KnowledgeCreatingModal = ({
67
  form={form}
68
  >
69
  <Form.Item<FieldType>
70
- label="Name"
71
  name="name"
72
- rules={[{ required: true, message: 'Please input name!' }]}
73
  >
74
- <Input />
75
  </Form.Item>
76
  </Form>
77
  </Modal>
 
1
  import { IModalManagerChildrenProps } from '@/components/modal-manager';
2
  import { KnowledgeRouteKey } from '@/constants/knowledge';
3
  import { Form, Input, Modal } from 'antd';
4
+ import { useTranslation } from 'react-i18next';
5
  import { useDispatch, useNavigate, useSelector } from 'umi';
6
 
7
  type FieldType = {
 
18
  (state: any) => state.loading.effects['kSModel/createKb'],
19
  );
20
  const navigate = useNavigate();
21
+ const { t } = useTranslation('translation', { keyPrefix: 'knowledgeList' });
22
 
23
  const handleOk = async () => {
24
  const ret = await form.validateFields();
 
52
 
53
  return (
54
  <Modal
55
+ title={t('createKnowledgeBase')}
56
  open={visible}
57
  onOk={handleOk}
58
  onCancel={handleCancel}
 
69
  form={form}
70
  >
71
  <Form.Item<FieldType>
72
+ label={t('name')}
73
  name="name"
74
+ rules={[{ required: true, message: t('namePlaceholder') }]}
75
  >
76
+ <Input placeholder={t('namePlaceholder')} />
77
  </Form.Item>
78
  </Form>
79
  </Modal>
web/src/pages/login/index.tsx CHANGED
@@ -1,3 +1,4 @@
 
1
  import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks';
2
  import { rsaPsw } from '@/utils';
3
  import { Button, Checkbox, Form, Input } from 'antd';
@@ -6,7 +7,6 @@ import { useTranslation } from 'react-i18next';
6
  import { Icon, useNavigate } from 'umi';
7
  import RightPanel from './right-panel';
8
 
9
- import { useLogin, useRegister } from '@/hooks/loginHooks';
10
  import styles from './index.less';
11
 
12
  const Login = () => {
@@ -14,7 +14,7 @@ const Login = () => {
14
  const navigate = useNavigate();
15
  const login = useLogin();
16
  const register = useRegister();
17
- const { t } = useTranslation();
18
 
19
  // TODO: When the server address request is not accessible, the value of dva-loading always remains true.
20
 
@@ -75,13 +75,11 @@ const Login = () => {
75
  <div className={styles.loginLeft}>
76
  <div className={styles.leftContainer}>
77
  <div className={styles.loginTitle}>
78
- <div>
79
- {title === 'login' ? t('login.login') : 'Create an account'}
80
- </div>
81
  <span>
82
  {title === 'login'
83
- ? 'We’re so excited to see you again!'
84
- : 'Glad to have you on board!'}
85
  </span>
86
  </div>
87
 
@@ -94,55 +92,52 @@ const Login = () => {
94
  <Form.Item
95
  {...formItemLayout}
96
  name="email"
97
- label="Email"
98
- rules={[{ required: true, message: 'Please input value' }]}
99
  >
100
- <Input size="large" placeholder="Please input value" />
101
  </Form.Item>
102
  {title === 'register' && (
103
  <Form.Item
104
  {...formItemLayout}
105
  name="nickname"
106
- label="Nickname"
107
- rules={[
108
- { required: true, message: 'Please input your nickname' },
109
- ]}
110
  >
111
- <Input size="large" placeholder="Please input your nickname" />
112
  </Form.Item>
113
  )}
114
  <Form.Item
115
  {...formItemLayout}
116
  name="password"
117
- label="Password"
118
- rules={[{ required: true, message: 'Please input value' }]}
119
  >
120
  <Input.Password
121
  size="large"
122
- placeholder="Please input value"
123
  onPressEnter={onCheck}
124
  />
125
  </Form.Item>
126
  {title === 'login' && (
127
  <Form.Item name="remember" valuePropName="checked">
128
- <Checkbox> Remember me</Checkbox>
129
  </Form.Item>
130
  )}
131
  <div>
132
- {' '}
133
  {title === 'login' && (
134
  <div>
135
- Don’t have an account?
136
  <Button type="link" onClick={changeTitle}>
137
- Sign up
138
  </Button>
139
  </div>
140
  )}
141
  {title === 'register' && (
142
  <div>
143
- Already have an account?
144
  <Button type="link" onClick={changeTitle}>
145
- Sign in
146
  </Button>
147
  </div>
148
  )}
@@ -154,7 +149,7 @@ const Login = () => {
154
  onClick={onCheck}
155
  loading={signLoading}
156
  >
157
- {title === 'login' ? 'Sign in' : 'Continue'}
158
  </Button>
159
  {title === 'login' && (
160
  <>
 
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';
 
7
  import { Icon, useNavigate } from 'umi';
8
  import RightPanel from './right-panel';
9
 
 
10
  import styles from './index.less';
11
 
12
  const Login = () => {
 
14
  const navigate = useNavigate();
15
  const login = useLogin();
16
  const register = useRegister();
17
+ const { t } = useTranslation('translation', { keyPrefix: 'login' });
18
 
19
  // TODO: When the server address request is not accessible, the value of dva-loading always remains true.
20
 
 
75
  <div className={styles.loginLeft}>
76
  <div className={styles.leftContainer}>
77
  <div className={styles.loginTitle}>
78
+ <div>{title === 'login' ? t('login') : 'Create an account'}</div>
 
 
79
  <span>
80
  {title === 'login'
81
+ ? t('loginDescription')
82
+ : t('registerDescription')}
83
  </span>
84
  </div>
85
 
 
92
  <Form.Item
93
  {...formItemLayout}
94
  name="email"
95
+ label={t('emailLabel')}
96
+ rules={[{ required: true, message: t('emailPlaceholder') }]}
97
  >
98
+ <Input size="large" placeholder={t('emailPlaceholder')} />
99
  </Form.Item>
100
  {title === 'register' && (
101
  <Form.Item
102
  {...formItemLayout}
103
  name="nickname"
104
+ label={t('nicknameLabel')}
105
+ rules={[{ required: true, message: t('nicknamePlaceholder') }]}
 
 
106
  >
107
+ <Input size="large" placeholder={t('nicknamePlaceholder')} />
108
  </Form.Item>
109
  )}
110
  <Form.Item
111
  {...formItemLayout}
112
  name="password"
113
+ label={t('passwordLabel')}
114
+ rules={[{ required: true, message: t('passwordPlaceholder') }]}
115
  >
116
  <Input.Password
117
  size="large"
118
+ placeholder={t('passwordPlaceholder')}
119
  onPressEnter={onCheck}
120
  />
121
  </Form.Item>
122
  {title === 'login' && (
123
  <Form.Item name="remember" valuePropName="checked">
124
+ <Checkbox> {t('rememberMe')}</Checkbox>
125
  </Form.Item>
126
  )}
127
  <div>
 
128
  {title === 'login' && (
129
  <div>
130
+ {t('signInTip')}
131
  <Button type="link" onClick={changeTitle}>
132
+ {t('signUp')}
133
  </Button>
134
  </div>
135
  )}
136
  {title === 'register' && (
137
  <div>
138
+ {t('signUpTip')}
139
  <Button type="link" onClick={changeTitle}>
140
+ {t('login')}
141
  </Button>
142
  </div>
143
  )}
 
149
  onClick={onCheck}
150
  loading={signLoading}
151
  >
152
+ {title === 'login' ? t('login') : t('continue')}
153
  </Button>
154
  {title === 'login' && (
155
  <>