# MystBin ! - signup-form.tsx "use client"; import { getInputProps, useForm } from "@conform-to/react"; import { getZodConstraint, parseWithZod } from "@conform-to/zod"; import { signup } from "~/app/actions/auth"; import { signupSchema } from "~/lib/schema/auth"; import { useActionState } from "react"; import { Button } from "./ui/button"; import { Input } from "./ui/input"; import { Label } from "./ui/label"; export function SignupForm() { const [lastResult, action, isSubmitting] = useActionState(signup, undefined); const [form, fields] = useForm({ id: "signup", lastResult, constraint: getZodConstraint(signupSchema), shouldValidate: "onBlur", onValidate({ formData }) { return parseWithZod(formData, { schema: signupSchema }); }, }); return (
); } # MystBin ! - auth.ts "use server"; import { parseWithZod } from "@conform-to/zod"; import { signupSchema } from "~/lib/schema/auth"; import { signUpEmail } from "~/server/auth"; import { APIError } from "better-auth/api"; export async function signup(prevState: unknown, formData: FormData) { const submission = parseWithZod(formData, { schema: signupSchema }); if (submission.status !== "success") { return submission.reply(); } const { firstName, lastName, email, password } = submission.value; try { await signUpEmail({ body: { name: `${firstName} ${lastName}`, email, password, }, }); } catch (error) { if (error instanceof APIError) { return submission.reply({ fieldErrors: { email: ["Email already exists"] }, resetForm: false, }); } } }