import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { ActivityIndicator, TextInput } from "react-native"; import { authClient, setAuthToken, useSession } from "../../lib/auth"; import type { ApiError } from "../../lib/types"; import { Block } from "../ui"; import { Button } from "../ui/button"; import Text from "../ui/Text"; type AuthMode = "login" | "register"; const signIn = authClient.signIn const signUp = authClient.signUp interface AuthFormProps { mode?: AuthMode; onSuccess?: () => void; onModeChange?: (mode: AuthMode) => void; } export function AuthForm({ mode = "login", onSuccess, onModeChange }: AuthFormProps) { const { t } = useTranslation(); const [currentMode, setCurrentMode] = useState(mode); const [username, setUsername] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const isLogin = currentMode === "login"; // 根据错误代码获取翻译后的错误信息 const getErrorMessage = (error: ApiError): string => { if (error.code) { const key = `authForm.errors.${error.code}`; const translated = t(key); // 如果翻译存在,返回翻译结果 if (translated !== key) { return translated; } } // 返回 message 或默认错误信息 return error.message || t("authForm.errors.UNKNOWN_ERROR"); }; const handleSubmit = async () => { if (!username.trim() || !password.trim()) { setError(t("authForm.fillCompleteInfo")); return; } if (!isLogin && !email.trim()) { setError(t("authForm.fillEmail")); return; } setLoading(true); setError(""); try { if (isLogin) { const result = await signIn.username({ username, password }, { onSuccess: async (ctx) => { const authToken = ctx.response.headers.get('set-auth-token') if (authToken) { await setAuthToken(authToken) } }, onError: (ctx) => { setError(getErrorMessage(ctx.error)); }, }); // 检查返回结果中是否有错误 if (result.error) { setError(getErrorMessage(result.error)); return; } // 登录成功 onSuccess?.(); } else { const result = await signUp.email({ email, password, name: username }, { onSuccess: async (ctx) => { const authToken = ctx.response.headers.get('set-auth-token') if (authToken) { await setAuthToken(authToken) } }, onError: (ctx) => { setError(getErrorMessage(ctx.error)); console.error(`[REGISTER] email register error`, ctx) }, }); // 检查返回结果中是否有错误 if (result.error) { setError(getErrorMessage(result.error)); return; } // 注册成功 onSuccess?.(); } } catch (e: unknown) { const msg = e instanceof Error ? e.message : (isLogin ? t("authForm.loginFailed") : t("authForm.registerFailed")); setError(msg); } finally { setLoading(false); } }; const toggleMode = () => { const newMode = isLogin ? "register" : "login"; setCurrentMode(newMode); onModeChange?.(newMode); setEmail(""); setError(""); }; return ( {isLogin ? t("authForm.login") : t("authForm.register")} {!isLogin && ( )} {error ? ( {error} ) : null} {isLogin ? t("authForm.noAccountRegister") : t("authForm.haveAccountLogin")} ); } export { useSession };