1+ import React , { useState } from "react"
2+ import { userRegister } from "@/lib/api/UserApi"
3+ import { useNavigate } from "react-router-dom"
14import { cn } from "@/lib/utils"
25import { Button } from "@/components/ui/button"
36import {
@@ -12,64 +15,110 @@ import { Label } from "@/components/ui/label"
1215import { Link } from "react-router-dom"
1316
1417export function RegisterForm ( {
15- className,
16- ...props
17- } : React . ComponentProps < "div" > ) {
18- return (
19- < div className = { cn ( "flex flex-col gap-6" , className ) } { ...props } >
20- < Card >
21- < CardHeader >
22- < CardTitle > Create an account</ CardTitle >
23- < CardDescription >
24- Enter your details to register a new account
25- </ CardDescription >
26- </ CardHeader >
27- < CardContent >
28- < form >
29- < div className = "flex flex-col gap-6" >
30- < div className = "grid gap-3" >
31- < Label htmlFor = "username" > Username</ Label >
32- < Input
33- id = "username"
34- type = "text"
35- placeholder = "yourusername"
36- required
37- />
38- </ div >
39- < div className = "grid gap-3" >
40- < Label htmlFor = "email" > Email</ Label >
41- < Input
42- id = "email"
43- type = "email"
44- placeholder = "m@example.com"
45- required
46- />
47- </ div >
48- < div className = "grid gap-3" >
49- < Label htmlFor = "password" > Password</ Label >
50- < Input id = "password" type = "password" required />
51- </ div >
52- < div className = "grid gap-3" >
53- < Label htmlFor = "confirm-password" > Confirm Password</ Label >
54- < Input id = "confirm-password" type = "password" required />
55- </ div >
56- < div className = "flex flex-col gap-3" >
57- < Button type = "submit" className = "w-full" >
58- Register
59- </ Button >
60- </ div >
61- </ div >
62- < div className = "mt-4 text-center text-sm" >
63- Already have an account?{ " " }
18+ className,
19+ ...props
20+ } : React . ComponentProps < "div" > ) {
21+ const [ form , setForm ] = useState ( { username : "" , email : "" , password : "" , confirmPassword : "" } )
22+ const [ error , setError ] = useState < string | null > ( null )
23+ const [ loading , setLoading ] = useState ( false )
24+ const navigate = useNavigate ( )
6425
26+ const handleChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
27+ setForm ( { ...form , [ e . target . id ] : e . target . value } )
28+ }
6529
66- < Link to = "/login" className = "underline underline-offset-4" >
67- Login
68- </ Link >
69- </ div >
70- </ form >
71- </ CardContent >
72- </ Card >
73- </ div >
74- )
30+ const handleSubmit = async ( e : React . FormEvent ) => {
31+ e . preventDefault ( )
32+ setError ( null )
33+ if ( form . password !== form . confirmPassword ) {
34+ setError ( "Passwords do not match" )
35+ return
36+ }
37+ setLoading ( true )
38+ try {
39+ await userRegister ( {
40+ username : form . username ,
41+ email : form . email ,
42+ password : form . password ,
43+ } )
44+ navigate ( "/login" )
45+ } catch ( err : any ) {
46+ setError ( err . message )
47+ } finally {
48+ setLoading ( false )
49+ }
50+ }
51+
52+ return (
53+ < div className = { cn ( "flex flex-col gap-6" , className ) } { ...props } >
54+ < Card >
55+ < CardHeader >
56+ < CardTitle > Create an account</ CardTitle >
57+ < CardDescription >
58+ Enter your details to register a new account
59+ </ CardDescription >
60+ </ CardHeader >
61+ < CardContent >
62+ < form onSubmit = { handleSubmit } >
63+ < div className = "flex flex-col gap-6" >
64+ < div className = "grid gap-3" >
65+ < Label htmlFor = "username" > Username</ Label >
66+ < Input
67+ id = "username"
68+ type = "text"
69+ placeholder = "yourusername"
70+ required
71+ value = { form . username }
72+ onChange = { handleChange }
73+ />
74+ </ div >
75+ < div className = "grid gap-3" >
76+ < Label htmlFor = "email" > Email</ Label >
77+ < Input
78+ id = "email"
79+ type = "email"
80+ placeholder = "m@example.com"
81+ required
82+ value = { form . email }
83+ onChange = { handleChange }
84+ />
85+ </ div >
86+ < div className = "grid gap-3" >
87+ < Label htmlFor = "password" > Password</ Label >
88+ < Input
89+ id = "password"
90+ type = "password"
91+ required
92+ value = { form . password }
93+ onChange = { handleChange }
94+ />
95+ </ div >
96+ < div className = "grid gap-3" >
97+ < Label htmlFor = "confirmPassword" > Confirm Password</ Label >
98+ < Input
99+ id = "confirmPassword"
100+ type = "password"
101+ required
102+ value = { form . confirmPassword }
103+ onChange = { handleChange }
104+ />
105+ </ div >
106+ { error && < div className = "text-red-500 text-sm" > { error } </ div > }
107+ < div className = "flex flex-col gap-3" >
108+ < Button type = "submit" className = "w-full" disabled = { loading } >
109+ { loading ? "Registering..." : "Register" }
110+ </ Button >
111+ </ div >
112+ </ div >
113+ < div className = "mt-4 text-center text-sm" >
114+ Already have an account?{ " " }
115+ < Link to = "/login" className = "underline underline-offset-4" >
116+ Login
117+ </ Link >
118+ </ div >
119+ </ form >
120+ </ CardContent >
121+ </ Card >
122+ </ div >
123+ )
75124}
0 commit comments