2024-01-29 19:28:39 +08:00
|
|
|
|
import { rsaPsw } from '@/utils';
|
|
|
|
|
|
import { Button, Checkbox, Form, Input } from 'antd';
|
|
|
|
|
|
import { FC, useEffect, useState } from 'react';
|
|
|
|
|
|
import { Dispatch, Icon, connect, useNavigate } from 'umi';
|
2024-01-17 09:37:01 +08:00
|
|
|
|
import styles from './index.less';
|
2024-01-18 18:27:38 +08:00
|
|
|
|
|
2024-01-17 09:37:01 +08:00
|
|
|
|
interface LoginProps {
|
|
|
|
|
|
dispatch: Dispatch;
|
|
|
|
|
|
}
|
2024-01-29 19:28:39 +08:00
|
|
|
|
const View: FC<LoginProps> = ({ dispatch }) => {
|
|
|
|
|
|
let navigate = useNavigate();
|
|
|
|
|
|
const [title, setTitle] = useState('login');
|
2024-01-17 09:37:01 +08:00
|
|
|
|
const changeTitle = () => {
|
2024-01-29 19:28:39 +08:00
|
|
|
|
setTitle((title) => (title === 'login' ? 'register' : 'login'));
|
|
|
|
|
|
};
|
2024-01-17 09:37:01 +08:00
|
|
|
|
const [form] = Form.useForm();
|
|
|
|
|
|
const [checkNick, setCheckNick] = useState(false);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
form.validateFields(['nickname']);
|
|
|
|
|
|
}, [checkNick, form]);
|
|
|
|
|
|
|
|
|
|
|
|
const onCheck = async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const params = await form.validateFields();
|
|
|
|
|
|
|
2024-01-29 19:28:39 +08:00
|
|
|
|
var rsaPassWord = rsaPsw(params.password);
|
2024-01-17 09:37:01 +08:00
|
|
|
|
if (title === 'login') {
|
2024-01-29 19:28:39 +08:00
|
|
|
|
const ret = await dispatch({
|
2024-01-17 09:37:01 +08:00
|
|
|
|
type: 'loginModel/login',
|
|
|
|
|
|
payload: {
|
|
|
|
|
|
email: params.email,
|
2024-01-29 19:28:39 +08:00
|
|
|
|
password: rsaPassWord,
|
|
|
|
|
|
},
|
2024-01-17 09:37:01 +08:00
|
|
|
|
});
|
2024-01-29 19:28:39 +08:00
|
|
|
|
console.info(ret);
|
|
|
|
|
|
navigate('/knowledge');
|
2024-01-17 09:37:01 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
dispatch({
|
|
|
|
|
|
type: 'loginModel/register',
|
|
|
|
|
|
payload: {
|
|
|
|
|
|
nickname: params.nickname,
|
|
|
|
|
|
email: params.email,
|
|
|
|
|
|
password: rsaPassWord,
|
|
|
|
|
|
},
|
|
|
|
|
|
callback() {
|
2024-01-29 19:28:39 +08:00
|
|
|
|
setTitle('login');
|
|
|
|
|
|
},
|
2024-01-17 09:37:01 +08:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (errorInfo) {
|
|
|
|
|
|
console.log('Failed:', errorInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const formItemLayout = {
|
|
|
|
|
|
labelCol: { span: 6 },
|
|
|
|
|
|
// wrapperCol: { span: 8 },
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const toGoogle = () => {
|
2024-01-29 19:28:39 +08:00
|
|
|
|
window.location.href =
|
|
|
|
|
|
'https://github.com/login/oauth/authorize?scope=user:email&client_id=302129228f0d96055bee';
|
|
|
|
|
|
};
|
2024-01-17 09:37:01 +08:00
|
|
|
|
return (
|
|
|
|
|
|
<div className={styles.loginPage}>
|
|
|
|
|
|
<div className={styles.loginLeft}>
|
|
|
|
|
|
<div className={styles.modal}>
|
|
|
|
|
|
<div className={styles.loginTitle}>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
<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!'}
|
2024-01-17 09:37:01 +08:00
|
|
|
|
</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2024-01-29 19:28:39 +08:00
|
|
|
|
<Form
|
|
|
|
|
|
form={form}
|
|
|
|
|
|
layout="vertical"
|
|
|
|
|
|
name="dynamic_rule"
|
|
|
|
|
|
style={{ maxWidth: 600 }}
|
|
|
|
|
|
>
|
2024-01-17 09:37:01 +08:00
|
|
|
|
<Form.Item
|
|
|
|
|
|
{...formItemLayout}
|
|
|
|
|
|
name="email"
|
|
|
|
|
|
label="Email"
|
2024-01-19 18:35:24 +08:00
|
|
|
|
rules={[{ required: true, message: 'Please input value' }]}
|
2024-01-17 09:37:01 +08:00
|
|
|
|
>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
<Input size="large" placeholder="Please input value" />
|
2024-01-17 09:37:01 +08:00
|
|
|
|
</Form.Item>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
{title === 'register' && (
|
|
|
|
|
|
<Form.Item
|
2024-01-17 09:37:01 +08:00
|
|
|
|
{...formItemLayout}
|
|
|
|
|
|
name="nickname"
|
|
|
|
|
|
label="Nickname"
|
2024-01-29 19:28:39 +08:00
|
|
|
|
rules={[
|
|
|
|
|
|
{ required: true, message: 'Please input your nickname' },
|
|
|
|
|
|
]}
|
2024-01-17 09:37:01 +08:00
|
|
|
|
>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
<Input size="large" placeholder="Please input your nickname" />
|
2024-01-17 09:37:01 +08:00
|
|
|
|
</Form.Item>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
)}
|
2024-01-17 09:37:01 +08:00
|
|
|
|
<Form.Item
|
|
|
|
|
|
{...formItemLayout}
|
|
|
|
|
|
name="password"
|
|
|
|
|
|
label="Password"
|
2024-01-19 18:35:24 +08:00
|
|
|
|
rules={[{ required: true, message: 'Please input value' }]}
|
2024-01-17 09:37:01 +08:00
|
|
|
|
>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
<Input size="large" placeholder="Please input value" />
|
2024-01-17 09:37:01 +08:00
|
|
|
|
</Form.Item>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
{title === 'login' && (
|
|
|
|
|
|
<Form.Item name="remember" valuePropName="checked">
|
2024-01-17 09:37:01 +08:00
|
|
|
|
<Checkbox> Remember me</Checkbox>
|
|
|
|
|
|
</Form.Item>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
)}
|
|
|
|
|
|
<div>
|
|
|
|
|
|
{' '}
|
|
|
|
|
|
{title === 'login' && (
|
|
|
|
|
|
<div>
|
|
|
|
|
|
Don’t have an account?
|
|
|
|
|
|
<Button type="link" onClick={changeTitle}>
|
|
|
|
|
|
Sign up
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{title === 'register' && (
|
|
|
|
|
|
<div>
|
2024-01-17 09:37:01 +08:00
|
|
|
|
Already have an account?
|
|
|
|
|
|
<Button type="link" onClick={changeTitle}>
|
|
|
|
|
|
Sign in
|
|
|
|
|
|
</Button>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
2024-01-17 09:37:01 +08:00
|
|
|
|
</div>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
<Button type="primary" block size="large" onClick={onCheck}>
|
2024-01-17 09:37:01 +08:00
|
|
|
|
{title === 'login' ? 'Sign in' : 'Continue'}
|
|
|
|
|
|
</Button>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
{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 }}
|
|
|
|
|
|
/>
|
2024-01-17 09:37:01 +08:00
|
|
|
|
Sign in with Github
|
|
|
|
|
|
</div>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
</Button>
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
2024-01-17 09:37:01 +08:00
|
|
|
|
</Form>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2024-01-29 19:28:39 +08:00
|
|
|
|
<div className={styles.loginRight}></div>
|
2024-01-17 09:37:01 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2024-01-29 19:28:39 +08:00
|
|
|
|
export default connect(({ loginModel, loading }) => ({ loginModel, loading }))(
|
|
|
|
|
|
View,
|
|
|
|
|
|
);
|