@@ -37,33 +37,64 @@ function MFAThemeWrapper(props: WebAuthnMFAProps): JSX.Element {
3737export default MFAThemeWrapper ;
3838
3939export function MFATheme ( props : WebAuthnMFAProps ) : JSX . Element {
40- const { onBackButtonClicked, onSignIn } = props ;
41- const [ activeScreen , setActiveScreen ] = React . useState < MFAScreens > ( MFAScreens . SignIn ) ;
42- const [ signUpEmail , setSignUpEmail ] = React . useState < string > ( "" ) ;
4340 const t = useTranslation ( ) ;
4441
45- const onRegisterPasskeyClick = React . useCallback ( ( ) => {
46- if ( ! props . featureState . canRegisterPasskey ) {
47- return ;
48- }
49- if ( props . featureState . email ) {
50- setActiveScreen ( MFAScreens . SignUpConfirmation ) ;
51- } else {
52- setActiveScreen ( MFAScreens . SignUp ) ;
42+ if ( ! props . featureState . loaded ) {
43+ return < WebauthnMFALoadingScreen /> ;
44+ }
45+
46+ if ( props . featureState . accessDenied ) {
47+ return (
48+ < AccessDeniedScreen
49+ useShadowDom = { false /* We set this to false, because we are already inside a shadowDom (if required) */ }
50+ error = { t ( props . featureState . error ! ) }
51+ />
52+ ) ;
53+ }
54+
55+ return (
56+ < div data-supertokens = "container webauthn-mfa" >
57+ < div data-supertokens = "row" >
58+ < MFAThemeRouter { ...props } />
59+ </ div >
60+ < SuperTokensBranding />
61+ </ div >
62+ ) ;
63+ }
64+
65+ function MFAThemeRouter ( props : WebAuthnMFAProps ) : JSX . Element {
66+ const { onBackButtonClicked, onSignIn } = props ;
67+ const [ activeScreen , setActiveScreen ] = React . useState < MFAScreens > ( ( ) => {
68+ if ( ! props . featureState . hasRegisteredPassKey ) {
69+ return props . featureState . email ? MFAScreens . SignUpConfirmation : MFAScreens . SignUp ;
5370 }
54- } , [ props . featureState . email , props . featureState . canRegisterPasskey ] ) ;
71+ return MFAScreens . SignIn ;
72+ } ) ;
73+ const [ email , setEmail ] = React . useState < string > ( "" ) ;
74+ const signUpEmail = props . featureState . email || email ;
5575
5676 const onSignUpContinue = React . useCallback (
5777 ( email : string ) => {
5878 if ( ! props . featureState . canRegisterPasskey ) {
5979 return ;
6080 }
6181 setActiveScreen ( MFAScreens . SignUpConfirmation ) ;
62- setSignUpEmail ( email ) ;
82+ setEmail ( email ) ;
6383 } ,
6484 [ props . featureState . canRegisterPasskey ]
6585 ) ;
6686
87+ const onRegisterPasskeyClick = React . useCallback ( ( ) => {
88+ if ( ! props . featureState . canRegisterPasskey ) {
89+ return ;
90+ }
91+ if ( props . featureState . email ) {
92+ setActiveScreen ( MFAScreens . SignUpConfirmation ) ;
93+ } else {
94+ setActiveScreen ( MFAScreens . SignUp ) ;
95+ }
96+ } , [ props . featureState . email , props . featureState . canRegisterPasskey ] ) ;
97+
6798 const clearError = React . useCallback ( ( ) => {
6899 props . dispatch ( { type : "setError" , error : undefined } ) ;
69100 } , [ props ] ) ;
@@ -75,71 +106,79 @@ export function MFATheme(props: WebAuthnMFAProps): JSX.Element {
75106 [ props ]
76107 ) ;
77108
78- const onClickSignUpBackButton = React . useCallback ( ( ) => {
79- if ( ! props . featureState . canRegisterPasskey ) {
109+ const onClickSignUpConfirmationBackButton = React . useCallback ( ( ) => {
110+ if ( ! props . featureState . email ) {
111+ setActiveScreen ( MFAScreens . SignUp ) ;
112+ return ;
113+ }
114+ if ( ! props . featureState . hasRegisteredPassKey && ! props . featureState . showBackButton ) {
115+ return ;
116+ }
117+ if ( ! props . featureState . hasRegisteredPassKey ) {
118+ onBackButtonClicked ( ) ;
80119 return ;
81120 }
82121 setActiveScreen ( MFAScreens . SignIn ) ;
83- } , [ props . featureState . canRegisterPasskey ] ) ;
122+ } , [
123+ props . featureState . email ,
124+ props . featureState . hasRegisteredPassKey ,
125+ props . featureState . showBackButton ,
126+ onBackButtonClicked ,
127+ ] ) ;
84128
85- const onClickSignUpConfirmationBackButton = React . useCallback ( ( ) => {
86- if ( props . featureState . email ) {
87- setActiveScreen ( MFAScreens . SignIn ) ;
88- } else {
89- setActiveScreen ( MFAScreens . SignUp ) ;
90- }
91- } , [ props . featureState . email ] ) ;
129+ const onSignUp = React . useCallback ( async ( ) => {
130+ await props . onSignUp ( signUpEmail ) ;
131+ } , [ props . onSignUp , signUpEmail ] ) ;
92132
93133 const onFetchError = React . useCallback ( ( ) => {
94134 onError ( "SOMETHING_WENT_WRONG_ERROR" ) ;
95135 } , [ onError ] ) ;
96136
97- if ( ! props . featureState . loaded ) {
98- return < WebauthnMFALoadingScreen /> ;
137+ const onClickSignUpBackButton = React . useCallback ( ( ) => {
138+ if ( ! props . featureState . hasRegisteredPassKey && ! props . featureState . showBackButton ) {
139+ return ;
140+ }
141+ if ( ! props . featureState . hasRegisteredPassKey ) {
142+ onBackButtonClicked ( ) ;
143+ return ;
144+ }
145+ setActiveScreen ( MFAScreens . SignIn ) ;
146+ } , [ props . featureState . hasRegisteredPassKey , props . featureState . showBackButton , onBackButtonClicked ] ) ;
147+
148+ if ( activeScreen === MFAScreens . SignUp ) {
149+ return (
150+ < WebauthnMFASignUp
151+ clearError = { clearError }
152+ onError = { onError }
153+ onFetchError = { onFetchError }
154+ error = { props . featureState . error }
155+ onContinueClick = { onSignUpContinue }
156+ email = { email }
157+ onRecoverAccountClick = { props . onRecoverAccountClick }
158+ onBackButtonClicked = { onClickSignUpBackButton }
159+ />
160+ ) ;
99161 }
100162
101- if ( props . featureState . accessDenied ) {
163+ if ( activeScreen === MFAScreens . SignUpConfirmation ) {
102164 return (
103- < AccessDeniedScreen
104- useShadowDom = { false /* We set this to false, because we are already inside a shadowDom (if required) */ }
105- error = { t ( props . featureState . error ! ) }
165+ < WebauthnMFASignUpConfirmation
166+ onSignUp = { onSignUp }
167+ onBackButtonClicked = { onClickSignUpConfirmationBackButton }
168+ email = { signUpEmail }
169+ error = { props . featureState . error }
106170 />
107171 ) ;
108172 }
109173
110174 return (
111- < div data-supertokens = "container webauthn-mfa" >
112- < div data-supertokens = "row" >
113- { activeScreen === MFAScreens . SignIn ? (
114- < WebauthnMFASignIn
115- onBackButtonClicked = { props . featureState . showBackButton ? onBackButtonClicked : undefined }
116- canRegisterPasskey = { props . featureState . canRegisterPasskey }
117- onSignIn = { onSignIn }
118- error = { props . featureState . error }
119- onRegisterPasskeyClick = { onRegisterPasskeyClick }
120- deviceSupported = { props . featureState . deviceSupported }
121- />
122- ) : activeScreen === MFAScreens . SignUp ? (
123- < WebauthnMFASignUp
124- clearError = { clearError }
125- onError = { onError }
126- onFetchError = { onFetchError }
127- error = { props . featureState . error }
128- onContinueClick = { onSignUpContinue }
129- email = { signUpEmail }
130- onRecoverAccountClick = { props . onRecoverAccountClick }
131- onBackButtonClicked = { onClickSignUpBackButton }
132- />
133- ) : (
134- < WebauthnMFASignUpConfirmation
135- onSignUp = { props . onSignUp }
136- onBackButtonClicked = { onClickSignUpConfirmationBackButton }
137- email = { props . featureState . email || signUpEmail }
138- error = { props . featureState . error }
139- />
140- ) }
141- </ div >
142- < SuperTokensBranding />
143- </ div >
175+ < WebauthnMFASignIn
176+ onBackButtonClicked = { props . featureState . showBackButton ? onBackButtonClicked : undefined }
177+ canRegisterPasskey = { props . featureState . canRegisterPasskey }
178+ onSignIn = { onSignIn }
179+ error = { props . featureState . error }
180+ deviceSupported = { props . featureState . deviceSupported }
181+ onRegisterPasskeyClick = { onRegisterPasskeyClick }
182+ />
144183 ) ;
145184}
0 commit comments