From 23fe043cf1112944908616b9e58d8a6d3264bfdb Mon Sep 17 00:00:00 2001 From: Polaris Date: Mon, 26 Aug 2024 16:15:52 -0400 Subject: [PATCH] added zod for signup validation --- auth/components/signup/signup.tsx | 68 +++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 9 deletions(-) diff --git a/auth/components/signup/signup.tsx b/auth/components/signup/signup.tsx index ae30d2a..7f47cc4 100644 --- a/auth/components/signup/signup.tsx +++ b/auth/components/signup/signup.tsx @@ -10,14 +10,44 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; +import * as z from "zod"; import { Label } from "@/components/ui/label"; import { toast } from "@/components/ui/use-toast"; - import { signUp } from "./action"; +import { useForm, SubmitHandler, FieldValues } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; + +const signUpSchema = z + .object({ + username: z.string().min(1, "Username is required"), + email: z.string().email("Invalid email address"), + accessCode: z + .string() + .regex(/^\d{20}$/, "Access Code must be exactly 20 numeric characters"), + password: z.string().min(8, "Password must be at least 8 characters"), + confirmPassword: z.string().min(8, "Please confirm your password"), + }) + .refine((data) => data.password === data.confirmPassword, { + path: ["confirmPassword"], + message: "Passwords do not match", + }); export default function SignUpForm() { - const submit = async (data: FormData) => { - const { error } = await signUp(data); + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: zodResolver(signUpSchema), + }); + const onSubmit: SubmitHandler = async (data) => { + // Convert FieldValues to FormData + const formData = new FormData(); + for (const [key, value] of Object.entries(data)) { + formData.append(key, value); + } + + const { error } = await signUp(formData); if (error) { toast({ title: "Error", @@ -40,55 +70,75 @@ export default function SignUpForm() { -
+
+ {errors.username?.message && + typeof errors.username.message === "string" && ( +

{errors.username.message}

+ )}
+ {errors.email?.message && + typeof errors.email.message === "string" && ( +

{errors.email.message}

+ )}
+ {errors.accessCode?.message && + typeof errors.accessCode.message === "string" && ( +

{errors.accessCode.message}

+ )}
+ {errors.password?.message && + typeof errors.password.message === "string" && ( +

{errors.password.message}

+ )}
+ {errors.confirmPassword?.message && + typeof errors.confirmPassword.message === "string" && ( +

{errors.confirmPassword.message}

+ )}