浏览代码

feat: enlarge the size of the next button for uploading files and add locale config to global.ts (#195)

feat: enlarge the size of the next button for uploading files
feat: add locale config to global.ts
tags/v0.1.0
balibabu 1年前
父节点
当前提交
e3c24e653e
没有帐户链接到提交者的电子邮件

+ 1
- 0
web/src/global.ts 查看文件

import '@/locales/config';

+ 44
- 0
web/src/hooks/loginHooks.ts 查看文件

import { useCallback } from 'react';
import { useDispatch } from 'umi';

export interface ILoginRequestBody {
email: string;
password: string;
}

export interface IRegisterRequestBody extends ILoginRequestBody {
nickname: string;
}

export const useLogin = () => {
const dispatch = useDispatch();

const login = useCallback(
(requestBody: ILoginRequestBody) => {
// TODO: Type needs to be improved
return dispatch<any>({
type: 'loginModel/login',
payload: requestBody,
});
},
[dispatch],
);

return login;
};

export const useRegister = () => {
const dispatch = useDispatch();

const register = useCallback(
(requestBody: IRegisterRequestBody) => {
return dispatch<any>({
type: 'loginModel/register',
payload: requestBody,
});
},
[dispatch],
);

return register;
};

+ 11
- 11
web/src/locales/config.ts 查看文件

import translation_zh from './zh.json'; import translation_zh from './zh.json';
const resources = { const resources = {
en: {
translation: translation_en,
},
zh: {
translation: translation_zh,
},
en: {
translation: translation_en,
},
zh: {
translation: translation_zh,
},
}; };
i18n.use(initReactI18next).init({ i18n.use(initReactI18next).init({
resources,
lng: 'zh',
interpolation: {
escapeValue: false,
},
resources,
lng: 'en',
interpolation: {
escapeValue: false,
},
}); });
export default i18n; export default i18n;

+ 20
- 19
web/src/locales/en.json 查看文件

{ {
"header": {
"register": "Register",
"signin": "Sign In",
"home": "Home",
"setting": "用户设置",
"logout": "登出"
},
"footer": {
"detail": "All rights reserved @ React"
},
"layout": {
"file": "file",
"knowledge": "knowledge",
"chat": "chat"
},
"setting": {
"btn": "en"
}
}
"login": { "login": "Sign in" },
"header": {
"register": "Register",
"signin": "Sign in",
"home": "Home",
"setting": "用户设置",
"logout": "登出"
},
"footer": {
"detail": "All rights reserved @ React"
},
"layout": {
"file": "file",
"knowledge": "knowledge",
"chat": "chat"
},
"setting": {
"btn": "en"
}
}

+ 20
- 19
web/src/locales/zh.json 查看文件

{ {
"header": {
"register": "注册",
"signin": "登陆",
"home": "首页",
"setting": "user setting",
"logout": "logout"
},
"footer": {
"detail": "版权所有 @ React"
},
"layout": {
"file": "文件",
"knowledge": "知识库",
"chat": "聊天"
},
"setting": {
"btn": "中文"
}
}
"login": { "login": "登录" },
"header": {
"register": "注册",
"signin": "登陆",
"home": "首页",
"setting": "user setting",
"logout": "logout"
},
"footer": {
"detail": "版权所有 @ React"
},
"layout": {
"file": "文件",
"knowledge": "知识库",
"chat": "聊天"
},
"setting": {
"btn": "中文"
}
}

+ 11
- 3
web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.less 查看文件

.uploadWrapper { .uploadWrapper {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 32px;
padding: 64px 32px 32px;
height: 100%; height: 100%;
.backToList { .backToList {
display: none;
padding-bottom: 60px; padding-bottom: 60px;
} }
.footer { .footer {
text-align: right;
text-align: center;
padding-top: 16px; padding-top: 16px;
.nextButton { .nextButton {
background-color: @purple;
// background-color: @purple;
font-weight: 700;
font-size: 24px;
display: inline-flex;
align-items: center;
padding: 26px 40px;
justify-content: center;
width: 10%;
} }
} }
.uploadContent { .uploadContent {

+ 2
- 1
web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx 查看文件

<section className={styles.footer}> <section className={styles.footer}>
<Button <Button
type="primary" type="primary"
// className={styles.nextButton}
className={styles.nextButton}
onClick={handleNextClick} onClick={handleNextClick}
disabled={!enabled} disabled={!enabled}
size="large"
> >
Next Next
</Button> </Button>

+ 26
- 26
web/src/pages/login/index.tsx 查看文件

import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks';
import { rsaPsw } from '@/utils'; import { rsaPsw } from '@/utils';
import { Button, Checkbox, Form, Input } from 'antd'; import { Button, Checkbox, Form, Input } from 'antd';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { Icon, useDispatch, useNavigate, useSelector } from 'umi';
import { useTranslation } from 'react-i18next';
import { Icon, useNavigate } from 'umi';
import RightPanel from './right-panel'; import RightPanel from './right-panel';
import { useLogin, useRegister } from '@/hooks/loginHooks';
import styles from './index.less'; import styles from './index.less';
const Login = () => { const Login = () => {
const [title, setTitle] = useState('login'); const [title, setTitle] = useState('login');
let navigate = useNavigate();
const dispatch = useDispatch();
const effectsLoading: any = useSelector<any>( // TODO: Type needs to be improved
(state) => state.loading.effects,
);
const navigate = useNavigate();
const login = useLogin();
const register = useRegister();
const { t } = useTranslation();
// TODO: When the server address request is not accessible, the value of dva-loading always remains true. // TODO: When the server address request is not accessible, the value of dva-loading always remains true.
const signLoading =
effectsLoading['loginModel/login'] || effectsLoading['loginModel/register'];
const signLoading = useOneNamespaceEffectsLoading('loginModel', [
'login',
'register',
]);
const changeTitle = () => { const changeTitle = () => {
setTitle((title) => (title === 'login' ? 'register' : 'login')); setTitle((title) => (title === 'login' ? 'register' : 'login'));
}; };
const [form] = Form.useForm(); const [form] = Form.useForm();
const [checkNick, setCheckNick] = useState(false);
useEffect(() => { useEffect(() => {
form.validateFields(['nickname']); form.validateFields(['nickname']);
}, [checkNick, form]);
}, [form]);
const onCheck = async () => { const onCheck = async () => {
try { try {
const params = await form.validateFields(); const params = await form.validateFields();
var rsaPassWord = rsaPsw(params.password);
const rsaPassWord = rsaPsw(params.password) as string;
if (title === 'login') { if (title === 'login') {
const retcode = await dispatch<any>({
type: 'loginModel/login',
payload: {
email: params.email,
password: rsaPassWord,
},
const retcode = await login({
email: params.email,
password: rsaPassWord,
}); });
if (retcode === 0) { if (retcode === 0) {
navigate('/knowledge'); navigate('/knowledge');
} }
} else { } else {
// TODO: Type needs to be improved
const retcode = await dispatch<any>({
type: 'loginModel/register',
payload: {
nickname: params.nickname,
email: params.email,
password: rsaPassWord,
},
const retcode = await register({
nickname: params.nickname,
email: params.email,
password: rsaPassWord,
}); });
if (retcode === 0) { if (retcode === 0) {
setTitle('login'); setTitle('login');
window.location.href = window.location.href =
'https://github.com/login/oauth/authorize?scope=user:email&client_id=302129228f0d96055bee'; 'https://github.com/login/oauth/authorize?scope=user:email&client_id=302129228f0d96055bee';
}; };
return ( return (
<div className={styles.loginPage}> <div className={styles.loginPage}>
<div className={styles.loginLeft}> <div className={styles.loginLeft}>
<div className={styles.leftContainer}> <div className={styles.leftContainer}>
<div className={styles.loginTitle}> <div className={styles.loginTitle}>
<div>{title === 'login' ? 'Sign in' : 'Create an account'}</div>
<div>
{title === 'login' ? t('login.login') : 'Create an account'}
</div>
<span> <span>
{title === 'login' {title === 'login'
? 'We’re so excited to see you again!' ? 'We’re so excited to see you again!'

正在加载...
取消
保存