"use client"; import * as React from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { Loader2, MessageCircleCode } from "lucide-react"; import { cn } from "@/lib/utils"; import { useToast } from "@/hooks/use-toast"; import { buttonVariants } from "@/components/ui/button"; interface DiscourseData { sso_url: string; } export function UserAuthForm({ className, ...props }: React.HTMLAttributes) { const [isLoading, setIsLoading] = React.useState(false); const { toast } = useToast(); const searchParams = useSearchParams(); const signIn = async () => { if (isLoading) return; setIsLoading(true); try { // 构建请求体,包含 OAuth 参数 const body: Record = {}; const currentParams = searchParams?.toString(); if (currentParams) { body.oauth_params = currentParams; } const response = await fetch("/api/auth/q58", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(body), }); if (!response.ok) { throw new Error("登录请求失败"); } const data: DiscourseData = await response.json(); // 直接跳转到 SSO 登录页面 window.location.href = data.sso_url; } catch (error) { console.error("登录失败:", error); setIsLoading(false); toast({ variant: "destructive", title: "登录失败", description: "请求失败,请稍后重试", }); } }; return (
); }