| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- import { useIntl } from "react-intl";
- import {
- ProForm,
- type ProFormInstance,
- ProFormText,
- } from "@ant-design/pro-components";
- import { Alert, type AlertProps, message } from "antd";
- import { EyeInvisibleOutlined, EyeTwoTone } from "@ant-design/icons";
- import { get, post } from "../../../request";
- import { useRef, useState } from "react";
- import { _Link } from "react-router";
- import type { RuleObject } from "antd/lib/form";
- import type { StoreValue } from "antd/lib/form/interface";
- import LoginButton from "../../auth/LoginButton";
- interface IFormData {
- username: string;
- token?: string | null;
- password?: string;
- confirmPassword?: string;
- }
- interface IResetPasswordResponse {
- ok: boolean;
- message: string;
- data: { username: string };
- }
- interface IWidget {
- token?: string | null;
- }
- const Widget = ({ token }: IWidget) => {
- const intl = useIntl();
- const [notify, setNotify] = useState<React.ReactNode>();
- const [type, setType] = useState<AlertProps["type"]>("info");
- const formRef = useRef<ProFormInstance | undefined>(undefined);
- const [ok, setOk] = useState(false);
- const checkPass2 = (
- _rule: RuleObject,
- value: StoreValue,
- callback: (error?: string) => void
- ) => {
- if (value && value !== formRef.current?.getFieldValue("password")) {
- callback(
- intl.formatMessage({
- id: "message.confirm-password.validate.fail",
- })
- );
- } else {
- callback();
- }
- };
- return (
- <>
- {notify ? (
- <Alert
- message={notify}
- type={type}
- showIcon
- action={ok ? <LoginButton /> : undefined}
- />
- ) : (
- <></>
- )}
- <ProForm<IFormData>
- formRef={formRef}
- onFinish={async (values: IFormData) => {
- if (!token) {
- return;
- }
- console.debug(values);
- values["token"] = token;
- const url = "/v2/auth/reset-password";
- console.info("reset password url", url, values);
- const result = await post<IFormData, IResetPasswordResponse>(
- url,
- values
- );
- if (result.ok) {
- console.log("token", result.data);
- setType("success");
- setNotify(
- intl.formatMessage({
- id: "message.password.reset.successful",
- })
- );
- setOk(true);
- message.success(intl.formatMessage({ id: "flashes.success" }));
- } else {
- setType("error");
- setNotify(result.message);
- }
- }}
- request={async () => {
- const url = `/v2/auth/reset-password/${token}`;
- console.log("url", url);
- try {
- const res = await get<IResetPasswordResponse>(url);
- console.log("ResetPassword get", res);
- if (res.ok) {
- setType("info");
- setNotify(intl.formatMessage({ id: "message.password.reset" }));
- return {
- username: res.data.username,
- };
- } else {
- return {
- username: "",
- };
- }
- } catch (err) {
- //error
- if (err === 404) {
- setNotify(intl.formatMessage({ id: "获取token失败" }));
- setType("error");
- }
- console.error(err);
- }
- return {
- username: "",
- };
- }}
- >
- <ProForm.Group>
- <ProFormText
- width="md"
- name="username"
- readonly
- required
- label={intl.formatMessage({
- id: "forms.fields.username.label",
- })}
- rules={[{ required: true, max: 255, min: 2 }]}
- />
- </ProForm.Group>
- <ProForm.Group>
- <ProFormText.Password
- width="md"
- name="password"
- fieldProps={{
- type: "password",
- iconRender: (visible) =>
- visible ? <EyeTwoTone /> : <EyeInvisibleOutlined />,
- }}
- required
- label={intl.formatMessage({
- id: "forms.fields.password.label",
- })}
- rules={[{ required: true, max: 32, min: 6 }]}
- />
- </ProForm.Group>
- <ProForm.Group>
- <ProFormText.Password
- width="md"
- name="password2"
- fieldProps={{
- type: "password",
- iconRender: (visible) =>
- visible ? <EyeTwoTone /> : <EyeInvisibleOutlined />,
- }}
- required
- label={intl.formatMessage({
- id: "forms.fields.confirm-password.label",
- })}
- rules={[{ required: true, max: 32, min: 6, validator: checkPass2 }]}
- />
- </ProForm.Group>
- </ProForm>
- </>
- );
- };
- export default Widget;
|