@@ -14,13 +14,27 @@ import { OtpDataType } from '../types';
1414import { AuthorizerVerifyOtp } from './AuthorizerVerifyOtp' ;
1515import { getEmailPhoneLabels , getEmailPhonePlaceholder } from '../utils/labels' ;
1616
17- interface InputDataType {
18- given_name : string | null ;
19- family_name : string | null ;
20- email_or_phone_number : string | null ;
21- password : string | null ;
22- confirmPassword : string | null ;
23- }
17+ type Field =
18+ | 'given_name'
19+ | 'family_name'
20+ | 'email_or_phone_number'
21+ | 'password'
22+ | 'confirmPassword' ;
23+
24+ type FieldOverride = {
25+ label : string ;
26+ placeholder : string ;
27+ hide ?: boolean ;
28+ notRequired ?: boolean ;
29+ } ;
30+
31+ type InputDataType = {
32+ [ K in Field ] : string | null ;
33+ } ;
34+
35+ export type FormFieldsOverrides = {
36+ [ K in Field ] ?: FieldOverride ;
37+ } ;
2438
2539const initOtpData : OtpDataType = {
2640 is_screen_visible : false ,
@@ -33,7 +47,8 @@ export const AuthorizerSignup: FC<{
3347 onSignup ?: ( data : AuthToken ) => void ;
3448 urlProps ?: Record < string , any > ;
3549 roles ?: string [ ] ;
36- } > = ( { setView, onSignup, urlProps, roles } ) => {
50+ fieldOverrides ?: FormFieldsOverrides ;
51+ } > = ( { setView, onSignup, urlProps, roles, fieldOverrides } ) => {
3752 const [ error , setError ] = useState ( `` ) ;
3853 const [ loading , setLoading ] = useState ( false ) ;
3954 const [ otpData , setOtpData ] = useState < OtpDataType > ( { ...initOtpData } ) ;
@@ -55,9 +70,8 @@ export const AuthorizerSignup: FC<{
5570 const { authorizerRef, config, setAuthData } = useAuthorizer ( ) ;
5671 const [ disableSignupButton , setDisableSignupButton ] = useState ( false ) ;
5772
58- const onInputChange = async ( field : string , value : string ) => {
73+ const onInputChange = async ( field : string , value : string ) =>
5974 setFormData ( { ...formData , [ field ] : value } ) ;
60- } ;
6175
6276 const onSubmit = async ( e : any ) => {
6377 e . preventDefault ( ) ;
@@ -81,8 +95,8 @@ export const AuthorizerSignup: FC<{
8195 return ;
8296 }
8397 const data : SignupInput = {
84- email : email ,
85- phone_number : phone_number ,
98+ email,
99+ phone_number,
86100 given_name : formData . given_name || '' ,
87101 family_name : formData . family_name || '' ,
88102 password : formData . password || '' ,
@@ -151,11 +165,15 @@ export const AuthorizerSignup: FC<{
151165 }
152166 } ;
153167
154- const onErrorClose = ( ) => {
155- setError ( `` ) ;
156- } ;
168+ const onErrorClose = ( ) => setError ( `` ) ;
157169
158170 useEffect ( ( ) => {
171+ if (
172+ fieldOverrides ?. given_name ?. notRequired ||
173+ fieldOverrides ?. given_name ?. hide
174+ ) {
175+ return ;
176+ }
159177 if ( ( formData . given_name || '' ) . trim ( ) === '' ) {
160178 setErrorData ( { ...errorData , given_name : 'First Name is required' } ) ;
161179 } else {
@@ -164,6 +182,12 @@ export const AuthorizerSignup: FC<{
164182 } , [ formData . given_name ] ) ;
165183
166184 useEffect ( ( ) => {
185+ if (
186+ fieldOverrides ?. family_name ?. notRequired ||
187+ fieldOverrides ?. family_name ?. hide
188+ ) {
189+ return ;
190+ }
167191 if ( ( formData . family_name || '' ) . trim ( ) === '' ) {
168192 setErrorData ( { ...errorData , family_name : 'Last Name is required' } ) ;
169193 } else {
@@ -247,6 +271,55 @@ export const AuthorizerSignup: FC<{
247271 ) ;
248272 }
249273
274+ const renderField = (
275+ key : Field ,
276+ label : string ,
277+ placeholder : string ,
278+ type ?: 'text' | 'password'
279+ ) => {
280+ const fieldOverride = fieldOverrides ?. [ key ] ;
281+ if ( fieldOverride ?. hide ) {
282+ return null ;
283+ }
284+ return (
285+ < div className = { styles [ 'styled-form-group' ] } >
286+ < label
287+ className = { styles [ 'form-input-label' ] }
288+ htmlFor = { `authorizer-sign-up-${ key } ` }
289+ >
290+ { ! fieldOverride ?. notRequired && < span > * </ span > }
291+ { fieldOverride ?. label ?? label }
292+ </ label >
293+ < input
294+ name = { key }
295+ id = { `authorizer-sign-up-${ key } ` }
296+ className = { `${ styles [ 'form-input-field' ] } ${
297+ errorData [ key ] ? styles [ 'input-error-content' ] : null
298+ } `}
299+ placeholder = { fieldOverride ?. placeholder ?? placeholder }
300+ type = { type }
301+ value = { formData [ key ] || '' }
302+ onChange = { e => onInputChange ( key , e . target . value ) }
303+ />
304+ { errorData [ key ] && (
305+ < div className = { styles [ 'form-input-error' ] } > { errorData [ key ] } </ div >
306+ ) }
307+ </ div >
308+ ) ;
309+ } ;
310+
311+ const shouldFieldBlockSubmit = ( key : Field ) => {
312+ if (
313+ ( formData [ key ] ||
314+ fieldOverrides ?. [ key ] ?. notRequired ||
315+ fieldOverrides ?. [ key ] ?. hide ) &&
316+ ! errorData [ key ]
317+ ) {
318+ return false ;
319+ }
320+ return true ;
321+ } ;
322+
250323 return (
251324 < >
252325 { error && (
@@ -260,135 +333,20 @@ export const AuthorizerSignup: FC<{
260333 ! config . is_magic_link_login_enabled && (
261334 < >
262335 < form onSubmit = { onSubmit } name = "authorizer-sign-up-form" >
263- < div className = { styles [ 'styled-form-group' ] } >
264- < label
265- className = { styles [ 'form-input-label' ] }
266- htmlFor = "authorizer-sign-up-given-name"
267- >
268- < span > * </ span > First Name
269- </ label >
270- < input
271- name = "given_name"
272- id = "authorizer-sign-up-given-name"
273- className = { `${ styles [ 'form-input-field' ] } ${
274- errorData . given_name ? styles [ 'input-error-content' ] : null
275- } `}
276- placeholder = "eg. John"
277- type = "text"
278- value = { formData . given_name || '' }
279- onChange = { e => onInputChange ( 'given_name' , e . target . value ) }
280- />
281- { errorData . given_name && (
282- < div className = { styles [ 'form-input-error' ] } >
283- { errorData . given_name }
284- </ div >
285- ) }
286- </ div >
287- < div className = { styles [ 'styled-form-group' ] } >
288- < label
289- className = { styles [ 'form-input-label' ] }
290- htmlFor = "authorizer-sign-up-family-name"
291- >
292- < span > * </ span > Last Name
293- </ label >
294- < input
295- name = "family_name"
296- id = "authorizer-sign-up-family-name"
297- className = { `${ styles [ 'form-input-field' ] } ${
298- errorData . family_name ? styles [ 'input-error-content' ] : null
299- } `}
300- placeholder = "eg. Doe"
301- type = "text"
302- value = { formData . family_name || '' }
303- onChange = { e => onInputChange ( 'family_name' , e . target . value ) }
304- />
305- { errorData . family_name && (
306- < div className = { styles [ 'form-input-error' ] } >
307- { errorData . family_name }
308- </ div >
309- ) }
310- </ div >
311- < div className = { styles [ 'styled-form-group' ] } >
312- < label
313- className = { styles [ 'form-input-label' ] }
314- htmlFor = "authorizer-sign-up-email-or-phone-number"
315- >
316- < span > * </ span >
317- { getEmailPhoneLabels ( config ) }
318- </ label >
319- < input
320- name = "email_or_phone_number"
321- id = "authorizer-sign-up-email-or-phone-number"
322- className = { `${ styles [ 'form-input-field' ] } ${
323- errorData . email_or_phone_number
324- ? styles [ 'input-error-content' ]
325- : null
326- } `}
327- placeholder = { getEmailPhonePlaceholder ( config ) }
328- type = "text"
329- value = { formData . email_or_phone_number || '' }
330- onChange = { e =>
331- onInputChange ( 'email_or_phone_number' , e . target . value )
332- }
333- />
334- { errorData . email_or_phone_number && (
335- < div className = { styles [ 'form-input-error' ] } >
336- { errorData . email_or_phone_number }
337- </ div >
338- ) }
339- </ div >
340- < div className = { styles [ 'styled-form-group' ] } >
341- < label
342- className = { styles [ 'form-input-label' ] }
343- htmlFor = "authorizer-sign-up-password"
344- >
345- < span > * </ span > Password
346- </ label >
347- < input
348- name = "password"
349- id = "authorizer-sign-up-password"
350- className = { `${ styles [ 'form-input-field' ] } ${
351- errorData . password ? styles [ 'input-error-content' ] : null
352- } `}
353- placeholder = "********"
354- type = "password"
355- value = { formData . password || '' }
356- onChange = { e => onInputChange ( 'password' , e . target . value ) }
357- />
358- { errorData . password && (
359- < div className = { styles [ 'form-input-error' ] } >
360- { errorData . password }
361- </ div >
362- ) }
363- </ div >
364- < div className = { styles [ 'styled-form-group' ] } >
365- < label
366- className = { styles [ 'form-input-label' ] }
367- htmlFor = "authorizer-sign-up-confirm-password"
368- >
369- < span > * </ span > Confirm Password
370- </ label >
371- < input
372- name = "confirmPassword"
373- id = "authorizer-sign-up-confirm-password"
374- className = { `${ styles [ 'form-input-field' ] } ${
375- errorData . confirmPassword
376- ? styles [ 'input-error-content' ]
377- : null
378- } `}
379- placeholder = "********"
380- type = "password"
381- value = { formData . confirmPassword || '' }
382- onChange = { e =>
383- onInputChange ( 'confirmPassword' , e . target . value )
384- }
385- />
386- { errorData . confirmPassword && (
387- < div className = { styles [ 'form-input-error' ] } >
388- { errorData . confirmPassword }
389- </ div >
390- ) }
391- </ div >
336+ { renderField ( 'given_name' , 'First Name' , 'eg. John' , 'text' ) }
337+ { renderField ( 'family_name' , 'Last Name' , 'eg. Doe' , 'text' ) }
338+ { renderField (
339+ 'email_or_phone_number' ,
340+ getEmailPhoneLabels ( config ) ,
341+ getEmailPhonePlaceholder ( config )
342+ ) }
343+ { renderField ( 'password' , 'Password' , '********' , 'password' ) }
344+ { renderField (
345+ 'confirmPassword' ,
346+ 'Confirm Password' ,
347+ '********' ,
348+ 'password'
349+ ) }
392350 { config . is_strong_password_enabled && (
393351 < >
394352 < PasswordStrengthIndicator
@@ -404,13 +362,11 @@ export const AuthorizerSignup: FC<{
404362 disabled = {
405363 loading ||
406364 disableSignupButton ||
407- ! ! errorData . given_name ||
408- ! ! errorData . family_name ||
365+ shouldFieldBlockSubmit ( ' given_name' ) ||
366+ shouldFieldBlockSubmit ( ' family_name' ) ||
409367 ! ! errorData . email_or_phone_number ||
410368 ! ! errorData . password ||
411369 ! ! errorData . confirmPassword ||
412- ! formData . given_name ||
413- ! formData . family_name ||
414370 ! formData . email_or_phone_number ||
415371 ! formData . password ||
416372 ! formData . confirmPassword
0 commit comments