|
|
@@ -0,0 +1,101 @@
|
|
|
+import React, { useState } from 'react';
|
|
|
+import { Drawer, Form, Input, Button, message } from 'antd';
|
|
|
+import type { DrawerProps } from 'antd';
|
|
|
+import { useAuth } from '../apis/AuthProvider';
|
|
|
+import { useRegister, useLogin } from '../apis/users';
|
|
|
+
|
|
|
+enum Mode {
|
|
|
+ Register,
|
|
|
+ Login,
|
|
|
+}
|
|
|
+
|
|
|
+interface UserDrawerProps extends DrawerProps {
|
|
|
+ onClose: () => void;
|
|
|
+}
|
|
|
+
|
|
|
+const UserDrawer: React.FC<UserDrawerProps> = props => {
|
|
|
+ const [mode, setMode] = useState<Mode>(Mode.Login);
|
|
|
+
|
|
|
+ const { refresh } = useAuth();
|
|
|
+ const register = useRegister();
|
|
|
+ const login = useLogin();
|
|
|
+
|
|
|
+ return (
|
|
|
+ <Drawer
|
|
|
+ title={mode === Mode.Register ? '注册' : '登录'}
|
|
|
+ destroyOnClose
|
|
|
+ {...props}
|
|
|
+ >
|
|
|
+ <Form
|
|
|
+ name="user"
|
|
|
+ labelCol={{ span: 6 }}
|
|
|
+ wrapperCol={{ span: 18 }}
|
|
|
+ onFinish={(values: { name: string; password: string }) =>
|
|
|
+ void (async () => {
|
|
|
+ try {
|
|
|
+ if (mode === Mode.Register) {
|
|
|
+ await register(values);
|
|
|
+ void message.success('注册成功');
|
|
|
+ }
|
|
|
+ await login(values);
|
|
|
+ void message.success('登录成功');
|
|
|
+ refresh();
|
|
|
+ props.onClose();
|
|
|
+ } catch (err) {
|
|
|
+ if (err instanceof Error) {
|
|
|
+ void message.error(err.message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })()
|
|
|
+ }
|
|
|
+ >
|
|
|
+ <Form.Item
|
|
|
+ label="用户名"
|
|
|
+ name="name"
|
|
|
+ rules={[
|
|
|
+ { required: true, message: '请输入用户名' },
|
|
|
+ { min: 2, max: 16, message: '用户名长度应在 4 到 16 之间' },
|
|
|
+ { pattern: /^\w+$/, message: '用户名应仅包含字母、数字和下划线' },
|
|
|
+ ]}
|
|
|
+ validateTrigger="onBlur"
|
|
|
+ >
|
|
|
+ <Input placeholder="请输入用户名" />
|
|
|
+ </Form.Item>
|
|
|
+ <Form.Item
|
|
|
+ label="密码"
|
|
|
+ name="password"
|
|
|
+ rules={[
|
|
|
+ { required: true, message: '请输入密码' },
|
|
|
+ { min: 2, max: 16, message: '密码长度应在 4 到 16 之间' },
|
|
|
+ ]}
|
|
|
+ validateTrigger="onBlur"
|
|
|
+ >
|
|
|
+ <Input.Password placeholder="请输入密码" />
|
|
|
+ </Form.Item>
|
|
|
+ <Form.Item label=" " colon={false}>
|
|
|
+ {mode === Mode.Register ? (
|
|
|
+ <>
|
|
|
+ <Button htmlType="submit" type="primary">
|
|
|
+ 注册
|
|
|
+ </Button>
|
|
|
+ <Button type="link" onClick={() => setMode(Mode.Login)}>
|
|
|
+ 已有账号?返回登录
|
|
|
+ </Button>
|
|
|
+ </>
|
|
|
+ ) : (
|
|
|
+ <>
|
|
|
+ <Button htmlType="submit" type="primary">
|
|
|
+ 登录
|
|
|
+ </Button>
|
|
|
+ <Button type="link" onClick={() => setMode(Mode.Register)}>
|
|
|
+ 没有账号?前往注册
|
|
|
+ </Button>
|
|
|
+ </>
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Form>
|
|
|
+ </Drawer>
|
|
|
+ );
|
|
|
+};
|
|
|
+
|
|
|
+export default UserDrawer;
|