"use client"; import { useState, useCallback, useEffect } from "react"; import "./style/login.css"; import { useRouter, useSearchParams } from "next/navigation"; import React from "react"; import Link from "next/link"; import { signInWithGoogle, loginUser } from "@/lib/auth"; import { GradientText } from "@/components/ui/gradient-text"; import { GoogleLoginButton } from "@/components/ui/google-login-button"; import { Eye, EyeOff } from "lucide-react"; import { isGoogleLoginEnabled } from "@/lib/server-config"; import Footer from "@/components/common/Footer"; import { useDeviceType } from "@/hooks/useDeviceType"; export default function Login() { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [showPassword, setShowPassword] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [formError, setFormError] = useState(""); const [successMessage, setSuccessMessage] = useState(""); const [passwordError, setPasswordError] = useState(""); const [googleLoading, setGoogleLoading] = useState(false); const [emailFocused, setEmailFocused] = useState(false); const [passwordFocused, setPasswordFocused] = useState(false); const [showGoogleLogin, setShowGoogleLogin] = useState(false); const router = useRouter(); const searchParams = useSearchParams(); const { isMobile } = useDeviceType(); /** 密码验证函数 */ /** * Password validation function with English prompts * @param {string} password - The password to validate * @returns {string} - Error message if invalid, empty string if valid */ const validatePassword = (password: string): string => { if (password.length < 8) { return "Password must be at least 8 characters"; } if (password.length > 18) { return "Password cannot exceed 18 characters"; } if (!/^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d!@#$%^*&\.]{8,18}$/.test(password)) { return "Password must contain both letters and numbers"; } return ""; }; /** 处理密码输入变化 */ const handlePasswordChange = (e: React.ChangeEvent) => { const newPassword = e.target.value; setPassword(newPassword); if (newPassword) { const error = validatePassword(newPassword); setPasswordError(error); } else { setPasswordError(""); } }; // Check for registered=true parameter and load SSO config useEffect(() => { const registered = searchParams?.get("registered"); if (registered === "true") { setSuccessMessage( "Registration successful! Please login with your new account." ); } const error = searchParams?.get("error"); if (error) { if (error === "google_oauth") { setFormError("Google login failed, please try again."); } else if (error === "auth_failed") { setFormError("Authentication failed, please try again."); } else if (error === "oauth_callback_incomplete") { setFormError("OAuth callback processing is incomplete. Please use the Google login button below."); } else if (error === "deprecated_oauth_callback") { setFormError("The old OAuth method is deprecated. Please use the Google login button below for a better experience."); } } // 检查是否启用Google登录 const checkGoogleLoginStatus = async () => { try { console.log('🔍 登录页面:开始检查Google登录状态...'); const enabled = await isGoogleLoginEnabled(); console.log('📋 登录页面:Google登录启用状态:', enabled); setShowGoogleLogin(enabled); console.log('📋 登录页面:设置showGoogleLogin状态为:', enabled); } catch (error) { console.error("❌ 登录页面:Failed to check Google login status:", error); setShowGoogleLogin(false); } }; checkGoogleLoginStatus(); }, [searchParams]); const handleGoogleSignIn = async () => { try { setGoogleLoading(true); setFormError(""); // 获取邀请码(从URL参数或其他来源) const inviteCode = searchParams?.get("invite") || undefined; // 使用Google GSI SDK进行登录 await signInWithGoogle(inviteCode); } catch (error: any) { console.error("Google sign-in error:", error); setFormError(error.message || "Google sign-in failed, please try again"); setGoogleLoading(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); // 验证密码 const passwordValidationError = validatePassword(password); if (passwordValidationError) { setPasswordError(passwordValidationError); return; } setIsSubmitting(true); setFormError(""); setSuccessMessage(""); try { await loginUser(email, password); // 登录成功后跳转到首页 router.push("/home"); } catch (error: any) { console.error("Login failed:", error); // 根据错误类型显示不同的错误消息 setFormError( error.message || "Login failed, please try again." ); } finally { setIsSubmitting(false); } }; return (
{/* 背景视频 */} {/* 视频遮罩层 */}
{/* Logo */}
router.push("/")} > {/* beta标签 */} Beta
{/* 登录框 - 居中显示 */}

Login

Your inspiration is waiting.
Log in to bring your vision to life.

{successMessage && (
{successMessage}
)}
setEmail(e.target.value)} onFocus={() => setEmailFocused(true)} onBlur={() => setEmailFocused(false)} />
setPasswordFocused(true)} onBlur={() => setPasswordFocused(false)} />
{passwordError && (

{passwordError}

)} {/* */}
{formError && (
{formError}
)} {/* Google登录按钮 - 根据服务端配置显示/隐藏 */} {showGoogleLogin && ( <>
or
)}

Don't have an account?{" "} Sign up

{/* 页脚 */}
); }