"use client"; import React, { useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { signInWithGoogle, registerUser, sendVerificationLink } from "@/lib/auth"; import { GradientText } from "@/components/ui/gradient-text"; import { Eye, EyeOff, Mail } from "lucide-react"; export default function SignupPage() { const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [inviteCode, setInviteCode] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const [formError, setFormError] = useState(""); const [passwordError, setPasswordError] = useState(""); const [confirmPasswordError, setConfirmPasswordError] = useState(""); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [agreeToTerms, setAgreeToTerms] = useState(true); const [showActivationModal, setShowActivationModal] = useState(false); const [resendCooldown, setResendCooldown] = useState(60); const [resendLoading, setResendLoading] = useState(false); const [resendMessage, setResendMessage] = useState(""); const [resendError, setResendError] = useState(""); const router = useRouter(); /** Password validation function with English prompts */ 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 ""; }; /** Get quick link to email provider by domain */ const getEmailProviderLink = (addr: string): string | undefined => { const domain = addr.split("@")[1]?.toLowerCase(); if (!domain) return undefined; const map: Record = { "gmail.com": "https://mail.google.com", "outlook.com": "https://outlook.live.com/mail", "hotmail.com": "https://outlook.live.com/mail", "live.com": "https://outlook.live.com/mail", "yahoo.com": "https://mail.yahoo.com", "icloud.com": "https://www.icloud.com/mail", "qq.com": "https://mail.qq.com", "163.com": "https://mail.163.com", "126.com": "https://mail.126.com", "yeah.net": "https://mail.yeah.net", }; return map[domain]; }; /** Handle resend activation email */ const handleResend = async () => { if (resendCooldown > 0 || resendLoading) return; try { setResendLoading(true); setResendMessage(""); setResendError(""); await sendVerificationLink(email); setResendMessage("Resent. Please check your email."); setResendCooldown(60); } catch (err: any) { setResendError(err?.message || "Sending failed, please try again later"); } finally { setResendLoading(false); } }; /** Countdown for resend button */ React.useEffect(() => { if (!showActivationModal) return; if (resendCooldown <= 0) return; const timer = setInterval(() => { setResendCooldown((s) => (s > 0 ? s - 1 : 0)); }, 1000); return () => clearInterval(timer); }, [showActivationModal, resendCooldown]); /** Handle Terms of Service click */ const handleTermsClick = () => { window.open("/Terms", "_blank"); }; /** Handle Privacy Policy click */ const handlePrivacyClick = () => { window.open("/Privacy", "_blank"); }; /** 处理密码输入变化 */ const handlePasswordChange = (e: React.ChangeEvent) => { const newPassword = e.target.value; setPassword(newPassword); if (newPassword) { const error = validatePassword(newPassword); setPasswordError(error); } else { setPasswordError(""); } // 如果确认密码已输入,重新验证确认密码 if (confirmPassword) { if (newPassword !== confirmPassword) { setConfirmPasswordError("Passwords do not match"); } else { setConfirmPasswordError(""); } } }; /** 处理确认密码输入变化 */ const handleConfirmPasswordChange = ( e: React.ChangeEvent ) => { const newConfirmPassword = e.target.value; setConfirmPassword(newConfirmPassword); if (newConfirmPassword) { if (password !== newConfirmPassword) { setConfirmPasswordError("Passwords do not match"); } else { setConfirmPasswordError(""); } } else { setConfirmPasswordError(""); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); // 验证密码 const passwordValidationError = validatePassword(password); if (passwordValidationError) { setPasswordError(passwordValidationError); return; } // 验证确认密码 if (password !== confirmPassword) { setConfirmPasswordError("Passwords do not match"); return; } // 验证是否同意条款 if (!agreeToTerms) { setFormError("Please agree to the Terms of Service and Privacy Policy"); return; } setIsSubmitting(true); setFormError(""); try { // Use new registration API await registerUser({ userName: name, email, password, inviteCode: inviteCode || undefined, }); // Show activation modal instead of redirecting to login setShowActivationModal(true); setResendCooldown(60); } catch (error: any) { console.error("Signup error:", error); setFormError(error.message||error.msg || "Registration failed, please try again"); } finally { setIsSubmitting(false); } }; return ( <>
{/* 背景视频 */} {/* 视频遮罩层 */}
{/* Logo */}
router.push("/")} > {/* beta标签 */} Beta
{/* 注册框 - 居中显示 */}

Sign Up, for free

Create your account to get started

setEmail(e.target.value)} required className="w-full px-4 py-3 rounded-lg bg-black/30 border border-white/20 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent" />
setName(e.target.value)} required className="w-full px-4 py-3 rounded-lg bg-black/30 border border-white/20 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent" />
{passwordError && (

{passwordError}

)} {confirmPasswordError && (

{confirmPasswordError}

)} {password && !passwordError && (

✓ Password format is correct

)} {confirmPassword && !confirmPasswordError && (

✓ Passwords match

)}
setInviteCode(e.target.value)} className="w-full px-4 py-3 rounded-lg bg-black/30 border border-white/20 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent" />
{formError && (
{formError}
)}
Back to login
{/*
or
*/}

Already have an account?{" "}

{showActivationModal && (

Please verify your email to activate your account

We have sent an activation email to {email || "your email"}; if you don't receive it, please check your spam folder or try again later

{(() => { const provider = getEmailProviderLink(email); if (!provider) return null; const domain = email.split("@")[1] || "email"; return ( Open {domain} ); })()}
{(resendMessage || resendError) && (
{resendError || resendMessage}
)}
)} ); }