imeeting/frontend/src/pages/auth/reset-password/index.tsx

92 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { Button, Card, Form, Input, Layout, Typography, App } from 'antd';
import { LockOutlined, LogoutOutlined } from "@ant-design/icons";
import { useState } from "react";
import { useNavigate } from "react-router-dom";
import { updateMyPassword } from "@/api";
const { Title, Text } = Typography;
type ResetPasswordFormValues = {
oldPassword: string;
newPassword: string;
confirmPassword: string;
};
export default function ResetPassword() {
const { message } = App.useApp();
const [loading, setLoading] = useState(false);
const navigate = useNavigate();
const [form] = Form.useForm<ResetPasswordFormValues>();
const goToLogin = () => {
localStorage.clear();
sessionStorage.clear();
navigate("/login");
};
const onFinish = async (values: ResetPasswordFormValues) => {
setLoading(true);
try {
await updateMyPassword({
oldPassword: values.oldPassword,
newPassword: values.newPassword
});
message.success("密码已更新,请重新登录");
goToLogin();
} finally {
setLoading(false);
}
};
return (
<Layout style={{ minHeight: "100vh", background: "#f0f2f5", display: "flex", alignItems: "center", justifyContent: "center" }}>
<Card style={{ width: 420, borderRadius: 8, boxShadow: "0 4px 12px rgba(0,0,0,0.1)" }}>
<div className="text-center mb-6">
<LockOutlined style={{ fontSize: 40, color: "#1890ff" }} />
<Title level={3} style={{ marginTop: 16 }}>
</Title>
<Text type="secondary"></Text>
</div>
<Form form={form} layout="vertical" onFinish={onFinish}>
<Form.Item label="当前密码" name="oldPassword" rules={[{ required: true, message: "请输入当前密码" }]}>
<Input.Password prefix={<LockOutlined />} />
</Form.Item>
<Form.Item label="新密码" name="newPassword" rules={[{ required: true, min: 6, message: "新密码至少 6 位" }]}>
<Input.Password prefix={<LockOutlined />} />
</Form.Item>
<Form.Item
label="确认新密码"
name="confirmPassword"
dependencies={["newPassword"]}
rules={[
{ required: true, message: "请再次输入新密码" },
({ getFieldValue }) => ({
validator(_, value) {
if (!value || getFieldValue("newPassword") === value) {
return Promise.resolve();
}
return Promise.reject(new Error("两次输入的新密码不一致"));
}
})
]}
>
<Input.Password prefix={<LockOutlined />} />
</Form.Item>
<Button type="primary" htmlType="submit" block size="large" loading={loading} style={{ marginTop: 8 }}>
</Button>
<Button type="link" block icon={<LogoutOutlined />} onClick={goToLogin} style={{ marginTop: 8 }}>
退
</Button>
</Form>
</Card>
</Layout>
);
}