轻松聘
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

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 };
}