@@ -37,33 +37,67 @@ function MFAThemeWrapper(props: WebAuthnMFAProps): JSX.Element {
37
37
export default MFAThemeWrapper ;
38
38
39
39
export 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 > ( "" ) ;
43
40
const t = useTranslation ( ) ;
44
41
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 ;
53
70
}
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 ;
75
+ console . log ( "render" ) ;
76
+ console . log ( signUpEmail ) ;
77
+ console . log ( email ) ;
55
78
56
79
const onSignUpContinue = React . useCallback (
57
80
( email : string ) => {
58
81
if ( ! props . featureState . canRegisterPasskey ) {
59
82
return ;
60
83
}
61
84
setActiveScreen ( MFAScreens . SignUpConfirmation ) ;
62
- setSignUpEmail ( email ) ;
85
+ setEmail ( email ) ;
63
86
} ,
64
87
[ props . featureState . canRegisterPasskey ]
65
88
) ;
66
89
90
+ const onRegisterPasskeyClick = React . useCallback ( ( ) => {
91
+ if ( ! props . featureState . canRegisterPasskey ) {
92
+ return ;
93
+ }
94
+ if ( props . featureState . email ) {
95
+ setActiveScreen ( MFAScreens . SignUpConfirmation ) ;
96
+ } else {
97
+ setActiveScreen ( MFAScreens . SignUp ) ;
98
+ }
99
+ } , [ props . featureState . email , props . featureState . canRegisterPasskey ] ) ;
100
+
67
101
const clearError = React . useCallback ( ( ) => {
68
102
props . dispatch ( { type : "setError" , error : undefined } ) ;
69
103
} , [ props ] ) ;
@@ -75,71 +109,82 @@ export function MFATheme(props: WebAuthnMFAProps): JSX.Element {
75
109
[ props ]
76
110
) ;
77
111
78
- const onClickSignUpBackButton = React . useCallback ( ( ) => {
79
- if ( ! props . featureState . canRegisterPasskey ) {
80
- return ;
81
- }
82
- setActiveScreen ( MFAScreens . SignIn ) ;
83
- } , [ props . featureState . canRegisterPasskey ] ) ;
84
-
85
112
const onClickSignUpConfirmationBackButton = React . useCallback ( ( ) => {
86
- if ( props . featureState . email ) {
87
- setActiveScreen ( MFAScreens . SignIn ) ;
88
- } else {
113
+ if ( ! props . featureState . email ) {
89
114
setActiveScreen ( MFAScreens . SignUp ) ;
115
+ return ;
116
+ }
117
+ if ( ! props . featureState . hasRegisteredPassKey && ! props . featureState . showBackButton ) {
118
+ return ;
90
119
}
91
- } , [ props . featureState . email ] ) ;
120
+ if ( ! props . featureState . hasRegisteredPassKey ) {
121
+ onBackButtonClicked ( ) ;
122
+ return ;
123
+ }
124
+ setActiveScreen ( MFAScreens . SignIn ) ;
125
+ } , [
126
+ props . featureState . email ,
127
+ props . featureState . hasRegisteredPassKey ,
128
+ props . featureState . showBackButton ,
129
+ onBackButtonClicked ,
130
+ ] ) ;
131
+
132
+ const onSignUp = React . useCallback ( async ( ) => {
133
+ console . log ( "onSignUp" ) ;
134
+ console . log ( props . featureState . email ) ;
135
+ console . log ( email ) ;
136
+ await props . onSignUp ( signUpEmail ) ;
137
+ } , [ props . onSignUp , signUpEmail ] ) ;
92
138
93
139
const onFetchError = React . useCallback ( ( ) => {
94
140
onError ( "SOMETHING_WENT_WRONG_ERROR" ) ;
95
141
} , [ onError ] ) ;
96
142
97
- if ( ! props . featureState . loaded ) {
98
- return < WebauthnMFALoadingScreen /> ;
143
+ const onClickSignUpBackButton = React . useCallback ( ( ) => {
144
+ if ( ! props . featureState . hasRegisteredPassKey && ! props . featureState . showBackButton ) {
145
+ return ;
146
+ }
147
+ if ( ! props . featureState . hasRegisteredPassKey ) {
148
+ onBackButtonClicked ( ) ;
149
+ return ;
150
+ }
151
+ setActiveScreen ( MFAScreens . SignIn ) ;
152
+ } , [ props . featureState . hasRegisteredPassKey , props . featureState . showBackButton , onBackButtonClicked ] ) ;
153
+
154
+ if ( activeScreen === MFAScreens . SignUp ) {
155
+ return (
156
+ < WebauthnMFASignUp
157
+ clearError = { clearError }
158
+ onError = { onError }
159
+ onFetchError = { onFetchError }
160
+ error = { props . featureState . error }
161
+ onContinueClick = { onSignUpContinue }
162
+ email = { email }
163
+ onRecoverAccountClick = { props . onRecoverAccountClick }
164
+ onBackButtonClicked = { onClickSignUpBackButton }
165
+ />
166
+ ) ;
99
167
}
100
168
101
- if ( props . featureState . accessDenied ) {
169
+ if ( activeScreen === MFAScreens . SignUpConfirmation ) {
102
170
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 ! ) }
171
+ < WebauthnMFASignUpConfirmation
172
+ onSignUp = { onSignUp }
173
+ onBackButtonClicked = { onClickSignUpConfirmationBackButton }
174
+ email = { signUpEmail }
175
+ error = { props . featureState . error }
106
176
/>
107
177
) ;
108
178
}
109
179
110
180
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 >
181
+ < WebauthnMFASignIn
182
+ onBackButtonClicked = { props . featureState . showBackButton ? onBackButtonClicked : undefined }
183
+ canRegisterPasskey = { props . featureState . canRegisterPasskey }
184
+ onSignIn = { onSignIn }
185
+ error = { props . featureState . error }
186
+ deviceSupported = { props . featureState . deviceSupported }
187
+ onRegisterPasskeyClick = { onRegisterPasskeyClick }
188
+ />
144
189
) ;
145
190
}
0 commit comments