@@ -6,11 +6,22 @@ import { ButtonAppearance, MessageType, Views } from '../constants';
66import { useAuthorizer } from '../contexts/AuthorizerContext' ;
77import { StyledButton , StyledFooter , StyledLink } from '../styledComponents' ;
88import { Message } from './Message' ;
9+ import { TotpDataType } from '../types' ;
10+ import { AuthorizerTOTPScanner } from './AuthorizerTOTPScanner' ;
911
1012interface 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+
1425export 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