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