From e5ff34ae4224634de6ba5c9410c1af2e110748ba Mon Sep 17 00:00:00 2001
From: Aaditya Mahanta
Date: Sat, 9 Mar 2024 04:04:59 +0530
Subject: [PATCH] user api
---
.../src/app/forgot/forgot-pass-form.tsx | 17 +-
.../src/app/login/login-form.tsx | 11 +-
devsoc24-portal-fe/src/app/reset/page.tsx | 2 -
.../src/app/signup/details/page.tsx | 4 +-
.../signup/details/personal-details-form.tsx | 35 +-
.../src/app/signup/details/team-form.tsx | 15 +-
devsoc24-portal-fe/src/app/signup/page.tsx | 2 -
.../src/components/forms/create-team-form.tsx | 166 +++++---
.../src/components/forms/external-form.tsx | 365 +++++++++++-------
.../src/components/forms/join-team-form.tsx | 194 ++++++----
.../src/components/forms/vitian-form.tsx | 357 ++++++++++-------
devsoc24-portal-fe/src/schemas/signup.ts | 140 +++----
12 files changed, 779 insertions(+), 529 deletions(-)
diff --git a/devsoc24-portal-fe/src/app/forgot/forgot-pass-form.tsx b/devsoc24-portal-fe/src/app/forgot/forgot-pass-form.tsx
index e375128..8760936 100644
--- a/devsoc24-portal-fe/src/app/forgot/forgot-pass-form.tsx
+++ b/devsoc24-portal-fe/src/app/forgot/forgot-pass-form.tsx
@@ -31,22 +31,7 @@ export default function ForgotForm() {
async function onSubmit(data: ForgotFormValues) {
console.log(data);
- // const toastId = toast.loading("Logging in...", { autoClose: false });
- // const res = await loginUser(data);
-
- // toast.update(toastId, {
- // render:
- // res === 200 ? "Login successful!" : res !== 500 ? res : ,
- // type: res === 200 ? "success" : "error",
- // isLoading: false,
- // autoClose: 2000,
- // });
-
- // if (res === 200) {
- // setTimeout(() => {
- // void router.push("/overview");
- // }, 2000);
- // }
+
}
return (
diff --git a/devsoc24-portal-fe/src/app/login/login-form.tsx b/devsoc24-portal-fe/src/app/login/login-form.tsx
index 69ab1b0..686e0a1 100644
--- a/devsoc24-portal-fe/src/app/login/login-form.tsx
+++ b/devsoc24-portal-fe/src/app/login/login-form.tsx
@@ -17,7 +17,7 @@ import "react-toastify/dist/ReactToastify.css";
import { useRouter } from "next/navigation";
import { EyeIcon, EyeOffIcon, LockKeyholeIcon, MailIcon } from "lucide-react";
import Link from "next/link";
-import { type LoginResponse } from "@/schemas/api";
+import { type APIResponse, type LoginResponse } from "@/schemas/api";
import axios, { type AxiosError } from "axios";
import { BadRequest, ServerError } from "@/components/toast";
@@ -39,7 +39,7 @@ export default function LoginForm() {
async function onSubmit(formVal: LoginFormValues) {
const toastId = toast.loading("Logging in...", { autoClose: false });
try {
- const { data } = await axios.post(
+ const { data } = await axios.post(
`${process.env.NEXT_PUBLIC_API_URL}/login`,
{ email: formVal.email, password: formVal.password },
);
@@ -54,8 +54,10 @@ export default function LoginForm() {
isLoading: false,
autoClose: 2000,
});
+ const res = data.data as LoginResponse;
+
setTimeout(() => {
- if (data.profile_complete) {
+ if (res.profile_complete) {
void router.push("/");
} else {
void router.push("/signup/details?email=" + formVal.email);
@@ -101,6 +103,9 @@ export default function LoginForm() {
isLoading: false,
autoClose: 2000,
});
+ setTimeout(() => {
+ void router.push("/signup/verify?email=" + formVal.email);
+ }, 1500);
} else if (error.response?.status === 400) {
toast.update(toastId, {
render: ,
diff --git a/devsoc24-portal-fe/src/app/reset/page.tsx b/devsoc24-portal-fe/src/app/reset/page.tsx
index 7dcd6a5..acc88e1 100644
--- a/devsoc24-portal-fe/src/app/reset/page.tsx
+++ b/devsoc24-portal-fe/src/app/reset/page.tsx
@@ -2,7 +2,6 @@
import React, { useEffect, useState } from "react";
import Logo from "@/components/logo";
-import { ModeToggle } from "@/components/theme-toggle";
import { Card, CardContent, CardHeader } from "@/components/ui/card";
import Image from "next/image";
import title from "@/assets/images/title.svg";
@@ -31,7 +30,6 @@ export default function Page() {
- {/* */}
diff --git a/devsoc24-portal-fe/src/app/signup/details/page.tsx b/devsoc24-portal-fe/src/app/signup/details/page.tsx
index 447bb2e..cd8ae15 100644
--- a/devsoc24-portal-fe/src/app/signup/details/page.tsx
+++ b/devsoc24-portal-fe/src/app/signup/details/page.tsx
@@ -13,7 +13,7 @@ import { DiscordIcon } from "@/assets/images/discord";
import TeamDetailsForm from "./team-form";
export default function Page() {
- const [form, setForm] = useState(0);
+ const [form, setForm] = useState(2);
const [isBannerVisible, setIsBannerVisible] = useState(true);
return (
@@ -64,7 +64,7 @@ export default function Page() {
{form === 0 && }
{form === 1 && }
- {form === 2 && }
+ {form === 2 && }
);
diff --git a/devsoc24-portal-fe/src/app/signup/details/personal-details-form.tsx b/devsoc24-portal-fe/src/app/signup/details/personal-details-form.tsx
index 23025a9..4abb8f4 100644
--- a/devsoc24-portal-fe/src/app/signup/details/personal-details-form.tsx
+++ b/devsoc24-portal-fe/src/app/signup/details/personal-details-form.tsx
@@ -52,30 +52,18 @@ export default function PersonalDetails({
useEffect(() => {
form.setValue("firstName", localStorage.getItem("first_name") ?? "");
form.setValue("lastName", localStorage.getItem("last_name") ?? "");
+ form.setValue("email", email ?? "");
form.setValue("phoneNumber", localStorage.getItem("phone_number") ?? "");
form.setValue("country", localStorage.getItem("country") ?? "+91");
- const gender = localStorage.getItem("gender");
- console.log(gender);
-
- switch (gender) {
- case "Male": {
- form.setValue("gender", "Male");
- break;
- }
- case "Female": {
- form.setValue("gender", "Female");
- break;
- }
- case "Others": {
- form.setValue("gender", "Others");
- break;
- }
- case "Prefer Not to Say": {
- form.setValue("gender", "Prefer Not to Say");
- break;
- }
- }
- });
+ form.setValue(
+ "gender",
+ (localStorage.getItem("gender") as
+ | "Male"
+ | "Female"
+ | "Others"
+ | "Prefer Not to Say") ?? undefined,
+ );
+ }, []);
async function onSubmit(data: PersonalDetailsFormValues) {
localStorage.setItem("first_name", data.firstName);
@@ -104,6 +92,7 @@ export default function PersonalDetails({
type="text"
placeholder="First Name"
autoComplete="First Name"
+ required
{...field}
className={` ${
form.getFieldState("firstName").invalid
@@ -155,6 +144,7 @@ export default function PersonalDetails({
type="email"
placeholder="Email Address"
autoComplete="email"
+ required
disabled
{...field}
className={` ${
@@ -206,6 +196,7 @@ export default function PersonalDetails({
type="text"
placeholder="Phone Number"
autoComplete="phone"
+ required
{...field}
className={`pl-[80px] ${
form.getFieldState("phoneNumber").invalid
diff --git a/devsoc24-portal-fe/src/app/signup/details/team-form.tsx b/devsoc24-portal-fe/src/app/signup/details/team-form.tsx
index 0649aab..3df8ad9 100644
--- a/devsoc24-portal-fe/src/app/signup/details/team-form.tsx
+++ b/devsoc24-portal-fe/src/app/signup/details/team-form.tsx
@@ -6,12 +6,10 @@ import React, { useState } from "react";
import CreateTeamForm from "@/components/forms/create-team-form";
import JoinTeamForm from "@/components/forms/join-team-form";
import { Button } from "@/components/ui/button";
+import { useRouter } from "next/navigation";
-export default function TeamDetailsForm({
- setForm,
-}: {
- setForm: React.Dispatch>;
-}) {
+export default function TeamDetailsForm() {
+ const router = useRouter();
const [isNewTeam, setisNewTeam] = useState(false);
return (
@@ -35,7 +33,12 @@ export default function TeamDetailsForm({
{isNewTeam ? : }
-
+
You can join / create a team later!
diff --git a/devsoc24-portal-fe/src/app/signup/page.tsx b/devsoc24-portal-fe/src/app/signup/page.tsx
index e305726..1f42d21 100644
--- a/devsoc24-portal-fe/src/app/signup/page.tsx
+++ b/devsoc24-portal-fe/src/app/signup/page.tsx
@@ -2,7 +2,6 @@
import React, { useEffect, useState } from "react";
import Logo from "@/components/logo";
-import { ModeToggle } from "@/components/theme-toggle";
import { Card, CardContent, CardHeader } from "@/components/ui/card";
import Image from "next/image";
import title from "@/assets/images/title.svg";
@@ -31,7 +30,6 @@ export default function Page() {
- {/* */}
diff --git a/devsoc24-portal-fe/src/components/forms/create-team-form.tsx b/devsoc24-portal-fe/src/components/forms/create-team-form.tsx
index 94b3e13..01c0a4a 100644
--- a/devsoc24-portal-fe/src/components/forms/create-team-form.tsx
+++ b/devsoc24-portal-fe/src/components/forms/create-team-form.tsx
@@ -5,13 +5,6 @@ import React from "react";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { type z } from "zod";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@/components/ui/select";
import {
Form,
FormControl,
@@ -22,10 +15,17 @@ import {
} from "@/components/ui/form";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
+import { toast, ToastContainer } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+import axios, { type AxiosError } from "axios";
+import { type APIResponse } from "@/schemas/api";
+import { useRouter } from "next/navigation";
+import { BadRequest, ServerError } from "../toast";
type CreateTeamFormValues = z.infer;
export default function CreateTeamForm() {
+ const router = useRouter();
const createTeamForm = useForm({
resolver: zodResolver(createTeamSchema),
defaultValues: {
@@ -35,57 +35,113 @@ export default function CreateTeamForm() {
});
async function onSubmit(data: CreateTeamFormValues) {
+ const toastId = toast.loading("Creating...", { autoClose: false });
console.log(data);
- // const toastId = toast.loading("Logging in...", { autoClose: false });
- // const res = await loginUser(data);
-
- // toast.update(toastId, {
- // render:
- // res === 200 ? "Login successful!" : res !== 500 ? res : ,
- // type: res === 200 ? "success" : "error",
- // isLoading: false,
- // autoClose: 2000,
- // });
-
- // if (res === 200) {
- // setTimeout(() => {
- // void router.push("/overview");
- // }, 2000);
- // }
+ try {
+ await axios.post(
+ `${process.env.NEXT_PUBLIC_API_URL}/team/create`,
+ { name: data.teamName },
+ {
+ withCredentials: true,
+ },
+ );
+ toast.update(toastId, {
+ render: (
+
+
Success!
+
Team created successfully.
+
+ ),
+ type: "success",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ setTimeout(() => {
+ void router.push("/");
+ }, 1500);
+ return;
+ } catch (err) {
+ console.log(err);
+ if (axios.isAxiosError(err)) {
+ const error = err as AxiosError;
+ if (error.response?.status === 400) {
+ toast.update(toastId, {
+ render: ,
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ return;
+ } else if (error.response?.status === 417) {
+ toast.update(toastId, {
+ render: (
+
+
User is already in a team!
+
Leave the team to create a new one.
+
+ ),
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ return;
+ } else if (error.response?.status === 409) {
+ toast.update(toastId, {
+ render: (
+
+
Team name already exists!
+
Please choose a different name for your team.
+
+ ),
+ });
+ return;
+ }
+ }
+ toast.update(toastId, {
+ render: ,
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ return;
+ }
}
return (
-
-
+ <>
+
+
+
+ >
);
}
diff --git a/devsoc24-portal-fe/src/components/forms/external-form.tsx b/devsoc24-portal-fe/src/components/forms/external-form.tsx
index 1b782a9..c5b4296 100644
--- a/devsoc24-portal-fe/src/components/forms/external-form.tsx
+++ b/devsoc24-portal-fe/src/components/forms/external-form.tsx
@@ -23,6 +23,12 @@ import {
} from "@/components/ui/form";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
+import { ToastContainer, toast } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+import axios, { type AxiosError } from "axios";
+import { type APIResponse } from "@/schemas/api";
+import { BadRequest, ServerError } from "../toast";
+import { useSearchParams } from "next/navigation";
type ExternalDetailsFormValues = z.infer;
@@ -31,6 +37,8 @@ export default function ExternalForm({
}: {
setForm: React.Dispatch>;
}) {
+ const searchParams = useSearchParams();
+ const email = searchParams.get("email");
const externalForm = useForm({
resolver: zodResolver(externalDetails),
defaultValues: {
@@ -43,155 +51,222 @@ export default function ExternalForm({
});
async function onSubmit(data: ExternalDetailsFormValues) {
- console.log(data);
- // const toastId = toast.loading("Logging in...", { autoClose: false });
- // const res = await loginUser(data);
+ const toastId = toast.loading("Saving...", { autoClose: false });
+ const updatedData = {
+ first_name: localStorage.getItem("first_name"),
+ last_name: localStorage.getItem("last_name"),
+ phone: localStorage.getItem("phone_number"),
+ gender: localStorage.getItem("gender"),
+ is_vitian: false,
+ email: email,
+ college: data.collegeName,
+ city: data.collegeCity,
+ state: data.collegeState,
+ reg_no: data.collegeRollNumber,
+ };
+ console.log(updatedData);
- // toast.update(toastId, {
- // render:
- // res === 200 ? "Login successful!" : res !== 500 ? res : ,
- // type: res === 200 ? "success" : "error",
- // isLoading: false,
- // autoClose: 2000,
- // });
-
- // if (res === 200) {
- // setTimeout(() => {
- // void router.push("/overview");
- // }, 2000);
- // }
+ try {
+ await axios.post(
+ `${process.env.NEXT_PUBLIC_API_URL}/user/complete-profile`,
+ updatedData,
+ {
+ withCredentials: true,
+ },
+ );
+ toast.update(toastId, {
+ render: (
+
+
Success!
+
Account details saved successfully.
+
+ ),
+ type: "success",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ setForm(2);
+ return;
+ } catch (err) {
+ console.log(err);
+ if (axios.isAxiosError(err)) {
+ const error = err as AxiosError;
+ if (error.response?.status === 400) {
+ toast.update(toastId, {
+ render: ,
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ } else if (error.response?.status === 403) {
+ toast.update(toastId, {
+ render: (
+
+
Email not verified!
+
Please verify your email.
+
+ ),
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ } else if (error.response?.status === 404) {
+ toast.update(toastId, {
+ render: (
+
+
User not found!
+
Please sign up.
+
+ ),
+ });
+ }
+ return;
+ }
+ toast.update(toastId, {
+ render: ,
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ return;
+ }
}
return (
-
+ (
+
+ College Identification Number
+
+
+
+
+
+
+
+ )}
+ />
+
+
+
+
+
+
+ >
);
}
diff --git a/devsoc24-portal-fe/src/components/forms/join-team-form.tsx b/devsoc24-portal-fe/src/components/forms/join-team-form.tsx
index 909e138..cf640ad 100644
--- a/devsoc24-portal-fe/src/components/forms/join-team-form.tsx
+++ b/devsoc24-portal-fe/src/components/forms/join-team-form.tsx
@@ -4,7 +4,7 @@ import { joinTeamSchema } from "@/schemas/signup";
import React from "react";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
-import { z } from "zod"; // Change this line from { type z } to { z }
+import { type z } from "zod";
import {
Form,
FormControl,
@@ -15,11 +15,17 @@ import {
} from "@/components/ui/form";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
-import axios from "axios"; // Removed AxiosResponse import
+import axios, { type AxiosError } from "axios";
+import { ToastContainer, toast } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+import { type APIResponse } from "@/schemas/api";
+import { useRouter } from "next/navigation";
+import { BadRequest, ServerError } from "../toast";
type CreateTeamFormValues = z.infer;
export default function JoinTeamForm() {
+ const router = useRouter();
const createTeamForm = useForm({
resolver: zodResolver(joinTeamSchema),
defaultValues: {
@@ -29,90 +35,128 @@ export default function JoinTeamForm() {
});
async function onSubmit(data: CreateTeamFormValues) {
+ const toastId = toast.loading("Joining...", { autoClose: false });
console.log(data);
- console.log("submittt")
- // const toastId = toast.loading("Logging in...", { autoClose: false });
- // const res = await loginUser(data);
-
- // toast.update(toastId, {
- // render:
- // res === 200 ? "Login successful!" : res !== 500 ? res : ,
- // type: res === 200 ? "success" : "error",
- // isLoading: false,
- // autoClose: 2000,
- // });
-
- // if (res === 200) {
- // setTimeout(() => {
- // void router.push("/overview");
- // }, 2000);
- // }
- }
-
- const handleJoinTeam = async (e: string) => {
- console.log("clicked");
try {
- const response = await axios.post(
+ await axios.post(
`${process.env.NEXT_PUBLIC_API_URL}/team/join`,
- {
- code: e,
- },
+ { code: data.teamCode },
{
withCredentials: true,
},
);
- console.log("FETCH IDEA: ", response);
- } catch (e) {
- if (axios.isAxiosError(e)) {
- switch (e.response?.status) {
- // case 404:
- // console.log("no team");
- // case 417:
- // console.log("team no idea");
- default:
- console.log(e);
+ toast.update(toastId, {
+ render: (
+
+
Success!
+
Team joined successfully.
+
+ ),
+ type: "success",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ setTimeout(() => {
+ void router.push("/");
+ }, 1500);
+ return;
+ } catch (err) {
+ console.log(err);
+ if (axios.isAxiosError(err)) {
+ const error = err as AxiosError;
+ if (error.response?.status === 400) {
+ toast.update(toastId, {
+ render: ,
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ return;
+ } else if (error.response?.status === 417) {
+ toast.update(toastId, {
+ render: (
+
+
User is already in a team!
+
Leave the team to create a new one.
+
+ ),
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ return;
+ } else if (error.response?.status === 409) {
+ toast.update(toastId, {
+ render: (
+
+
Invalid team code!
+
Please check the team code and try again.
+
+ ),
+ });
+ return;
+ } else if (error.response?.status === 424) {
+ toast.update(toastId, {
+ render: (
+
+
Team is full!
+
Try joining another team.
+
+ ),
+ });
+ return;
}
}
+ toast.update(toastId, {
+ render: ,
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ return;
}
- };
+ }
return (
-
-
+ <>
+
+
+
+ >
);
}
diff --git a/devsoc24-portal-fe/src/components/forms/vitian-form.tsx b/devsoc24-portal-fe/src/components/forms/vitian-form.tsx
index 6f7a2d9..f184c63 100644
--- a/devsoc24-portal-fe/src/components/forms/vitian-form.tsx
+++ b/devsoc24-portal-fe/src/components/forms/vitian-form.tsx
@@ -23,6 +23,12 @@ import {
} from "@/components/ui/form";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
+import { ToastContainer, toast } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+import { useSearchParams } from "next/navigation";
+import { BadRequest, ServerError } from "../toast";
+import axios, { type AxiosError } from "axios";
+import { type APIResponse } from "@/schemas/api";
type VitianDetailsFormValues = z.infer;
@@ -31,6 +37,8 @@ export default function VitianForm({
}: {
setForm: React.Dispatch>;
}) {
+ const searchParams = useSearchParams();
+ const email = searchParams.get("email");
const vitianForm = useForm({
resolver: zodResolver(vitianDetails),
defaultValues: {
@@ -43,9 +51,91 @@ export default function VitianForm({
});
async function onSubmit(data: VitianDetailsFormValues) {
- console.log(data);
- // const toastId = toast.loading("Logging in...", { autoClose: false });
- // const res = await loginUser(data);
+ const toastId = toast.loading("Saving...", { autoClose: false });
+ const updatedData = {
+ first_name: localStorage.getItem("first_name"),
+ last_name: localStorage.getItem("last_name"),
+ phone: localStorage.getItem("phone_number"),
+ gender: localStorage.getItem("gender"),
+ is_vitian: true,
+ email: email,
+ college: "VIT Vellore",
+ city: "Vellore",
+ state: "Tamil Nadu",
+ reg_no: data.regNumber,
+ block: data.block,
+ room: data.roomNumber,
+ vit_email: data.vitEmail,
+ };
+ console.log(updatedData);
+
+ try {
+ await axios.post(
+ `${process.env.NEXT_PUBLIC_API_URL}/user/complete-profile`,
+ updatedData,
+ {
+ withCredentials: true,
+ },
+ );
+ toast.update(toastId, {
+ render: (
+
+
Success!
+
Account details saved successfully.
+
+ ),
+ type: "success",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ setTimeout(() => setForm(2), 1500);
+ return;
+ } catch (err) {
+ console.log(err);
+ if (axios.isAxiosError(err)) {
+ const error = err as AxiosError;
+ if (error.response?.status === 400) {
+ toast.update(toastId, {
+ render: ,
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ } else if (error.response?.status === 403) {
+ toast.update(toastId, {
+ render: (
+
+
Email not verified!
+
Please verify your email.
+
+ ),
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ } else if (error.response?.status === 404) {
+ toast.update(toastId, {
+ render: (
+
+
User not found!
+
Please sign up.
+
+ ),
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ }
+ return;
+ }
+ toast.update(toastId, {
+ render: ,
+ type: "error",
+ isLoading: false,
+ autoClose: 2000,
+ });
+ return;
+ }
// toast.update(toastId, {
// render:
@@ -62,134 +152,137 @@ export default function VitianForm({
// }
}
return (
-
-
+ <>
+
+
+
+ >
);
}
diff --git a/devsoc24-portal-fe/src/schemas/signup.ts b/devsoc24-portal-fe/src/schemas/signup.ts
index 0d9ffce..7a989f6 100644
--- a/devsoc24-portal-fe/src/schemas/signup.ts
+++ b/devsoc24-portal-fe/src/schemas/signup.ts
@@ -47,10 +47,10 @@ export const personalDetailsSchema = z.object({
.max(50, "First Name cannot be longer than 50 characters"),
lastName: z
.string({
- required_error: "First Name is required",
- invalid_type_error: "First Name must be a string",
+ required_error: "Last Name is required",
+ invalid_type_error: "Last Name must be a string",
})
- .max(50, "First Name cannot be longer than 50 characters"),
+ .max(50, "Last Name cannot be longer than 50 characters"),
email: z
.string({
required_error: "Email is required",
@@ -95,39 +95,39 @@ export const vitianDetails = z.object({
invalid_type_error: "VIT Email must be a string",
})
.regex(/^[a-zA-Z0-9._-]+@vitstudent.ac.in$/, "Enter a valid VIT email"),
- block: z.union([
- z.literal("Ladies' Hostel - A Block"),
- z.literal("Ladies' Hostel - B Block"),
- z.literal("Ladies' Hostel - C Block"),
- z.literal("Ladies' Hostel - D Block"),
- z.literal("Ladies' Hostel - E Block"),
- z.literal("Ladies' Hostel - F Block"),
- z.literal("Ladies' Hostel - G Block"),
- z.literal("Ladies' Hostel - H Block"),
- z.literal("Men's Hostel - A Block"),
- z.literal("Men's Hostel - B Block"),
- z.literal("Men's Hostel - B Annex"),
- z.literal("Men's Hostel - C Block"),
- z.literal("Men's Hostel - D Block"),
- z.literal("Men's Hostel - D Annex"),
- z.literal("Men's Hostel - E Block"),
- z.literal("Men's Hostel - F Block"),
- z.literal("Men's Hostel - G Block"),
- z.literal("Men's Hostel - H Block"),
- z.literal("Men's Hostel - J Block"),
- z.literal("Men's Hostel - K Block"),
- z.literal("Men's Hostel - L Block"),
- z.literal("Men's Hostel - M Block"),
- z.literal("Men's Hostel - N Block"),
- z.literal("Men's Hostel - P Block"),
- z.literal("Men's Hostel - Q Block"),
- z.literal("Men's Hostel - R Block"),
- ]),
+ block: z
+ .literal("Ladies' Hostel - A Block")
+ .or(z.literal("Ladies' Hostel - B Block"))
+ .or(z.literal("Ladies' Hostel - C Block"))
+ .or(z.literal("Ladies' Hostel - D Block"))
+ .or(z.literal("Ladies' Hostel - E Block"))
+ .or(z.literal("Ladies' Hostel - F Block"))
+ .or(z.literal("Ladies' Hostel - G Block"))
+ .or(z.literal("Ladies' Hostel - H Block"))
+ .or(z.literal("Men's Hostel - A Block"))
+ .or(z.literal("Men's Hostel - B Block"))
+ .or(z.literal("Men's Hostel - B Annex"))
+ .or(z.literal("Men's Hostel - C Block"))
+ .or(z.literal("Men's Hostel - D Block"))
+ .or(z.literal("Men's Hostel - D Annex"))
+ .or(z.literal("Men's Hostel - E Block"))
+ .or(z.literal("Men's Hostel - F Block"))
+ .or(z.literal("Men's Hostel - G Block"))
+ .or(z.literal("Men's Hostel - H Block"))
+ .or(z.literal("Men's Hostel - J Block"))
+ .or(z.literal("Men's Hostel - K Block"))
+ .or(z.literal("Men's Hostel - L Block"))
+ .or(z.literal("Men's Hostel - M Block"))
+ .or(z.literal("Men's Hostel - N Block"))
+ .or(z.literal("Men's Hostel - P Block"))
+ .or(z.literal("Men's Hostel - Q Block"))
+ .or(z.literal("Men's Hostel - R Block")),
roomNumber: z
.string({
required_error: "Required",
invalid_type_error: "Room number must be a string",
})
+ .min(1, "Enter a valid room number")
.max(10, "Enter a valid room number"),
});
@@ -137,56 +137,58 @@ export const externalDetails = z.object({
required_error: "Required",
invalid_type_error: "College name must be a string",
})
+ .min(1, "Enter a valid college name")
.max(50, "Enter a valid college name"),
collegeCity: z
.string({
required_error: "Required",
invalid_type_error: "College city must be a string",
})
+ .min(1, "Enter a valid college city")
.max(50, "Enter a valid college city"),
- collegeState: z.union([
- z.literal("Andaman and Nicobar Islands"),
- z.literal("Andhra Pradesh"),
- z.literal("Arunachal Pradesh"),
- z.literal("Assam"),
- z.literal("Bihar"),
- z.literal("Chandigarh"),
- z.literal("Chhattisgarh"),
- z.literal("Dadra and Nagar Haveli"),
- z.literal("Daman and Diu"),
- z.literal("Delhi"),
- z.literal("Goa"),
- z.literal("Gujarat"),
- z.literal("Haryana"),
- z.literal("Himachal Pradesh"),
- z.literal("Jammu and Kashmir"),
- z.literal("Jharkhand"),
- z.literal("Karnataka"),
- z.literal("Kerala"),
- z.literal("Lakshadweep"),
- z.literal("Madhya Pradesh"),
- z.literal("Maharashtra"),
- z.literal("Manipur"),
- z.literal("Meghalaya"),
- z.literal("Mizoram"),
- z.literal("Nagaland"),
- z.literal("Odisha"),
- z.literal("Puducherry"),
- z.literal("Punjab"),
- z.literal("Rajasthan"),
- z.literal("Sikkim"),
- z.literal("Tamil Nadu"),
- z.literal("Telangana"),
- z.literal("Tripura"),
- z.literal("Uttar Pradesh"),
- z.literal("Uttarakhand"),
- z.literal("West Bengal"),
- ]),
+ collegeState: z
+ .literal("Andaman and Nicobar Islands")
+ .or(z.literal("Andhra Pradesh"))
+ .or(z.literal("Arunachal Pradesh"))
+ .or(z.literal("Assam"))
+ .or(z.literal("Bihar"))
+ .or(z.literal("Chandigarh"))
+ .or(z.literal("Chhattisgarh"))
+ .or(z.literal("Dadra and Nagar Haveli"))
+ .or(z.literal("Daman and Diu"))
+ .or(z.literal("Delhi"))
+ .or(z.literal("Goa"))
+ .or(z.literal("Gujarat"))
+ .or(z.literal("Haryana"))
+ .or(z.literal("Himachal Pradesh"))
+ .or(z.literal("Jammu and Kashmir"))
+ .or(z.literal("Jharkhand"))
+ .or(z.literal("Karnataka"))
+ .or(z.literal("Kerala"))
+ .or(z.literal("Lakshadweep"))
+ .or(z.literal("Madhya Pradesh"))
+ .or(z.literal("Maharashtra"))
+ .or(z.literal("Manipur"))
+ .or(z.literal("Meghalaya"))
+ .or(z.literal("Mizoram"))
+ .or(z.literal("Nagaland"))
+ .or(z.literal("Odisha"))
+ .or(z.literal("Puducherry"))
+ .or(z.literal("Punjab"))
+ .or(z.literal("Rajasthan"))
+ .or(z.literal("Sikkim"))
+ .or(z.literal("Tamil Nadu"))
+ .or(z.literal("Telangana"))
+ .or(z.literal("Tripura"))
+ .or(z.literal("Uttar Pradesh"))
+ .or(z.literal("Uttarakhand"))
+ .or(z.literal("West Bengal")),
collegeRollNumber: z
.string({
required_error: "Required",
invalid_type_error: "College roll number must be a string",
})
+ .min(1, "Enter a valid college roll number")
.max(50, "Enter a valid college roll number"),
});