1+ import { useEffect , useState } from "react"
2+ import { registerUser } from "../api/loginapi"
3+
4+ export function Register ( ) {
5+ const [ username , setUsername ] = useState ( "" )
6+ const [ password , setPassword ] = useState ( "" )
7+ const [ confirm , setConfirm ] = useState ( "" )
8+ const [ errors , setErrors ] = useState ( {
9+ username : "" ,
10+ password : "" ,
11+ confirm : ""
12+ } ) ;
13+ const [ serverError , setServerError ] = useState ( "" ) ;
14+ const [ isSubmitting , setisSubmitting ] = useState ( false ) ;
15+
16+ const validateUsername = ( value : string ) => {
17+ if ( ! value ) return "Username is required" ;
18+ if ( value !== value . toLowerCase ( ) ) return "Username should be all lowercase"
19+ return "" ;
20+ }
21+ const validatePassword = ( value : string ) => {
22+ if ( ! value ) return "Password is required"
23+ if ( value . length < 6 ) return "Password Must Contain atleast 6 Characters"
24+ if ( ! / \d / . test ( value ) ) return "Password Must contain atleast One number"
25+ if ( ! / [ ! @ # $ % ^ & * ( ) , . ? " : { } | < > ] / . test ( value ) ) return "Password Must atleast contain a special Character"
26+ return ""
27+ }
28+ const validateConfirm = ( pwd , conf ) => {
29+ if ( ! conf ) return "Please retype password" ;
30+ if ( pwd !== conf ) return "Password do not match"
31+ return "" ;
32+ } ;
33+
34+ const onUsernameChange = ( e ) => {
35+ const v = e . target . value ;
36+ setUsername ( v )
37+ setErrors ( ( prev ) => ( { ...prev , username :validateUsername ( v ) } ) ) ;
38+ setServerError ( "" ) ;
39+ }
40+ const onPasswordChange = ( e ) => {
41+ const v = e . target . value ;
42+ setPassword ( v )
43+ setErrors ( ( prev ) => ( { ...prev , password : validatePassword ( v ) , confirm : validateConfirm ( v , confirm ) } ) )
44+ setServerError ( "" ) ;
45+ }
46+ const onConfirmChange = ( e ) => {
47+ const v = e . target . value
48+ setConfirm ( v ) ;
49+ setErrors ( ( prev ) => ( { ...prev , confirm : validateConfirm ( password , v ) } ) )
50+ setServerError ( "" ) ;
51+ }
52+
53+ const isFormValid =
54+ ! errors . username &&
55+ ! errors . password &&
56+ ! errors . confirm &&
57+ username &&
58+ password &&
59+ confirm ;
60+
61+ const handleRegister = async ( ) => {
62+ const uerror = validateUsername ( username )
63+ const perror = validatePassword ( password )
64+ const cerror = validateConfirm ( password , confirm )
65+ setErrors ( { username : uerror , password : perror , confirm : cerror } )
66+ setServerError ( "" ) ;
67+ if ( uerror || perror || cerror ) return ;
68+
69+ setisSubmitting ( true ) ;
70+ try {
71+ await registerUser ( { username, password} ) ;
72+ alert ( "New User Added" )
73+ setUsername ( "" ) ;
74+ setPassword ( "" ) ;
75+ setConfirm ( "" ) ;
76+ setErrors ( { username : "" , password : "" , confirm : "" } ) ;
77+
78+ } catch ( err ) {
79+ console . log ( err )
80+ } finally { setisSubmitting ( false ) ; }
81+ }
82+ return (
83+ < >
84+ < h2 > Register Page</ h2 >
85+ < label >
86+ < h4 > Username</ h4 >
87+ < input
88+ type = "text"
89+ placeholder = "Username"
90+ value = { username }
91+ onChange = { onUsernameChange } />
92+ </ label >
93+ { errors . username && < div style = { { color : "red" } } > { errors . username } </ div > }
94+
95+ < label >
96+ < h4 > Password</ h4 >
97+ < input
98+ type = "password"
99+ placeholder = "Password"
100+ value = { password }
101+ onChange = { onPasswordChange } />
102+ </ label >
103+ { errors . password && < div style = { { color : "red" } } > { errors . password } </ div > }
104+
105+ < label >
106+ < h4 > Retype Password</ h4 >
107+ < input type = "password"
108+ placeholder = "Retype Password"
109+ value = { confirm }
110+ onChange = { onConfirmChange } />
111+ </ label >
112+
113+ { errors . confirm && < div style = { { color : "red" } } > { errors . confirm } </ div > }
114+ { serverError && < div style = { { color : "red" , marginTop : 8 } } > { serverError } </ div > }
115+ < br > </ br >
116+ < button
117+ onClick = { handleRegister }
118+ disabled = { ! isFormValid || isSubmitting }
119+ style = { { marginTop : 12 } } >
120+ { isSubmitting ? "Registering..." : "Register" } </ button >
121+
122+ </ >
123+ )
124+ }
0 commit comments