mirror of
https://github.com/woodchen-ink/Q58Connect.git
synced 2025-07-18 14:01:55 +08:00
104 lines
3.1 KiB
TypeScript
104 lines
3.1 KiB
TypeScript
"use client";
|
|
|
|
import { useCallback, useEffect, useState } from "react";
|
|
import { useRouter } from "next/navigation";
|
|
import { signIn } from "@/actions/user-authorize";
|
|
import { useSession } from "next-auth/react";
|
|
|
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
|
|
interface UserAuthorizeProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
data: Record<string, any>;
|
|
}
|
|
|
|
export function UserAuthorize({
|
|
className,
|
|
data,
|
|
...props
|
|
}: UserAuthorizeProps) {
|
|
const [isLoading, setIsLoading] = useState<boolean>(false);
|
|
const [error, setError] = useState<Error | unknown>(null);
|
|
const { update } = useSession();
|
|
const router = useRouter();
|
|
|
|
const signInCallback = useCallback(async () => {
|
|
if (isLoading) {
|
|
return;
|
|
}
|
|
setIsLoading(true);
|
|
try {
|
|
// 从 URL 中获取 sso 和 sig 参数
|
|
const url = new URL(window.location.href);
|
|
const sso = url.searchParams.get("sso");
|
|
const sig = url.searchParams.get("sig");
|
|
|
|
console.log("准备登录,参数:", {
|
|
sso: sso?.substring(0, 20) + "...",
|
|
sig: sig?.substring(0, 20) + "...",
|
|
});
|
|
|
|
if (!sso || !sig) {
|
|
throw new Error("缺少必要的认证参数");
|
|
}
|
|
|
|
await signIn({ sso, sig });
|
|
// 更新 session
|
|
await update();
|
|
// 添加更长的延迟确保session完全更新
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
// 强制刷新页面状态
|
|
router.refresh();
|
|
setIsLoading(false);
|
|
} catch (error) {
|
|
console.error("登录过程出错:", error);
|
|
setError(error);
|
|
setIsLoading(false);
|
|
}
|
|
}, [isLoading, update, router]);
|
|
|
|
useEffect(() => {
|
|
const timer = setTimeout(signInCallback, 5);
|
|
return () => {
|
|
clearTimeout(timer);
|
|
};
|
|
}, [signInCallback]);
|
|
|
|
if (error) {
|
|
return (
|
|
<Card className="w-full">
|
|
<CardHeader className="space-y-4 text-center">
|
|
<div className="mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100">
|
|
<div className="h-8 w-8 text-red-600">❌</div>
|
|
</div>
|
|
<CardTitle className="text-2xl font-semibold text-red-600">
|
|
授权失败
|
|
</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<p className="text-center text-gray-500">
|
|
{error instanceof Error
|
|
? error.message
|
|
: "登录异常,授权失败!请稍后重试。"}
|
|
</p>
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Card className="w-full">
|
|
<CardHeader className="space-y-4 text-center">
|
|
<div className="mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-blue-100">
|
|
<div className="h-8 w-8 animate-spin rounded-full border-4 border-blue-600 border-t-transparent"></div>
|
|
</div>
|
|
<CardTitle className="text-2xl font-semibold">正在处理授权</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<p className="text-center text-gray-500">
|
|
{isLoading ? "请稍候,我们正在处理您的授权请求" : "正在跳转..."}
|
|
</p>
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
}
|