@@ -24,6 +24,8 @@ type FormData = {
2424 mobileNumber : string ;
2525 email : string ;
2626 username : string ;
27+ orgCode : string ;
28+ managementName : string ;
2729} ;
2830
2931const formatMobile = ( val : string ) => {
@@ -53,6 +55,8 @@ const LoginPage: React.FC = () => {
5355 newPassword : '' ,
5456 email : '' ,
5557 username : '' ,
58+ orgCode : '' ,
59+ managementName : '' ,
5660 } ) ;
5761
5862 const [ errors , setErrors ] = useState < Partial < Record < keyof FormData , string > > > ( { } ) ;
@@ -110,6 +114,13 @@ const LoginPage: React.FC = () => {
110114 case 'username' :
111115 if ( ! value . trim ( ) ) error = 'Username is required' ;
112116 break ;
117+ case 'orgCode' :
118+ if ( ! value . trim ( ) ) error = 'Org Code is required' ;
119+ else if ( ! / ^ \d { 4 } $ / . test ( value . trim ( ) ) ) error = 'Org Code must be 4 digits' ;
120+ break ;
121+ case 'managementName' :
122+ if ( view === 'mobile-setup' && ! value . trim ( ) ) error = 'Management name is required' ;
123+ break ;
113124 }
114125 return error ;
115126 } ;
@@ -134,7 +145,7 @@ const LoginPage: React.FC = () => {
134145 const handleLogin = async ( e : React . FormEvent ) => {
135146 e . preventDefault ( ) ;
136147 clearMessages ( ) ;
137- const fields = authMethod === 'email' ? [ 'loginEmail' , 'loginPassword' ] : [ 'loginMobile' , 'loginPassword' ] ;
148+ const fields = authMethod === 'email' ? [ 'loginEmail' , 'loginPassword' , 'orgCode' ] : [ 'loginMobile' , 'loginPassword' , 'orgCode '] ;
138149 let isValid = true ;
139150 const newErrors : any = { } ;
140151 fields . forEach ( f => {
@@ -147,7 +158,7 @@ const LoginPage: React.FC = () => {
147158 // Strip formatting from phone number for login
148159 let identifier = authMethod === 'email' ? formData . loginEmail : formData . loginMobile . replace ( / \D / g, '' ) ;
149160 try {
150- await login ( identifier , formData . loginPassword ) ;
161+ await login ( identifier , formData . loginPassword , formData . orgCode . trim ( ) ) ;
151162 navigate ( '/dashboard/home' ) ;
152163 } catch ( err : any ) {
153164 setApiError ( err . message || 'Login failed.' ) ;
@@ -228,7 +239,9 @@ const LoginPage: React.FC = () => {
228239 const e1 = validateField ( 'email' , formData . email ) ;
229240 const e2 = validateField ( 'username' , formData . username ) ;
230241 const e3 = validateField ( 'newPassword' , formData . newPassword ) ;
231- if ( e1 || e2 || e3 ) { setErrors ( { email : e1 , username : e2 , newPassword : e3 } ) ; return ; }
242+ const e4 = validateField ( 'orgCode' , formData . orgCode ) ;
243+ const e5 = validateField ( 'managementName' , formData . managementName ) ;
244+ if ( e1 || e2 || e3 || e4 || e5 ) { setErrors ( { email : e1 , username : e2 , newPassword : e3 , orgCode : e4 , managementName : e5 } ) ; return ; }
232245
233246 // Check username uniqueness
234247 try {
@@ -255,10 +268,12 @@ const LoginPage: React.FC = () => {
255268 password : formData . newPassword ,
256269 profile_pic_url : DEFAULT_AVATARS [ Math . floor ( Math . random ( ) * DEFAULT_AVATARS . length ) ] ,
257270 role : 'user' ,
271+ org_code : formData . orgCode . trim ( ) ,
272+ management_name : formData . managementName . trim ( ) ,
258273 } ) ;
259274
260275 // Auto-login after registration
261- await login ( phoneDigits , formData . newPassword ) ;
276+ await login ( phoneDigits , formData . newPassword , formData . orgCode . trim ( ) ) ;
262277 setSuccess ( 'Account created! Welcome to the squad.' ) ;
263278 setTimeout ( ( ) => navigate ( '/dashboard/home' ) , 1500 ) ;
264279 } catch ( err : any ) {
@@ -304,6 +319,7 @@ const LoginPage: React.FC = () => {
304319 < div className = "absolute right-4 top-10 text-orange-400 flex items-center gap-1" > < AlertCircle size = { 14 } /> < span className = "text-[10px] font-bold" > FORMAT?</ span > </ div >
305320 ) }
306321 </ div >
322+ < Input name = "orgCode" label = "Org Code" type = "text" value = { formData . orgCode } onChange = { handleChange } error = { errors . orgCode } icon = { < User size = { 16 } /> } placeholder = "4-digit code" />
307323 < Input name = "loginPassword" label = "Password" type = { showPassword ? 'text' : 'password' } value = { formData . loginPassword } onChange = { handleChange } error = { errors . loginPassword } icon = { < Lock size = { 16 } /> } rightIcon = { showPassword ? < EyeOff size = { 16 } /> : < Eye size = { 16 } /> } onRightIconClick = { ( ) => setShowPassword ( ! showPassword ) } />
308324 < div className = "flex justify-end px-1" > < button type = "button" onClick = { ( ) => setView ( 'forgot' ) } className = "text-[10px] font-black uppercase tracking-widest text-zinc-500 hover:text-white transition-colors" > Forgot Password?</ button > </ div >
309325 < Button type = "submit" className = "w-full py-4 uppercase tracking-widest font-black" disabled = { loading } > Enter Squad</ Button >
@@ -317,6 +333,7 @@ const LoginPage: React.FC = () => {
317333 < h1 className = "text-3xl font-black text-white tracking-tighter mb-8" > MOBILE</ h1 >
318334 < form className = "space-y-6" onSubmit = { handleLogin } noValidate >
319335 < Input name = "loginMobile" label = "Phone" type = "tel" value = { formData . loginMobile } onChange = { handleChange } error = { errors . loginMobile } icon = { < Smartphone size = { 16 } /> } placeholder = "(000) 000-0000" />
336+ < Input name = "orgCode" label = "Org Code" type = "text" value = { formData . orgCode } onChange = { handleChange } error = { errors . orgCode } icon = { < User size = { 16 } /> } placeholder = "4-digit code" />
320337 < Input name = "loginPassword" label = "Password" type = { showPassword ? 'text' : 'password' } value = { formData . loginPassword } onChange = { handleChange } error = { errors . loginPassword } icon = { < Lock size = { 16 } /> } rightIcon = { showPassword ? < EyeOff size = { 16 } /> : < Eye size = { 16 } /> } onRightIconClick = { ( ) => setShowPassword ( ! showPassword ) } />
321338 < Button type = "submit" className = "w-full py-4 uppercase tracking-widest font-black" disabled = { loading } > Join Meetup</ Button >
322339 < div className = "text-center" > < button type = "button" onClick = { ( ) => setView ( 'mobile-register' ) } className = "text-[10px] font-black uppercase tracking-widest text-zinc-500 hover:text-white transition-colors" > Create Account</ button > </ div >
@@ -366,6 +383,8 @@ const LoginPage: React.FC = () => {
366383 < form className = "space-y-6" onSubmit = { handleMobileSetup } noValidate >
367384 < Input name = "email" label = "Email Address" type = "email" value = { formData . email } onChange = { handleChange } error = { errors . email } icon = { < Mail size = { 16 } /> } placeholder = "john@doe.com" />
368385 < Input name = "username" label = "Username" type = "text" value = { formData . username } onChange = { handleChange } error = { errors . username } icon = { < AtSign size = { 16 } /> } placeholder = "johndoe" />
386+ < Input name = "managementName" label = "Management Name" type = "text" value = { formData . managementName } onChange = { handleChange } error = { errors . managementName } icon = { < User size = { 16 } /> } placeholder = "Team/Org name" />
387+ < Input name = "orgCode" label = "Org Code" type = "text" value = { formData . orgCode } onChange = { handleChange } error = { errors . orgCode } icon = { < User size = { 16 } /> } placeholder = "4-digit code" />
369388 < div className = "space-y-3" >
370389 < Input name = "newPassword" label = "Password" type = "password" value = { formData . newPassword } onChange = { handleChange } error = { errors . newPassword } icon = { < Lock size = { 16 } /> } />
371390 < PasswordStrength password = { formData . newPassword } />
0 commit comments