Files
Jyotisha/frontend/src/modules/identity/client.ts
T
2026-07-22 11:04:36 +08:00

66 lines
1.7 KiB
TypeScript

import { createAuthClient } from "better-auth/react";
import { emailOTPClient } from "better-auth/client/plugins";
interface OtpClientResult {
data: unknown;
error: unknown;
}
export interface SelfHostedOtpClient {
emailOtp: {
sendVerificationOtp(input: {
email: string;
type: "sign-in";
}): Promise<OtpClientResult>;
};
signIn: {
emailOtp(input: {
email: string;
otp: string;
}): Promise<OtpClientResult>;
};
signOut?(): Promise<OtpClientResult>;
}
export interface SelfHostedOtpActions {
send(email: string): Promise<void>;
verify(email: string, otp: string): Promise<void>;
signOut(): Promise<void>;
}
export function createSelfHostedOtpActions(
client: SelfHostedOtpClient,
): SelfHostedOtpActions {
return {
async send(email) {
const result = await client.emailOtp.sendVerificationOtp({
email: email.trim().toLowerCase(),
type: "sign-in",
});
if (result.error) {
throw new Error("暂时无法发送验证码,请稍后再试");
}
},
async verify(email, otp) {
const result = await client.signIn.emailOtp({
email: email.trim().toLowerCase(),
otp,
});
if (result.error) {
throw new Error("验证码错误或已过期,请重新获取");
}
},
async signOut() {
if (!client.signOut) throw new Error("退出失败,请稍后再试");
const result = await client.signOut();
if (result.error) throw new Error("退出失败,请稍后再试");
},
};
}
const authClient = createAuthClient({ plugins: [emailOTPClient()] });
export const selfHostedOtpActions = createSelfHostedOtpActions(
authClient as SelfHostedOtpClient,
);