Skip to content

Commit f8b099f

Browse files
authored
Merge pull request #55 from authorizerdev/feat/totp_screen_inside_verify_otp_page
feat: TOTP screen inside verify-otp page
2 parents 40900ee + cee0a47 commit f8b099f

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

‎src/components/AuthorizerVerifyOtp.tsx‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,22 @@ import { ButtonAppearance, MessageType, Views } from '../constants';
66
import { useAuthorizer } from '../contexts/AuthorizerContext';
77
import { StyledButton, StyledFooter, StyledLink } from '../styledComponents';
88
import { Message } from './Message';
9+
import { TotpDataType } from '../types';
10+
import { AuthorizerTOTPScanner } from './AuthorizerTOTPScanner';
911

1012
interface InputDataType {
1113
otp: string | null;
1214
}
1315

16+
const initTotpData: TotpDataType = {
17+
is_screen_visible: false,
18+
email: '',
19+
phone_number: '',
20+
authenticator_scanner_image: '',
21+
authenticator_secret: '',
22+
authenticator_recovery_codes: [],
23+
};
24+
1425
export const AuthorizerVerifyOtp: FC<{
1526
setView?: (v: Views) => void;
1627
onLogin?: (data: any) => void;
@@ -22,6 +33,7 @@ export const AuthorizerVerifyOtp: FC<{
2233
const [error, setError] = useState(``);
2334
const [successMessage, setSuccessMessage] = useState(``);
2435
const [loading, setLoading] = useState(false);
36+
const [totpData, setTotpData] = useState<TotpDataType>({ ...initTotpData });
2537
const [sendingOtp, setSendingOtp] = useState(false);
2638
const [formData, setFormData] = useState<InputDataType>({
2739
otp: null,
@@ -59,6 +71,26 @@ export const AuthorizerVerifyOtp: FC<{
5971
setError(errors[0]?.message || ``);
6072
return;
6173
}
74+
75+
// If TOTP validated using recovery code then show totp screen with scanner
76+
if (
77+
res &&
78+
res.should_show_totp_screen &&
79+
res.authenticator_scanner_image &&
80+
res.authenticator_secret &&
81+
res.authenticator_recovery_codes
82+
) {
83+
setTotpData({
84+
is_screen_visible: true,
85+
email: data.email || ``,
86+
phone_number: data.phone_number || ``,
87+
authenticator_scanner_image: res.authenticator_scanner_image,
88+
authenticator_secret: res.authenticator_secret,
89+
authenticator_recovery_codes: res.authenticator_recovery_codes,
90+
});
91+
return;
92+
}
93+
6294
if (res) {
6395
setError(``);
6496
setAuthData({
@@ -124,6 +156,24 @@ export const AuthorizerVerifyOtp: FC<{
124156
}
125157
}, [formData.otp]);
126158

159+
if (totpData.is_screen_visible) {
160+
return (
161+
<AuthorizerTOTPScanner
162+
{...{
163+
setView,
164+
onLogin,
165+
email: totpData.email || ``,
166+
phone_number: totpData.phone_number || ``,
167+
authenticator_scanner_image: totpData.authenticator_scanner_image,
168+
authenticator_secret: totpData.authenticator_secret,
169+
authenticator_recovery_codes:
170+
totpData.authenticator_recovery_codes || [],
171+
}}
172+
urlProps={urlProps}
173+
/>
174+
);
175+
}
176+
127177
return (
128178
<>
129179
{successMessage && (

0 commit comments

Comments
 (0)