* feat: fixed the issue where the next button would float above the file list on the file upload page. * feat: fixed the issue where the last message would keep loading if the backend reported an error during chat. * fix: fixed the issue that the prompt word for registering an account is not in English
198 lines
6.1 KiB
TypeScript
198 lines
6.1 KiB
TypeScript
import { rsaPsw } from '@/utils';
|
||
import { Button, Checkbox, Form, Input } from 'antd';
|
||
import { useEffect, useState } from 'react';
|
||
import { Icon, useDispatch, useNavigate, useSelector } from 'umi';
|
||
import styles from './index.less';
|
||
|
||
const 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,
|
||
);
|
||
|
||
// 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 changeTitle = () => {
|
||
setTitle((title) => (title === 'login' ? 'register' : 'login'));
|
||
};
|
||
const [form] = Form.useForm();
|
||
const [checkNick, setCheckNick] = useState(false);
|
||
|
||
useEffect(() => {
|
||
form.validateFields(['nickname']);
|
||
}, [checkNick, form]);
|
||
|
||
const onCheck = async () => {
|
||
try {
|
||
const params = await form.validateFields();
|
||
|
||
var rsaPassWord = rsaPsw(params.password);
|
||
if (title === 'login') {
|
||
const retcode = await dispatch<any>({
|
||
type: 'loginModel/login',
|
||
payload: {
|
||
email: params.email,
|
||
password: rsaPassWord,
|
||
},
|
||
});
|
||
if (retcode === 0) {
|
||
navigate('/knowledge');
|
||
}
|
||
} else {
|
||
// TODO: Type needs to be improved
|
||
const retcode = await dispatch<any>({
|
||
type: 'loginModel/register',
|
||
payload: {
|
||
nickname: params.nickname,
|
||
email: params.email,
|
||
password: rsaPassWord,
|
||
},
|
||
});
|
||
if (retcode === 0) {
|
||
setTitle('login');
|
||
}
|
||
}
|
||
} catch (errorInfo) {
|
||
console.log('Failed:', errorInfo);
|
||
}
|
||
};
|
||
const formItemLayout = {
|
||
labelCol: { span: 6 },
|
||
// wrapperCol: { span: 8 },
|
||
};
|
||
|
||
const toGoogle = () => {
|
||
window.location.href =
|
||
'https://github.com/login/oauth/authorize?scope=user:email&client_id=302129228f0d96055bee';
|
||
};
|
||
return (
|
||
<div className={styles.loginPage}>
|
||
<div className={styles.loginLeft}>
|
||
<div className={styles.modal}>
|
||
<div className={styles.loginTitle}>
|
||
<div>{title === 'login' ? 'Sign in' : 'Create an account'}</div>
|
||
<span>
|
||
{title === 'login'
|
||
? 'We’re so excited to see you again!'
|
||
: 'Glad to have you on board!'}
|
||
</span>
|
||
</div>
|
||
|
||
<Form
|
||
form={form}
|
||
layout="vertical"
|
||
name="dynamic_rule"
|
||
style={{ maxWidth: 600 }}
|
||
>
|
||
<Form.Item
|
||
{...formItemLayout}
|
||
name="email"
|
||
label="Email"
|
||
rules={[{ required: true, message: 'Please input value' }]}
|
||
>
|
||
<Input size="large" placeholder="Please input value" />
|
||
</Form.Item>
|
||
{title === 'register' && (
|
||
<Form.Item
|
||
{...formItemLayout}
|
||
name="nickname"
|
||
label="Nickname"
|
||
rules={[
|
||
{ required: true, message: 'Please input your nickname' },
|
||
]}
|
||
>
|
||
<Input size="large" placeholder="Please input your nickname" />
|
||
</Form.Item>
|
||
)}
|
||
<Form.Item
|
||
{...formItemLayout}
|
||
name="password"
|
||
label="Password"
|
||
rules={[{ required: true, message: 'Please input value' }]}
|
||
>
|
||
<Input.Password
|
||
size="large"
|
||
placeholder="Please input value"
|
||
onPressEnter={onCheck}
|
||
/>
|
||
</Form.Item>
|
||
{title === 'login' && (
|
||
<Form.Item name="remember" valuePropName="checked">
|
||
<Checkbox> Remember me</Checkbox>
|
||
</Form.Item>
|
||
)}
|
||
<div>
|
||
{' '}
|
||
{title === 'login' && (
|
||
<div>
|
||
Don’t have an account?
|
||
<Button type="link" onClick={changeTitle}>
|
||
Sign up
|
||
</Button>
|
||
</div>
|
||
)}
|
||
{title === 'register' && (
|
||
<div>
|
||
Already have an account?
|
||
<Button type="link" onClick={changeTitle}>
|
||
Sign in
|
||
</Button>
|
||
</div>
|
||
)}
|
||
</div>
|
||
<Button
|
||
type="primary"
|
||
block
|
||
size="large"
|
||
onClick={onCheck}
|
||
loading={signLoading}
|
||
>
|
||
{title === 'login' ? 'Sign in' : 'Continue'}
|
||
</Button>
|
||
{title === 'login' && (
|
||
<>
|
||
{/* <Button
|
||
block
|
||
size="large"
|
||
onClick={toGoogle}
|
||
style={{ marginTop: 15 }}
|
||
>
|
||
<div>
|
||
<Icon
|
||
icon="local:google"
|
||
style={{ verticalAlign: 'middle', marginRight: 5 }}
|
||
/>
|
||
Sign in with Google
|
||
</div>
|
||
</Button> */}
|
||
<Button
|
||
block
|
||
size="large"
|
||
onClick={toGoogle}
|
||
style={{ marginTop: 15 }}
|
||
>
|
||
<div>
|
||
<Icon
|
||
icon="local:github"
|
||
style={{ verticalAlign: 'middle', marginRight: 5 }}
|
||
/>
|
||
Sign in with Github
|
||
</div>
|
||
</Button>
|
||
</>
|
||
)}
|
||
</Form>
|
||
</div>
|
||
</div>
|
||
<div className={styles.loginRight}></div>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
export default Login;
|