You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.3 KiB
69 lines
2.3 KiB
import { useCallback, useState } from 'react';
|
|
import {
|
|
changePassword,
|
|
getPasswordRuleMessage,
|
|
validatePassword,
|
|
validatePasswordConfirm,
|
|
} from '../api';
|
|
import type { ChangePasswordPayload } from '../types';
|
|
|
|
export interface UseChangePasswordReturn {
|
|
/** 修改登录密码(已登录态,需校验原密码) */
|
|
change: (payload: ChangePasswordPayload) => Promise<void>;
|
|
/** 提交进行中 */
|
|
loading: boolean;
|
|
/** 失败原因(用于页面提示) */
|
|
error: Error | null;
|
|
/** 修改成功标记(页面据此提示并强制重新登录) */
|
|
success: boolean;
|
|
/**
|
|
* 新密码规则校验(含与原密码比对):返回中文提示,null 表示通过。
|
|
*/
|
|
checkNewPassword: (
|
|
oldPassword: string,
|
|
newPassword: string,
|
|
confirmPassword: string,
|
|
) => string | null;
|
|
}
|
|
|
|
/**
|
|
* 修改登录密码(账号与安全 → 修改登录密码)。
|
|
* 改密成功后需强制重新登录,因此只回传 success 标记,由页面决定后续跳转。
|
|
*/
|
|
export function useChangePassword(): UseChangePasswordReturn {
|
|
const [loading, setLoading] = useState(false);
|
|
const [error, setError] = useState<Error | null>(null);
|
|
const [success, setSuccess] = useState(false);
|
|
|
|
const change = useCallback(async (payload: ChangePasswordPayload) => {
|
|
setLoading(true);
|
|
setError(null);
|
|
try {
|
|
await changePassword(payload);
|
|
setSuccess(true);
|
|
} catch (e) {
|
|
const err = e instanceof Error ? e : new Error('密码修改失败,请稍后重试');
|
|
setError(err);
|
|
throw err;
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, []);
|
|
|
|
const checkNewPassword = useCallback(
|
|
(oldPassword: string, newPassword: string, confirmPassword: string) => {
|
|
const ruleError = validatePassword(newPassword);
|
|
if (ruleError) return getPasswordRuleMessage(ruleError);
|
|
// 确认框还没开始输入时不提示不一致
|
|
if (confirmPassword.length > 0) {
|
|
const confirmError = validatePasswordConfirm(newPassword, confirmPassword);
|
|
if (confirmError) return getPasswordRuleMessage(confirmError);
|
|
}
|
|
if (newPassword === oldPassword) return getPasswordRuleMessage('same-as-old');
|
|
return null;
|
|
},
|
|
[],
|
|
);
|
|
|
|
return { change, loading, error, success, checkNewPassword };
|
|
}
|
|
|