import { useCallback, useState } from 'react'; import { changePassword, getPasswordRuleMessage, validatePassword, validatePasswordConfirm, } from '../api'; import type { ChangePasswordPayload } from '../types'; export interface UseChangePasswordReturn { /** 修改登录密码(已登录态,需校验原密码) */ change: (payload: ChangePasswordPayload) => Promise; /** 提交进行中 */ 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(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 }; }