tianji/src/client/pages/Login.tsx

74 lines
2.0 KiB
TypeScript
Raw Normal View History

2023-09-03 02:52:41 +08:00
import { Button, Form, Input, Typography } from 'antd';
import React, { useEffect } from 'react';
import { model } from '../api/model';
import { useNavigate } from 'react-router';
import { loginWithToken } from '../api/model/user';
import { getJWT } from '../api/auth';
import { useRequest } from '../hooks/useRequest';
2023-09-01 00:11:47 +08:00
export const Login: React.FC = React.memo(() => {
const navigate = useNavigate();
const [{ loading }, handleLogin] = useRequest(async (values: any) => {
await model.user.login(values.username, values.password);
navigate('/dashboard');
2023-09-03 02:52:41 +08:00
});
useEffect(() => {
const token = getJWT();
if (token) {
loginWithToken().then(() => {
navigate('/dashboard');
});
}
}, []);
2023-09-03 02:52:41 +08:00
return (
<div className="w-full h-full flex justify-center items-center">
<div className="w-80 -translate-y-1/4">
<Typography.Title level={2}>Tianji</Typography.Title>
<Form layout="vertical" disabled={loading} onFinish={handleLogin}>
2023-09-03 02:52:41 +08:00
<Form.Item
label="Username"
name="username"
rules={[{ required: true }]}
>
<Input size="large" />
</Form.Item>
<Form.Item
label="Password"
name="password"
rules={[{ required: true }]}
>
<Input.Password size="large" />
2023-09-03 02:52:41 +08:00
</Form.Item>
<Form.Item>
<Button
type="primary"
size="large"
htmlType="submit"
block={true}
loading={loading}
>
2023-09-03 02:52:41 +08:00
Login
</Button>
</Form.Item>
<Form.Item>
<Button
size="large"
htmlType="button"
block={true}
onClick={() => {
navigate('/register');
}}
>
Register
</Button>
</Form.Item>
2023-09-03 02:52:41 +08:00
</Form>
</div>
</div>
);
2023-09-01 00:11:47 +08:00
});
Login.displayName = 'Login';