"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; import { useTranslations } from "next-intl"; import { authClient } from "@/lib/auth/client"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; const INVITE_COOKIE = "epicure_invite"; export function SignupForm({ signupsDisabled, inviteToken }: { signupsDisabled: boolean; inviteToken: string | null }) { const router = useRouter(); const t = useTranslations("auth"); const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [loading, setLoading] = useState(false); const [inviteState, setInviteState] = useState<"checking" | "valid" | "invalid" | "none">( inviteToken ? "checking" : "none" ); const [inviteEmail, setInviteEmail] = useState(null); useEffect(() => { if (!inviteToken) return; fetch(`/api/v1/invites/${inviteToken}`) .then((res) => res.json()) .then((data: { valid: boolean; email: string | null }) => { setInviteState(data.valid ? "valid" : "invalid"); if (data.valid && data.email) { setInviteEmail(data.email); setEmail(data.email); } }) .catch(() => setInviteState("invalid")); }, [inviteToken]); function setInviteCookie() { if (inviteToken && inviteState === "valid") { document.cookie = `${INVITE_COOKIE}=${inviteToken}; path=/; max-age=600; samesite=lax`; } } const locked = signupsDisabled && inviteState !== "valid"; async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setLoading(true); setInviteCookie(); const { error } = await authClient.signUp.email({ name, email, password, callbackURL: "/recipes", }); setLoading(false); if (error) { toast.error(error.message ?? "Sign up failed"); } else { toast.success("Account created — check your email to verify"); router.push("/login"); } } async function handleGoogle() { setInviteCookie(); await authClient.signIn.social({ provider: "google", callbackURL: "/recipes" }); } if (signupsDisabled && inviteState === "checking") { return ( Checking invite… ); } if (signupsDisabled && inviteState === "none") { return ( Signups are closed Epicure isn't accepting new accounts right now. You'll need an invite link. Back to login ); } if (signupsDisabled && inviteState === "invalid") { return ( Invite invalid or expired This invite link no longer works. Ask whoever sent it for a new one. Back to login ); } return ( {t("signUpTitle")} {t("signUpSubtitle")}
{t("or")}
setName(e.target.value)} required />
setEmail(e.target.value)} readOnly={!!inviteEmail} required />
setPassword(e.target.value)} required minLength={8} />

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

); }