"use client"; import { useState, useEffect, useCallback, Suspense } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { useAuth } from "../auth-context"; import { invitesApi } from "../api"; import { authFormStyles as styles } from "../styles/auth-form"; import { LanguageSelector } from "../components/LanguageSelector"; import { useTranslation } from "../hooks/useTranslation"; function SignupContent() { const searchParams = useSearchParams(); const initialCode = searchParams.get("code") || ""; const [inviteCode, setInviteCode] = useState(initialCode); const [inviteValid, setInviteValid] = useState(null); const [inviteError, setInviteError] = useState(""); const [isCheckingInvite, setIsCheckingInvite] = useState(false); const [isCheckingInitialCode, setIsCheckingInitialCode] = useState(!!initialCode); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [error, setError] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const { user, register } = useAuth(); const router = useRouter(); const t = useTranslation("auth"); // Redirect if already logged in useEffect(() => { if (user) { router.push("/"); } }, [user, router]); const checkInvite = useCallback(async (code: string) => { if (!code.trim()) { setInviteValid(null); setInviteError(""); return; } setIsCheckingInvite(true); setInviteError(""); try { const response = await invitesApi.checkInvite(code.trim()); if (response.valid) { setInviteValid(true); setInviteError(""); } else { setInviteValid(false); setInviteError(response.error || t("signup.invalidInviteCode")); } } catch { setInviteValid(false); setInviteError(t("signup.failedToVerify")); } finally { setIsCheckingInvite(false); } }, []); // Check invite code on mount if provided in URL useEffect(() => { if (initialCode) { checkInvite(initialCode).finally(() => setIsCheckingInitialCode(false)); } }, [initialCode, checkInvite]); const handleInviteSubmit = (e: React.FormEvent) => { e.preventDefault(); checkInvite(inviteCode); }; const handleSignupSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); if (password !== confirmPassword) { setError(t("signup.passwordsDoNotMatch")); return; } if (password.length < 6) { setError(t("signup.passwordTooShort")); return; } setIsSubmitting(true); try { await register(email, password, inviteCode.trim()); router.push("/"); } catch (err) { setError(err instanceof Error ? err.message : t("signup.registrationFailed")); } finally { setIsSubmitting(false); } }; // Show loading or redirect if user is already logged in if (user) { return null; } // Show loading state while checking initial code from URL if (isCheckingInitialCode) { return (
{t("signup.checkingInviteCode")}
); } // Step 1: Enter invite code if (!inviteValid) { return (

{t("signup.title")}

{t("signup.subtitle")}

{inviteError &&
{inviteError}
}
{ setInviteCode(e.target.value); setInviteError(""); setInviteValid(null); }} style={styles.input} placeholder={t("signup.inviteCodePlaceholder")} required autoFocus /> {t("signup.inviteHint")}

{t("signup.alreadyHaveAccount")}{" "} {t("signup.signIn")}

); } // Step 2: Enter email and password return (

{t("signup.createAccountTitle")}

{t("signup.createAccountSubtitle")}{" "} {inviteCode}

{error &&
{error}
}
setEmail(e.target.value)} style={styles.input} placeholder={t("signup.emailPlaceholder")} required autoFocus />
setPassword(e.target.value)} style={styles.input} placeholder={t("signup.passwordPlaceholder")} required />
setConfirmPassword(e.target.value)} style={styles.input} placeholder={t("signup.confirmPasswordPlaceholder")} required />

); } export default function SignupPage() { return (
Loading...
} >
); }