import { type FormEvent, useEffect, useState } from "react"; import { Link, useLocation } from "wouter"; import { ApiClientError, useAuth } from "../stores"; export function RegisterPage() { const [, navigate] = useLocation(); const { register, isAuthenticated } = useAuth(); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [error, setError] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); // Redirect if already authenticated useEffect(() => { if (isAuthenticated) { navigate("/", { replace: true }); } }, [isAuthenticated, navigate]); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setError(null); if (password !== confirmPassword) { setError("Passwords do not match"); return; } if (password.length < 8) { setError("Password must be at least 8 characters"); return; } setIsSubmitting(true); try { await register(username, password); navigate("/", { replace: true }); } catch (err) { if (err instanceof ApiClientError) { setError(err.message); } else { setError("Registration failed. Please try again."); } } finally { setIsSubmitting(false); } }; return (

Register

{error && (
{error}
)}
setUsername(e.target.value)} required autoComplete="username" disabled={isSubmitting} />
setPassword(e.target.value)} required autoComplete="new-password" disabled={isSubmitting} />
setConfirmPassword(e.target.value)} required autoComplete="new-password" disabled={isSubmitting} />

Already have an account? Login

); }