Skip to content

Commit bdb21fe

Browse files
authored
Merge pull request #47 from authorizerdev/fix-user-verification
fix: user verification
2 parents bd6ee6c + bd2a18a commit bdb21fe

9 files changed

Lines changed: 5618 additions & 3074 deletions

package-lock.json

Lines changed: 5412 additions & 3029 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
"typescript": "^5.2.2"
6767
},
6868
"dependencies": {
69-
"@authorizerdev/authorizer-js": "^2.0.0-beta.3",
69+
"@authorizerdev/authorizer-js": "^2.0.1",
7070
"validator": "^13.11.0"
7171
}
7272
}

src/components/AuthorizerBasicAuthLogin.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Message } from './Message';
1111
import { AuthorizerVerifyOtp } from './AuthorizerVerifyOtp';
1212
import { OtpDataType, TotpDataType } from '../types';
1313
import { AuthorizerTOTPScanner } from './AuthorizerTOTPScanner';
14+
import { getEmailPhoneLabels, getEmailPhonePlaceholder } from '../utils/labels';
1415

1516
const initOtpData: OtpDataType = {
1617
is_screen_visible: false,
@@ -232,7 +233,8 @@ export const AuthorizerBasicAuthLogin: FC<{
232233
className={styles['form-input-label']}
233234
htmlFor="authorizer-login-email"
234235
>
235-
<span>* </span>Email / Phone Number
236+
<span>* </span>
237+
{getEmailPhoneLabels(config)}
236238
</label>
237239
<input
238240
name="email_or_phone_number"
@@ -242,10 +244,10 @@ export const AuthorizerBasicAuthLogin: FC<{
242244
? styles['input-error-content']
243245
: null
244246
}`}
245-
placeholder="eg. hello@world.com / +919999999999"
247+
placeholder={getEmailPhonePlaceholder(config)}
246248
type="text"
247249
value={formData.email_or_phone_number || ''}
248-
onChange={(e) =>
250+
onChange={e =>
249251
onInputChange('email_or_phone_number', e.target.value)
250252
}
251253
/>
@@ -271,7 +273,7 @@ export const AuthorizerBasicAuthLogin: FC<{
271273
placeholder="********"
272274
type="password"
273275
value={formData.password || ''}
274-
onChange={(e) => onInputChange('password', e.target.value)}
276+
onChange={e => onInputChange('password', e.target.value)}
275277
/>
276278
{errorData.password && (
277279
<div className={styles['form-input-error']}>

src/components/AuthorizerForgotPassword.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { formatErrorMessage } from '../utils/format';
1010
import { Message } from './Message';
1111
import { OtpDataType } from '../types';
1212
import { AuthorizerResetPassword } from './AuthorizerResetPassword';
13+
import { getEmailPhoneLabels, getEmailPhonePlaceholder } from '../utils/labels';
1314

1415
interface InputDataType {
1516
email_or_phone_number: string | null;
@@ -145,8 +146,8 @@ export const AuthorizerForgotPassword: FC<{
145146
<Message type={MessageType.Error} text={error} onClose={onErrorClose} />
146147
)}
147148
<p style={{ textAlign: 'center', margin: '10px 0px' }}>
148-
Please enter your email address.
149-
<br /> We will send you an email to reset your password.
149+
Please enter your {getEmailPhoneLabels(config)}.
150+
<br /> We will send you an email / otp to reset your password.
150151
</p>
151152
<br />
152153
<form onSubmit={onSubmit} name="authorizer-forgot-password-form">
@@ -155,7 +156,8 @@ export const AuthorizerForgotPassword: FC<{
155156
className={styles['form-input-label']}
156157
htmlFor="authorizer-forgot-password-email-or-phone-number"
157158
>
158-
<span>* </span>Email / Phone Number
159+
<span>* </span>
160+
{getEmailPhoneLabels(config)}
159161
</label>
160162
<input
161163
name="email_or_phone_number"
@@ -165,10 +167,10 @@ export const AuthorizerForgotPassword: FC<{
165167
? styles['input-error-content']
166168
: null
167169
}`}
168-
placeholder="eg. hello@world.com / +919999999999"
170+
placeholder={getEmailPhonePlaceholder(config)}
169171
type="text"
170172
value={formData.email_or_phone_number || ''}
171-
onChange={(e) =>
173+
onChange={e =>
172174
onInputChange('email_or_phone_number', e.target.value)
173175
}
174176
/>

src/components/AuthorizerRoot.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ export const AuthorizerRoot: FC<{
3434
);
3535
const state = searchParams.get('state') || createRandomString();
3636
const scope = searchParams.get('scope')
37-
? searchParams.get('scope')?.toString().split(' ')
37+
? searchParams
38+
.get('scope')
39+
?.toString()
40+
.split(' ')
3841
: ['openid', 'profile', 'email'];
3942

4043
const urlProps: Record<string, any> = {
@@ -51,7 +54,6 @@ export const AuthorizerRoot: FC<{
5154
}
5255

5356
urlProps.redirect_uri = urlProps.redirectURL;
54-
5557
return (
5658
<StyledWrapper>
5759
<AuthorizerSocialLogin urlProps={urlProps} roles={roles} />

src/components/AuthorizerSignup.tsx

Lines changed: 128 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,24 @@ import { StyledButton, StyledFooter, StyledLink } from '../styledComponents';
1010
import { formatErrorMessage } from '../utils/format';
1111
import { Message } from './Message';
1212
import PasswordStrengthIndicator from './PasswordStrengthIndicator';
13+
import { OtpDataType } from '../types';
14+
import { AuthorizerVerifyOtp } from './AuthorizerVerifyOtp';
15+
import { getEmailPhoneLabels, getEmailPhonePlaceholder } from '../utils/labels';
1316

1417
interface InputDataType {
18+
given_name: string | null;
19+
family_name: string | null;
1520
email_or_phone_number: string | null;
1621
password: string | null;
1722
confirmPassword: string | null;
1823
}
1924

25+
const initOtpData: OtpDataType = {
26+
is_screen_visible: false,
27+
email: '',
28+
phone_number: '',
29+
};
30+
2031
export const AuthorizerSignup: FC<{
2132
setView?: (v: Views) => void;
2233
onSignup?: (data: AuthToken) => void;
@@ -25,13 +36,18 @@ export const AuthorizerSignup: FC<{
2536
}> = ({ setView, onSignup, urlProps, roles }) => {
2637
const [error, setError] = useState(``);
2738
const [loading, setLoading] = useState(false);
39+
const [otpData, setOtpData] = useState<OtpDataType>({ ...initOtpData });
2840
const [successMessage, setSuccessMessage] = useState(``);
2941
const [formData, setFormData] = useState<InputDataType>({
42+
given_name: null,
43+
family_name: null,
3044
email_or_phone_number: null,
3145
password: null,
3246
confirmPassword: null,
3347
});
3448
const [errorData, setErrorData] = useState<InputDataType>({
49+
given_name: null,
50+
family_name: null,
3551
email_or_phone_number: null,
3652
password: null,
3753
confirmPassword: null,
@@ -67,6 +83,8 @@ export const AuthorizerSignup: FC<{
6783
const data: SignupInput = {
6884
email: email,
6985
phone_number: phone_number,
86+
given_name: formData.given_name || '',
87+
family_name: formData.family_name || '',
7088
password: formData.password || '',
7189
confirm_password: formData.confirmPassword || '',
7290
};
@@ -91,7 +109,18 @@ export const AuthorizerSignup: FC<{
91109
setLoading(false);
92110
return;
93111
}
94-
112+
if (
113+
res &&
114+
(res?.should_show_email_otp_screen ||
115+
res?.should_show_mobile_otp_screen)
116+
) {
117+
setOtpData({
118+
is_screen_visible: true,
119+
email: data.email || ``,
120+
phone_number: data.phone_number || ``,
121+
});
122+
return;
123+
}
95124
if (res) {
96125
setError(``);
97126
if (res.access_token) {
@@ -126,6 +155,22 @@ export const AuthorizerSignup: FC<{
126155
setError(``);
127156
};
128157

158+
useEffect(() => {
159+
if ((formData.given_name || '').trim() === '') {
160+
setErrorData({ ...errorData, given_name: 'First Name is required' });
161+
} else {
162+
setErrorData({ ...errorData, given_name: null });
163+
}
164+
}, [formData.given_name]);
165+
166+
useEffect(() => {
167+
if ((formData.family_name || '').trim() === '') {
168+
setErrorData({ ...errorData, family_name: 'Last Name is required' });
169+
} else {
170+
setErrorData({ ...errorData, family_name: null });
171+
}
172+
}, [formData.family_name]);
173+
129174
useEffect(() => {
130175
if (formData.email_or_phone_number === '') {
131176
setErrorData({
@@ -182,15 +227,34 @@ export const AuthorizerSignup: FC<{
182227
}
183228
}, [formData.password, formData.confirmPassword]);
184229

185-
if (successMessage) {
186-
return <Message type={MessageType.Success} text={successMessage} />;
230+
if (otpData.is_screen_visible) {
231+
return (
232+
<>
233+
{successMessage && (
234+
<Message type={MessageType.Success} text={successMessage} />
235+
)}
236+
<AuthorizerVerifyOtp
237+
{...{
238+
setView,
239+
onLogin: onSignup,
240+
email: otpData.email || ``,
241+
phone_number: otpData.phone_number || ``,
242+
is_totp: otpData.is_totp || false,
243+
}}
244+
urlProps={urlProps}
245+
/>
246+
</>
247+
);
187248
}
188249

189250
return (
190251
<>
191252
{error && (
192253
<Message type={MessageType.Error} text={error} onClose={onErrorClose} />
193254
)}
255+
{successMessage && (
256+
<Message type={MessageType.Success} text={successMessage} />
257+
)}
194258
{(config.is_basic_authentication_enabled ||
195259
config.is_mobile_basic_authentication_enabled) &&
196260
!config.is_magic_link_login_enabled && (
@@ -199,22 +263,71 @@ export const AuthorizerSignup: FC<{
199263
<div className={styles['styled-form-group']}>
200264
<label
201265
className={styles['form-input-label']}
202-
htmlFor="authorizer-sign-up-email"
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"
203315
>
204-
<span>* </span>Email / Phone Number
316+
<span>* </span>
317+
{getEmailPhoneLabels(config)}
205318
</label>
206319
<input
207-
name="eemail_or_phone_numbermail"
208-
id="authorizer-login-email-or-phone-number"
320+
name="email_or_phone_number"
321+
id="authorizer-sign-up-email-or-phone-number"
209322
className={`${styles['form-input-field']} ${
210323
errorData.email_or_phone_number
211324
? styles['input-error-content']
212325
: null
213326
}`}
214-
placeholder="eg. hello@world.com / +919999999999"
327+
placeholder={getEmailPhonePlaceholder(config)}
215328
type="text"
216329
value={formData.email_or_phone_number || ''}
217-
onChange={(e) =>
330+
onChange={e =>
218331
onInputChange('email_or_phone_number', e.target.value)
219332
}
220333
/>
@@ -240,7 +353,7 @@ export const AuthorizerSignup: FC<{
240353
placeholder="********"
241354
type="password"
242355
value={formData.password || ''}
243-
onChange={(e) => onInputChange('password', e.target.value)}
356+
onChange={e => onInputChange('password', e.target.value)}
244357
/>
245358
{errorData.password && (
246359
<div className={styles['form-input-error']}>
@@ -266,7 +379,7 @@ export const AuthorizerSignup: FC<{
266379
placeholder="********"
267380
type="password"
268381
value={formData.confirmPassword || ''}
269-
onChange={(e) =>
382+
onChange={e =>
270383
onInputChange('confirmPassword', e.target.value)
271384
}
272385
/>
@@ -291,9 +404,13 @@ export const AuthorizerSignup: FC<{
291404
disabled={
292405
loading ||
293406
disableSignupButton ||
407+
!!errorData.given_name ||
408+
!!errorData.family_name ||
294409
!!errorData.email_or_phone_number ||
295410
!!errorData.password ||
296411
!!errorData.confirmPassword ||
412+
!formData.given_name ||
413+
!formData.family_name ||
297414
!formData.email_or_phone_number ||
298415
!formData.password ||
299416
!formData.confirmPassword

src/components/AuthorizerVerifyOtp.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export const AuthorizerVerifyOtp: FC<{
4747
setLoading(true);
4848
const data: VerifyOtpInput = {
4949
email,
50+
phone_number,
5051
otp: formData.otp || '',
5152
};
5253
if (urlProps?.state) {
@@ -98,6 +99,7 @@ export const AuthorizerVerifyOtp: FC<{
9899

99100
const { data: res, errors } = await authorizerRef.resendOtp({
100101
email,
102+
phone_number,
101103
});
102104
setSendingOtp(false);
103105
if (errors && errors.length) {
@@ -160,7 +162,7 @@ export const AuthorizerVerifyOtp: FC<{
160162
placeholder="e.g.- AB123C"
161163
type="password"
162164
value={formData.otp || ''}
163-
onChange={(e) => onInputChange('otp', e.target.value)}
165+
onChange={e => onInputChange('otp', e.target.value)}
164166
/>
165167
{errorData.otp && (
166168
<div className={styles['form-input-error']}>{errorData.otp}</div>

0 commit comments

Comments
 (0)