diff --git a/web/components/login-form.tsx b/web/components/login-form.tsx index 75df2f8..bf3cf13 100644 --- a/web/components/login-form.tsx +++ b/web/components/login-form.tsx @@ -20,7 +20,7 @@ import { FieldSeparator, } from "@/components/ui/field" import { Input } from "@/components/ui/input" -import { KeyRoundIcon } from "lucide-react" +import { KeyRoundIcon, Loader2Icon, TriangleAlertIcon } from "lucide-react" function detectWxWorkEnvironment() { if (typeof navigator === "undefined") { @@ -41,6 +41,7 @@ export function LoginForm({ const [isPending, setIsPending] = useState(false) const [isWxWorkEnv, setIsWxWorkEnv] = useState(false) const [authOptions, setAuthOptions] = useState(null) + const [authOptionsError, setAuthOptionsError] = useState(null) const nextPath = searchParams.get("next") const wxworkError = searchParams.get("wxworkError") const oidcError = searchParams.get("oidcError") @@ -78,11 +79,13 @@ export function LoginForm({ .then((options) => { if (!cancelled) { setAuthOptions(options) + setAuthOptionsError(null) } }) - .catch(() => { + .catch((error) => { if (!cancelled) { - setAuthOptions({ wxworkEnabled: false, oidcEnabled: false }) + setAuthOptions(null) + setAuthOptionsError(error instanceof Error ? error.message : "") } }) @@ -112,8 +115,35 @@ export function LoginForm({ } } + if (authOptionsError) { + return ( +
+ + + +
+

{t("auth.optionsLoadFailed")}

+

+ {authOptionsError || t("api.requestFailed")} +

+
+
+
+
+ ) + } + if (!authOptions) { - return null + return ( +
+ + + +

{t("auth.loadingOptions")}

+
+
+
+ ) } return ( diff --git a/web/messages/en-US.json b/web/messages/en-US.json index 52bdada..0a03971 100644 --- a/web/messages/en-US.json +++ b/web/messages/en-US.json @@ -108,6 +108,8 @@ "syncingProfile": "Syncing your admin profile and permissions", "loginSuccess": "Signed in. Taking you to the dashboard.", "loginFailed": "Sign-in failed", + "loadingOptions": "Loading sign-in options...", + "optionsLoadFailed": "Could not load sign-in options.", "welcome": "Welcome back", "loginDescription": "Login to your {brand} account", "username": "Username", diff --git a/web/messages/zh-CN.json b/web/messages/zh-CN.json index 615ed08..7d96293 100644 --- a/web/messages/zh-CN.json +++ b/web/messages/zh-CN.json @@ -108,6 +108,8 @@ "syncingProfile": "将自动同步当前管理员信息与权限数据", "loginSuccess": "登录成功,正在进入系统", "loginFailed": "登录失败", + "loadingOptions": "正在加载登录配置...", + "optionsLoadFailed": "加载登录配置失败", "welcome": "欢迎回来", "loginDescription": "登录你的 {brand} 账号", "username": "用户名",