"use client" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import Image from "next/image" import { useEffect, useState } from "react" import type { OidcConfig } from "@/models/oidc-config" import { ListOidcConfigs, userLogin } from "@/api/user" import Link from "next/link" // 使用 Next.js 的 Link 而不是 lucide 的 Link import { useRouter, useSearchParams } from "next/navigation" export function LoginForm({ className, ...props }: React.ComponentProps<"div">) { const [oidcConfigs, setOidcConfigs] = useState([]) const [{ username, password }, setCredentials] = useState({ username: '', password: '' }) const router = useRouter() const searchParams = useSearchParams() const redirectBack = searchParams.get("redirect_back") || "/" useEffect(() => { ListOidcConfigs() .then((res) => { setOidcConfigs(res.data.oidcConfigs || []) // 确保是数组 console.log("OIDC configs fetched:", res.data.oidcConfigs) }) .catch((error) => { console.error("Error fetching OIDC configs:", error) setOidcConfigs([]) // 错误时设置为空数组 }) }, []) const handleLogin = async (e: React.FormEvent) => { e.preventDefault() try { const res = await userLogin(username, password) console.log("Login successful:", res) router.push(redirectBack) } catch (error) { console.error("Login failed:", error) } } return (
Welcome back Login with Open ID Connect or your email and password.
{/* OIDC 登录选项 */} {oidcConfigs.length > 0 && (
{oidcConfigs.map((config, index) => { // 生成唯一的 key const uniqueKey = config.id || config.loginUrl || `${config.displayName}-${index}` || `oidc-${index}`; return ( ); })}
)} {/* 分隔线 */} {oidcConfigs.length > 0 && (
Or continue with
)} {/* 邮箱密码登录 */}
setCredentials(c => ({ ...c, username: e.target.value }))} />
setCredentials(c => ({ ...c, password: e.target.value }))} />
{/* 注册链接 */}
Don't have an account?{" "} Sign up
{/* 服务条款 */}
By clicking continue, you agree to our{" "} Terms of Service {" "} and{" "} Privacy Policy .
) } interface LoginWithOidcProps { loginUrl: string; displayName?: string; icon?: string; } function LoginWithOidc({ loginUrl, displayName = "Login with OIDC", icon = "/oidc-icon.svg", }: LoginWithOidcProps) { return ( ) }