Skip to content

Commit e261989

Browse files
committed
Implement signup function
1 parent 203c637 commit e261989

File tree

1 file changed

+64
-36
lines changed

1 file changed

+64
-36
lines changed

frontend/src/app/signup/page.tsx

Lines changed: 64 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,48 @@ import {
1313
FormMessage,
1414
FormField,
1515
} from "@/components/ui/form";
16-
17-
interface FormData {
18-
username: string;
19-
email: string;
20-
password: string;
21-
confirmPassword: string;
22-
}
16+
import { z } from "zod";
17+
import { signup } from "@/services/authService";
18+
import { useRouter } from "next/navigation";
19+
import { zodResolver } from "@hookform/resolvers/zod";
20+
21+
const SignupFormSchema = z
22+
.object({
23+
username: z
24+
.string()
25+
.min(2, { message: "Name must be at least 2 characters long." })
26+
.trim(),
27+
email: z.string().email({ message: "Please enter a valid email." }).trim(),
28+
password: z
29+
.string()
30+
.min(8, { message: "Be at least 8 characters long" })
31+
.regex(/[a-zA-Z]/, { message: "Contain at least one letter." })
32+
.regex(/[0-9]/, { message: "Contain at least one number." })
33+
.trim(),
34+
confirmPassword: z.string().trim(),
35+
})
36+
.refine((data) => data.password === data.confirmPassword, {
37+
message: "Passwords must match",
38+
path: ["confirmPassword"],
39+
});
2340

2441
export default function SignUpPage() {
25-
const methods = useForm<FormData>({
26-
defaultValues: {
27-
username: '',
28-
email: '',
29-
password: '',
30-
confirmPassword: '',
31-
},
42+
const router = useRouter();
43+
44+
const methods = useForm<z.infer<typeof SignupFormSchema>>({
45+
resolver: zodResolver(SignupFormSchema),
46+
defaultValues: {},
3247
});
3348

34-
const { handleSubmit, control, formState: { errors } } = methods;
49+
const {
50+
handleSubmit,
51+
control,
52+
formState: { errors },
53+
} = methods;
3554

36-
const onSubmit: SubmitHandler<FormData> = async (data) => {
55+
const onSubmit: SubmitHandler<z.infer<typeof SignupFormSchema>> = async (
56+
data
57+
) => {
3758
if (data.password !== data.confirmPassword) {
3859
methods.setError("confirmPassword", {
3960
type: "manual",
@@ -42,20 +63,15 @@ export default function SignUpPage() {
4263
return;
4364
}
4465

45-
try {
46-
const response = await fetch('/api/signup', {
47-
method: 'POST',
48-
headers: { 'Content-Type': 'application/json' },
49-
body: JSON.stringify(data),
50-
});
51-
52-
if (response.ok) {
53-
alert('Sign up successful!');
54-
} else {
55-
alert('Sign up failed.');
56-
}
57-
} catch (error) {
58-
console.error('Error:', error);
66+
const accessTokenResponse = await signup(data);
67+
if (accessTokenResponse.statusCode === 200 && accessTokenResponse.data) {
68+
localStorage.setItem(
69+
"access_token",
70+
accessTokenResponse.data.access_token
71+
);
72+
router.push("/dashboard");
73+
} else {
74+
// TODO: Display error message
5975
}
6076
};
6177

@@ -73,7 +89,6 @@ export default function SignUpPage() {
7389
<FormProvider {...methods}>
7490
<form onSubmit={handleSubmit(onSubmit)}>
7591
<div className="flex flex-col gap-y-2">
76-
7792
{/* Username Field */}
7893
<FormField
7994
control={control}
@@ -91,7 +106,9 @@ export default function SignUpPage() {
91106
/>
92107
</div>
93108
</FormControl>
94-
{errors.username && <FormMessage>{errors.username.message}</FormMessage>}
109+
{errors.username && (
110+
<FormMessage>{errors.username.message}</FormMessage>
111+
)}
95112
</FormItem>
96113
)}
97114
/>
@@ -114,7 +131,9 @@ export default function SignUpPage() {
114131
/>
115132
</div>
116133
</FormControl>
117-
{errors.email && <FormMessage>{errors.email.message}</FormMessage>}
134+
{errors.email && (
135+
<FormMessage>{errors.email.message}</FormMessage>
136+
)}
118137
</FormItem>
119138
)}
120139
/>
@@ -137,7 +156,9 @@ export default function SignUpPage() {
137156
/>
138157
</div>
139158
</FormControl>
140-
{errors.password && <FormMessage>{errors.password.message}</FormMessage>}
159+
{errors.password && (
160+
<FormMessage>{errors.password.message}</FormMessage>
161+
)}
141162
</FormItem>
142163
)}
143164
/>
@@ -160,15 +181,22 @@ export default function SignUpPage() {
160181
/>
161182
</div>
162183
</FormControl>
163-
{errors.confirmPassword && <FormMessage>{errors.confirmPassword.message}</FormMessage>}
184+
{errors.confirmPassword && (
185+
<FormMessage>
186+
{errors.confirmPassword.message}
187+
</FormMessage>
188+
)}
164189
</FormItem>
165190
)}
166191
/>
167192
</div>
168193

169194
{/* Forgot password link */}
170195
<div className="text-right pt-2 pb-2">
171-
<Link href="/forgotpassword" className="hover:underline text-sm">
196+
<Link
197+
href="/forgotpassword"
198+
className="hover:underline text-sm"
199+
>
172200
Forgot password?
173201
</Link>
174202
</div>

0 commit comments

Comments
 (0)