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

40 lines
1.2 KiB

import { useCallback, useState } from 'react';
import { sendSmsCode } from '../api';
export interface UseSmsCodeReturn {
/**
* 发送短信验证码(失败抛出,由页面提示)。
* @param phone 手机号
* @param purpose 验证码用途(后端固定值):验证码登录传 'login',重置密码传 'reset-password'
*/
send: (phone: string, purpose: string) => Promise<void>;
/** 发送进行中(用于防重复点击) */
loading: boolean;
/** 发送失败的错误 */
error: Error | null;
}
/**
* 发送短信验证码。
* 验证码登录(P2)与重置密码(P2R)共用,倒计时由 CountdownButton 组件自管。
*/
export function useSmsCode(): UseSmsCodeReturn {
const [loading, setLoading] = useState(false);
const [error, setError] = useState<Error | null>(null);
const send = useCallback(async (phone: string, purpose: string) => {
setLoading(true);
setError(null);
try {
await sendSmsCode({ phone, purpose });
} catch (e) {
const err = e instanceof Error ? e : new Error('验证码发送失败,请稍后重试');
setError(err);
throw err;
} finally {
setLoading(false);
}
}, []);
return { send, loading, error };
}