import {useState, type FormEvent} from "react"; import {useNavigate, Link} from "react-router-dom"; import {toast} from "sonner"; import {useAuth} from "@/auth"; import {ApiError, isValidationErrorPayload} from "@/api"; import {Button} from "@/components/ui/button"; import {Input} from "@/components/ui/input"; import {Label} from "@/components/ui/label"; import {Card, CardHeader, CardTitle, CardContent, CardFooter} from "@/components/ui/card"; export function RegisterPage() { const {register} = useAuth(); const navigate = useNavigate(); const [form, setForm] = useState({login: "", name: "", password: ""}); const [fieldErrors, setFieldErrors] = useState>({}); const [busy, setBusy] = useState(false); const submit = async (e: FormEvent) => { e.preventDefault(); setFieldErrors({}); setBusy(true); try { await register(form.login, form.name, form.password); navigate("/"); } catch (err) { if (err instanceof ApiError) { // validation payload: {fieldErrors, formErrors} — highlights form fields. if (isValidationErrorPayload(err.body?.payload)) { setFieldErrors(err.body!.payload.fieldErrors); } toast.error(err.body?.message ?? "Failed to register"); } else { toast.error("Network unavailable"); } } finally { setBusy(false); } }; const fieldError = (name: string) => fieldErrors[name]?.[0]; return ( Sign up
setForm({...form, login: e.target.value})} /> {fieldError("login") && {fieldError("login")}}
setForm({...form, name: e.target.value})} /> {fieldError("name") && {fieldError("name")}}
setForm({...form, password: e.target.value})} /> {fieldError("password") && {fieldError("password")}}
Already have an account?  Sign in
); }