"use client"; import React, { useEffect, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { CheckCircle, XCircle, Loader2, AlertTriangle } from "lucide-react"; import { loginWithGoogleToken } from "@/lib/auth"; import type { OAuthCallbackParams, OAuthState } from "@/app/types/google-oauth"; export default function OAuthCallback() { const router = useRouter(); const searchParams = useSearchParams(); const [status, setStatus] = useState<"loading" | "success" | "error" | "conflict">("loading"); const [message, setMessage] = useState(""); const [conflictData, setConflictData] = useState(null); useEffect(() => { const handleOAuthCallback = async () => { try { console.log('🎯 Google OAuth 回调页面开始处理...'); console.log('📍 回调页面调试信息:'); console.log(' - 完整回调 URL:', window.location.href); console.log(' - 回调域名:', window.location.hostname); console.log(' - 回调协议:', window.location.protocol); console.log(' - 回调路径:', window.location.pathname); console.log(' - URL 查询参数:', window.location.search); // 获取URL参数 const params: OAuthCallbackParams = { code: searchParams.get("code") || undefined, state: searchParams.get("state") || undefined, error: searchParams.get("error") || undefined, error_description: searchParams.get("error_description") || undefined, }; console.log('📦 获取到的URL参数:', params); // 检查是否有错误 if (params.error) { console.error('OAuth错误:', params.error, params.error_description); setStatus("error"); setMessage(params.error_description || `OAuth error: ${params.error}`); return; } // 验证必需参数 if (!params.code || !params.state) { console.error('缺少必需的OAuth参数:', { code: !!params.code, state: !!params.state }); setStatus("error"); setMessage("Missing required OAuth parameters"); return; } // 解析state参数获取邀请码等信息 let stateData: any = {}; try { stateData = JSON.parse(params.state); console.log('解析后的State数据:', stateData); } catch (e) { console.warn('无法解析state参数:', params.state, e); } console.log('开始处理Google OAuth回调, code:', params.code?.substring(0, 20) + '...'); console.log('State数据:', stateData); // 调用后端处理授权码 const response = await fetch('/api/auth/google/callback', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ code: params.code, state: params.state, inviteCode: stateData.inviteCode || undefined }) }); if (!response.ok) { // 处理HTTP错误状态 const errorText = await response.text(); console.error('OAuth API调用失败:', response.status, errorText); throw new Error(`OAuth API调用失败 (${response.status}): ${errorText}`); } const result = await response.json(); console.log('OAuth API响应:', result); if (result.success) { console.log('Google登录成功:', result); setStatus("success"); setMessage("Login successful! Redirecting to dashboard..."); // 保存用户信息到localStorage (使用认证库的统一键名) if (result.data?.user) { localStorage.setItem('currentUser', JSON.stringify(result.data.user)); } if (result.data?.token) { localStorage.setItem('token', result.data.token); } // 2秒后跳转到主页 setTimeout(() => { // 修复: Google登录成功后应该跳转到主页面,而不是来源页面 const returnUrl = '/movies'; window.location.href = returnUrl; }, 2000); } else { throw new Error(result.message || 'Google登录失败'); } } catch (error: any) { console.error("OAuth callback error:", error); if (error.type === 'EMAIL_CONFLICT') { setStatus("conflict"); setMessage(error.message); setConflictData(error.data); } else { setStatus("error"); setMessage(error.message || "OAuth callback processing failed"); } } }; handleOAuthCallback(); }, [searchParams, router]); const handleBindAccount = async () => { try { // 这里应该实现账户绑定逻辑 // 需要调用 /api/auth/google/bind 接口 console.log("Account binding not yet implemented"); setMessage("Account binding feature is not yet implemented"); } catch (error: any) { console.error("Account binding failed:", error); setMessage(error.message || "Account binding failed"); } }; const handleReturnToLogin = () => { router.push("/login"); }; const renderContent = () => { switch (status) { case "loading": return (

Processing OAuth callback...

); case "success": return (

Login Successful

{message}

); case "conflict": return (

Account Conflict

{message}

{conflictData && (

Email: {conflictData.existingUser?.email}

)}
); case "error": return (

OAuth Failed

{message}

); } }; return (
{status === "loading" && (

OAuth Callback

Please wait while we process your authentication

)} {renderContent()}
); }