"use client"; import { useState } from "react"; import { useAuth } from "./AuthContext"; import { ArrowButton } from "@/components/ArrowLink"; const inputClass = "no-ring w-full rounded-xl border border-lightline px-6 py-3 shadow-lg text-lighttext transition-all duration-200 ease-in-out placeholder:text-lightsec hover:border-lightline-hover focus:border-lightline-focus dark:border-darkline dark:text-darktext dark:placeholder:text-darksec dark:hover:border-darkline-hover dark:focus:border-darkline-focus"; const PASSWORD_RULES = [ { label: "At least 8 characters", test: (pw: string) => pw.length >= 8 }, { label: "One uppercase letter", test: (pw: string) => /[A-Z]/.test(pw) }, { label: "One lowercase letter", test: (pw: string) => /[a-z]/.test(pw) }, { label: "One number", test: (pw: string) => /\d/.test(pw) }, { label: "One special character (!@#$%^&*\u2026)", test: (pw: string) => /[^A-Za-z0-9]/.test(pw) }, ]; type AuthFormProps = { onSuccess?: () => void; /** Hide title and left-align the mode toggle link */ compact?: boolean; }; export function AuthForm({ onSuccess, compact }: AuthFormProps) { const { login, register } = useAuth(); const [mode, setMode] = useState<"login" | "register">("login"); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); const showRules = mode === "register" && password.length > 0; async function doSubmit() { setError(null); if (mode === "register") { const failing = PASSWORD_RULES.find((r) => !r.test(password)); if (failing) { setError(failing.label.replace(/^One/, "Must contain at least one").replace(/^At least/, "Must be at least")); return; } if (password !== confirmPassword) { setError("Passwords do not match"); return; } } setSubmitting(true); try { if (mode === "login") { await login(email, password); } else { await register({ email, password, first_name: firstName, last_name: lastName }); } onSuccess?.(); } catch (err) { setError(err instanceof Error ? err.message : "Something went wrong"); } finally { setSubmitting(false); } } function handleSubmit(e: React.FormEvent) { e.preventDefault(); doSubmit(); } function handleKeyDown(e: React.KeyboardEvent) { if (e.key === "Enter") { e.preventDefault(); doSubmit(); } } return (
{!compact && (

{mode === "login" ? "Sign In" : "Create Account"}

)} {compact ? (
{mode === "register" && (
setFirstName(e.target.value)} onKeyDown={handleKeyDown} className={inputClass} /> setLastName(e.target.value)} onKeyDown={handleKeyDown} className={inputClass} />
)} setEmail(e.target.value)} onKeyDown={handleKeyDown} className={inputClass} /> setPassword(e.target.value)} onKeyDown={handleKeyDown} className={inputClass} /> {showRules && (
    {PASSWORD_RULES.map((rule) => { const passed = rule.test(password); return (
  • {passed ? "\u2713" : "\u2022"} {rule.label}
  • ); })}
)} {mode === "register" && ( setConfirmPassword(e.target.value)} onKeyDown={handleKeyDown} className={inputClass} /> )} {error && (
{error}
)}
) : (
{mode === "register" && (
setFirstName(e.target.value)} className={inputClass} /> setLastName(e.target.value)} className={inputClass} />
)} setEmail(e.target.value)} className={inputClass} /> setPassword(e.target.value)} className={inputClass} /> {showRules && (
    {PASSWORD_RULES.map((rule) => { const passed = rule.test(password); return (
  • {passed ? "\u2713" : "\u2022"} {rule.label}
  • ); })}
)} {mode === "register" && ( setConfirmPassword(e.target.value)} className={inputClass} /> )} {error && (
{error}
)}
)}

{mode === "login" ? "Don\u2019t have an account?" : "Already have an account?"}{" "} { setMode(mode === "login" ? "register" : "login"); setError(null); }} className="text-trptkblue dark:text-white" > {mode === "login" ? "Create one" : "Sign in"}

); }