diff --git a/lib/build/components/componentOverride/genericComponentOverrideContext.d.ts b/lib/build/components/componentOverride/genericComponentOverrideContext.d.ts index f04caefe4..ac44c3730 100644 --- a/lib/build/components/componentOverride/genericComponentOverrideContext.d.ts +++ b/lib/build/components/componentOverride/genericComponentOverrideContext.d.ts @@ -521,7 +521,9 @@ export declare const createGenericComponentsOverrideContext: + React.ComponentType< + import("../../recipe/webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -529,13 +531,22 @@ export declare const createGenericComponentsOverrideContext: + React.ComponentType< + import("../../recipe/webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("./componentOverride").ComponentOverride< React.ComponentType< - import("../../recipe/webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../../recipe/webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("./componentOverride").ComponentOverride< + React.ComponentType< + import("../../recipe/webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/authRecipe/componentOverrideContext.d.ts b/lib/build/recipe/authRecipe/componentOverrideContext.d.ts index 32e5605a2..888f4f34d 100644 --- a/lib/build/recipe/authRecipe/componentOverrideContext.d.ts +++ b/lib/build/recipe/authRecipe/componentOverrideContext.d.ts @@ -518,7 +518,9 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -528,13 +530,22 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("../webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/emailpassword/componentOverrideContext.d.ts b/lib/build/recipe/emailpassword/componentOverrideContext.d.ts index a199ce39f..2670becfb 100644 --- a/lib/build/recipe/emailpassword/componentOverrideContext.d.ts +++ b/lib/build/recipe/emailpassword/componentOverrideContext.d.ts @@ -509,7 +509,9 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -519,13 +521,22 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("../webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/emailverification/componentOverrideContext.d.ts b/lib/build/recipe/emailverification/componentOverrideContext.d.ts index c182882e9..814cee0f3 100644 --- a/lib/build/recipe/emailverification/componentOverrideContext.d.ts +++ b/lib/build/recipe/emailverification/componentOverrideContext.d.ts @@ -518,7 +518,9 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -528,13 +530,22 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("../webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/multifactorauth/componentOverrideContext.d.ts b/lib/build/recipe/multifactorauth/componentOverrideContext.d.ts index 90456fb64..8f1cab4ad 100644 --- a/lib/build/recipe/multifactorauth/componentOverrideContext.d.ts +++ b/lib/build/recipe/multifactorauth/componentOverrideContext.d.ts @@ -518,7 +518,9 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -528,13 +530,22 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("../webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/multitenancy/componentOverrideContext.d.ts b/lib/build/recipe/multitenancy/componentOverrideContext.d.ts index 0dcc165a5..d5c8bc45a 100644 --- a/lib/build/recipe/multitenancy/componentOverrideContext.d.ts +++ b/lib/build/recipe/multitenancy/componentOverrideContext.d.ts @@ -518,7 +518,9 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -528,13 +530,22 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("../webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/oauth2provider/componentOverrideContext.d.ts b/lib/build/recipe/oauth2provider/componentOverrideContext.d.ts index f0288c51d..c2692a91f 100644 --- a/lib/build/recipe/oauth2provider/componentOverrideContext.d.ts +++ b/lib/build/recipe/oauth2provider/componentOverrideContext.d.ts @@ -518,7 +518,9 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -528,13 +530,22 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("../webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/passwordless/componentOverrideContext.d.ts b/lib/build/recipe/passwordless/componentOverrideContext.d.ts index 992838f05..750477d23 100644 --- a/lib/build/recipe/passwordless/componentOverrideContext.d.ts +++ b/lib/build/recipe/passwordless/componentOverrideContext.d.ts @@ -516,7 +516,9 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -526,13 +528,22 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("../webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/session/componentOverrideContext.d.ts b/lib/build/recipe/session/componentOverrideContext.d.ts index 438337cfa..c9b5804c7 100644 --- a/lib/build/recipe/session/componentOverrideContext.d.ts +++ b/lib/build/recipe/session/componentOverrideContext.d.ts @@ -518,7 +518,9 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -528,13 +530,22 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("../webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/thirdparty/componentOverrideContext.d.ts b/lib/build/recipe/thirdparty/componentOverrideContext.d.ts index ddf36eb0f..6582444d2 100644 --- a/lib/build/recipe/thirdparty/componentOverrideContext.d.ts +++ b/lib/build/recipe/thirdparty/componentOverrideContext.d.ts @@ -518,7 +518,9 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -528,13 +530,22 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("../webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/totp/componentOverrideContext.d.ts b/lib/build/recipe/totp/componentOverrideContext.d.ts index 7038ad4cb..d69d345c0 100644 --- a/lib/build/recipe/totp/componentOverrideContext.d.ts +++ b/lib/build/recipe/totp/componentOverrideContext.d.ts @@ -518,7 +518,9 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignIn").MFASignInProps + > > | undefined; WebauthnMFALoadingScreen_Override?: @@ -528,13 +530,22 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaSignUp").MFASignUpProps + > > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("../webauthn/components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("../webauthn/components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/webauthn/componentOverrideContext.d.ts b/lib/build/recipe/webauthn/componentOverrideContext.d.ts index 37a93aef5..fae1c54b2 100644 --- a/lib/build/recipe/webauthn/componentOverrideContext.d.ts +++ b/lib/build/recipe/webauthn/componentOverrideContext.d.ts @@ -84,7 +84,7 @@ declare const useContext: () => | undefined; WebauthnMFASignIn_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType > | undefined; WebauthnMFALoadingScreen_Override?: @@ -94,13 +94,20 @@ declare const useContext: () => | undefined; WebauthnMFASignUp_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< - import("react").ComponentType + import("react").ComponentType > | undefined; WebauthnMFASignUpConfirmation_Override?: | import("../../components/componentOverride/componentOverride").ComponentOverride< import("react").ComponentType< - import("./components/themes/mfa/signUpConfirmation").MFASignUpConfirmationProps + import("./components/themes/mfa/mfaSignUpConfirmation").MFASignUpConfirmationProps + > + > + | undefined; + WebauthnMFAFooter_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("./components/themes/mfa/mfaFooter").WebauthnMFAFooterProps > > | undefined; diff --git a/lib/build/recipe/webauthn/components/themes/mfa/index.d.ts b/lib/build/recipe/webauthn/components/themes/mfa/index.d.ts index a2fad99e2..32b295956 100644 --- a/lib/build/recipe/webauthn/components/themes/mfa/index.d.ts +++ b/lib/build/recipe/webauthn/components/themes/mfa/index.d.ts @@ -1,10 +1,17 @@ /// -import { WebauthnMFALoadingScreen } from "./loadingScreen"; -import { WebauthnMFASignIn } from "./signIn"; -import { WebauthnMFASignUp } from "./signUp"; -import { WebauthnMFASignUpConfirmation } from "./signUpConfirmation"; +import { WebauthnMFAFooter } from "./mfaFooter"; +import { WebauthnMFALoadingScreen } from "./mfaLoadingScreen"; +import { WebauthnMFASignIn } from "./mfaSignIn"; +import { WebauthnMFASignUp } from "./mfaSignUp"; +import { WebauthnMFASignUpConfirmation } from "./mfaSignUpConfirmation"; import type { WebAuthnMFAProps } from "../../../types"; -export { WebauthnMFALoadingScreen, WebauthnMFASignIn, WebauthnMFASignUp, WebauthnMFASignUpConfirmation }; +export { + WebauthnMFALoadingScreen, + WebauthnMFASignIn, + WebauthnMFASignUp, + WebauthnMFASignUpConfirmation, + WebauthnMFAFooter, +}; export declare enum MFAScreens { SignIn = 0, SignUp = 1, diff --git a/lib/build/recipe/webauthn/components/themes/mfa/mfaFooter.d.ts b/lib/build/recipe/webauthn/components/themes/mfa/mfaFooter.d.ts new file mode 100644 index 000000000..a8af27b5d --- /dev/null +++ b/lib/build/recipe/webauthn/components/themes/mfa/mfaFooter.d.ts @@ -0,0 +1,5 @@ +/// +export declare type WebauthnMFAFooterProps = { + onSignOutClicked: () => void; +}; +export declare const WebauthnMFAFooter: import("react").ComponentType; diff --git a/lib/build/recipe/webauthn/components/themes/mfa/loadingScreen.d.ts b/lib/build/recipe/webauthn/components/themes/mfa/mfaLoadingScreen.d.ts similarity index 100% rename from lib/build/recipe/webauthn/components/themes/mfa/loadingScreen.d.ts rename to lib/build/recipe/webauthn/components/themes/mfa/mfaLoadingScreen.d.ts diff --git a/lib/build/recipe/webauthn/components/themes/mfa/signIn.d.ts b/lib/build/recipe/webauthn/components/themes/mfa/mfaSignIn.d.ts similarity index 91% rename from lib/build/recipe/webauthn/components/themes/mfa/signIn.d.ts rename to lib/build/recipe/webauthn/components/themes/mfa/mfaSignIn.d.ts index 3c70c5e6e..848874abe 100644 --- a/lib/build/recipe/webauthn/components/themes/mfa/signIn.d.ts +++ b/lib/build/recipe/webauthn/components/themes/mfa/mfaSignIn.d.ts @@ -6,5 +6,6 @@ export declare type MFASignInProps = { deviceSupported: boolean; canRegisterPasskey: boolean; onRegisterPasskeyClick: () => void; + onSignOutClicked: () => void; }; export declare const WebauthnMFASignIn: React.ComponentType; diff --git a/lib/build/recipe/webauthn/components/themes/mfa/signUp.d.ts b/lib/build/recipe/webauthn/components/themes/mfa/mfaSignUp.d.ts similarity index 92% rename from lib/build/recipe/webauthn/components/themes/mfa/signUp.d.ts rename to lib/build/recipe/webauthn/components/themes/mfa/mfaSignUp.d.ts index fcba81d73..a9e2b72d2 100644 --- a/lib/build/recipe/webauthn/components/themes/mfa/signUp.d.ts +++ b/lib/build/recipe/webauthn/components/themes/mfa/mfaSignUp.d.ts @@ -8,5 +8,6 @@ export declare type MFASignUpProps = { onFetchError?: (error: Response) => void; onRecoverAccountClick: () => void; onBackButtonClicked?: () => void; + onSignOutClicked: () => void; }; export declare const WebauthnMFASignUp: React.ComponentType; diff --git a/lib/build/recipe/webauthn/components/themes/mfa/signUpConfirmation.d.ts b/lib/build/recipe/webauthn/components/themes/mfa/mfaSignUpConfirmation.d.ts similarity index 89% rename from lib/build/recipe/webauthn/components/themes/mfa/signUpConfirmation.d.ts rename to lib/build/recipe/webauthn/components/themes/mfa/mfaSignUpConfirmation.d.ts index 617b6b658..5fb022246 100644 --- a/lib/build/recipe/webauthn/components/themes/mfa/signUpConfirmation.d.ts +++ b/lib/build/recipe/webauthn/components/themes/mfa/mfaSignUpConfirmation.d.ts @@ -1,8 +1,9 @@ import * as React from "react"; export declare type MFASignUpConfirmationProps = { - onSignUp: () => Promise; - onBackButtonClicked?: () => void; email: string; error?: string; + onSignUp: () => Promise; + onBackButtonClicked?: () => void; + onSignOutClicked: () => void; }; export declare const WebauthnMFASignUpConfirmation: React.ComponentType; diff --git a/lib/build/recipe/webauthn/components/themes/translations.d.ts b/lib/build/recipe/webauthn/components/themes/translations.d.ts index 0e5020476..9e5c4bbc1 100644 --- a/lib/build/recipe/webauthn/components/themes/translations.d.ts +++ b/lib/build/recipe/webauthn/components/themes/translations.d.ts @@ -43,6 +43,7 @@ export declare const defaultTranslationsWebauthn: { WEBAUTHN_MFA_DIVIDER: string; WEBAUTHN_MFA_REGISTER_PASSKEY_SUBTITLE: string; WEBAUTHN_MFA_REGISTER_PASSKEY_TITLE: string; + WEBAUTHN_MFA_FOOTER_LOGOUT: string; AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; diff --git a/lib/build/recipe/webauthn/prebuiltui.d.ts b/lib/build/recipe/webauthn/prebuiltui.d.ts index c00088bae..645589786 100644 --- a/lib/build/recipe/webauthn/prebuiltui.d.ts +++ b/lib/build/recipe/webauthn/prebuiltui.d.ts @@ -51,6 +51,7 @@ export declare class WebauthnPreBuiltUI extends RecipeRouter { WEBAUTHN_MFA_DIVIDER: string; WEBAUTHN_MFA_REGISTER_PASSKEY_SUBTITLE: string; WEBAUTHN_MFA_REGISTER_PASSKEY_TITLE: string; + WEBAUTHN_MFA_FOOTER_LOGOUT: string; AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; diff --git a/lib/build/recipe/webauthn/types.d.ts b/lib/build/recipe/webauthn/types.d.ts index 660070af1..5f3117740 100644 --- a/lib/build/recipe/webauthn/types.d.ts +++ b/lib/build/recipe/webauthn/types.d.ts @@ -19,6 +19,7 @@ import type { WebauthnMFALoadingScreen, WebauthnMFASignUp, WebauthnMFASignUpConfirmation, + WebauthnMFAFooter, } from "./components/themes/mfa"; import type { PasskeyRecoveryEmailSent } from "./components/themes/sendRecoveryEmail/emailSent"; import type { @@ -107,6 +108,7 @@ export declare type ComponentOverrideMap = { WebauthnMFALoadingScreen_Override?: ComponentOverride; WebauthnMFASignUp_Override?: ComponentOverride; WebauthnMFASignUpConfirmation_Override?: ComponentOverride; + WebauthnMFAFooter_Override?: ComponentOverride; }; export declare type SignUpThemeBaseProps = { clearError: () => void; diff --git a/lib/build/webauthnprebuiltui.js b/lib/build/webauthnprebuiltui.js index 4fc886ceb..fb9de37e7 100644 --- a/lib/build/webauthnprebuiltui.js +++ b/lib/build/webauthnprebuiltui.js @@ -12,6 +12,7 @@ var recipe = require("./multifactorauth-shared2.js"); var types = require("./multifactorauth-shared.js"); var translationContext = require("./translationContext.js"); var sessionprebuiltui = require("./sessionprebuiltui.js"); +var arrowLeftIcon = require("./arrowLeftIcon.js"); var button = require("./emailpassword-shared.js"); var STGeneralError = require("supertokens-web-js/utils/error"); var formBase = require("./emailpassword-shared6.js"); @@ -39,7 +40,6 @@ require("supertokens-web-js/recipe/multifactorauth"); require("supertokens-web-js/utils/sessionClaimValidatorStore"); require("supertokens-web-js/recipe/session"); require("./session-shared.js"); -require("./arrowLeftIcon.js"); require("./emailpassword-shared4.js"); function _interopDefault(e) { @@ -88,6 +88,35 @@ var ThemeBase = function (_a) { }); }; +var WebauthnMFAFooter = uiEntry.withOverride("WebauthnMFAFooter", function PasswordlessMFAFooter(props) { + var t = translationContext.useTranslation(); + return jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "footerLinkGroupVert webauthn-mfa footer" }, + { + children: jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { + "data-supertokens": "secondaryText secondaryLinkWithLeftArrow", + onClick: props.onSignOutClicked, + }, + { + children: [ + jsxRuntime.jsx(arrowLeftIcon.ArrowLeftIcon, { + color: "rgb(var(--palette-textPrimary))", + }), + t("WEBAUTHN_MFA_FOOTER_LOGOUT"), + ], + } + ) + ), + } + ) + ); +}); + var WebauthnMFALoadingScreen = uiEntry.withOverride("WebauthnMFALoadingScreen", function WebauthnMFALoadingScreen() { return jsxRuntime.jsx( "div", @@ -228,6 +257,7 @@ var WebauthnMFASignIn = uiEntry.withOverride("WebauthnMFASignIn", function Webau ], }), !props.deviceSupported && jsxRuntime.jsx(PasskeyNotSupportedError, {}), + jsxRuntime.jsx(WebauthnMFAFooter, genericComponentOverrideContext.__assign({}, props)), ], }); }); @@ -368,7 +398,10 @@ var WebauthnMFASignUp = uiEntry.withOverride("WebauthnMFASignUp", function Webau }, validateOnBlur: false, showLabels: true, - footer: undefined, + footer: jsxRuntime.jsx( + WebauthnMFAFooter, + genericComponentOverrideContext.__assign({}, props) + ), }), ], } @@ -655,6 +688,7 @@ var WebauthnMFASignUpConfirmation = uiEntry.withOverride( } ) ), + jsxRuntime.jsx(WebauthnMFAFooter, genericComponentOverrideContext.__assign({}, props)), ], }); } @@ -794,13 +828,9 @@ function MFAThemeRouter(props) { ); var showBackButtonOnSignUpConfirmation = React__namespace.useMemo( function () { - return ( - props.featureState.email !== undefined || - props.featureState.hasRegisteredPassKey || - props.featureState.showBackButton - ); + return email !== undefined || props.featureState.hasRegisteredPassKey || props.featureState.showBackButton; }, - [props.featureState.email, props.featureState.hasRegisteredPassKey, props.featureState.showBackButton] + [email, props.featureState.hasRegisteredPassKey, props.featureState.showBackButton] ); var onSignUp = React__namespace.useCallback( function () { @@ -853,6 +883,7 @@ function MFAThemeRouter(props) { email: email, onRecoverAccountClick: props.onRecoverAccountClick, onBackButtonClicked: showBackButtonOnSignUp ? onClickSignUpBackButton : undefined, + onSignOutClicked: props.onSignOutClicked, }); } if (activeScreen === MFAScreens.SignUpConfirmation) { @@ -861,6 +892,7 @@ function MFAThemeRouter(props) { onBackButtonClicked: showBackButtonOnSignUpConfirmation ? onClickSignUpConfirmationBackButton : undefined, email: signUpEmail, error: props.featureState.error, + onSignOutClicked: props.onSignOutClicked, }); } return jsxRuntime.jsx(WebauthnMFASignIn, { @@ -870,6 +902,7 @@ function MFAThemeRouter(props) { error: props.featureState.error, deviceSupported: props.featureState.deviceSupported, onRegisterPasskeyClick: onRegisterPasskeyClick, + onSignOutClicked: props.onSignOutClicked, }); } @@ -934,6 +967,7 @@ var defaultTranslationsWebauthn = { WEBAUTHN_MFA_DIVIDER: "or", WEBAUTHN_MFA_REGISTER_PASSKEY_SUBTITLE: "Set up a new authentication method to use for future logins.", WEBAUTHN_MFA_REGISTER_PASSKEY_TITLE: "Register a passkey", + WEBAUTHN_MFA_FOOTER_LOGOUT: "Logout", } ), }; diff --git a/lib/ts/recipe/webauthn/components/themes/mfa/index.tsx b/lib/ts/recipe/webauthn/components/themes/mfa/index.tsx index a495aeca1..5b8459d4f 100644 --- a/lib/ts/recipe/webauthn/components/themes/mfa/index.tsx +++ b/lib/ts/recipe/webauthn/components/themes/mfa/index.tsx @@ -7,14 +7,21 @@ import UserContextWrapper from "../../../../../usercontext/userContextWrapper"; import { AccessDeniedScreen } from "../../../../session/prebuiltui"; import { ThemeBase } from "../themeBase"; -import { WebauthnMFALoadingScreen } from "./loadingScreen"; -import { WebauthnMFASignIn } from "./signIn"; -import { WebauthnMFASignUp } from "./signUp"; -import { WebauthnMFASignUpConfirmation } from "./signUpConfirmation"; +import { WebauthnMFAFooter } from "./mfaFooter"; +import { WebauthnMFALoadingScreen } from "./mfaLoadingScreen"; +import { WebauthnMFASignIn } from "./mfaSignIn"; +import { WebauthnMFASignUp } from "./mfaSignUp"; +import { WebauthnMFASignUpConfirmation } from "./mfaSignUpConfirmation"; import type { WebAuthnMFAProps } from "../../../types"; -export { WebauthnMFALoadingScreen, WebauthnMFASignIn, WebauthnMFASignUp, WebauthnMFASignUpConfirmation }; +export { + WebauthnMFALoadingScreen, + WebauthnMFASignIn, + WebauthnMFASignUp, + WebauthnMFASignUpConfirmation, + WebauthnMFAFooter, +}; export enum MFAScreens { SignIn, @@ -127,12 +134,8 @@ function MFAThemeRouter(props: WebAuthnMFAProps): JSX.Element { ]); const showBackButtonOnSignUpConfirmation = React.useMemo(() => { - return ( - props.featureState.email !== undefined || - props.featureState.hasRegisteredPassKey || - props.featureState.showBackButton - ); - }, [props.featureState.email, props.featureState.hasRegisteredPassKey, props.featureState.showBackButton]); + return email !== undefined || props.featureState.hasRegisteredPassKey || props.featureState.showBackButton; + }, [email, props.featureState.hasRegisteredPassKey, props.featureState.showBackButton]); const onSignUp = React.useCallback(async () => { await props.onSignUp(signUpEmail); @@ -168,6 +171,7 @@ function MFAThemeRouter(props: WebAuthnMFAProps): JSX.Element { email={email} onRecoverAccountClick={props.onRecoverAccountClick} onBackButtonClicked={showBackButtonOnSignUp ? onClickSignUpBackButton : undefined} + onSignOutClicked={props.onSignOutClicked} /> ); } @@ -181,6 +185,7 @@ function MFAThemeRouter(props: WebAuthnMFAProps): JSX.Element { } email={signUpEmail} error={props.featureState.error} + onSignOutClicked={props.onSignOutClicked} /> ); } @@ -193,6 +198,7 @@ function MFAThemeRouter(props: WebAuthnMFAProps): JSX.Element { error={props.featureState.error} deviceSupported={props.featureState.deviceSupported} onRegisterPasskeyClick={onRegisterPasskeyClick} + onSignOutClicked={props.onSignOutClicked} /> ); } diff --git a/lib/ts/recipe/webauthn/components/themes/mfa/mfaFooter.tsx b/lib/ts/recipe/webauthn/components/themes/mfa/mfaFooter.tsx new file mode 100644 index 000000000..dbce097c3 --- /dev/null +++ b/lib/ts/recipe/webauthn/components/themes/mfa/mfaFooter.tsx @@ -0,0 +1,23 @@ +import ArrowLeftIcon from "../../../../../components/assets/arrowLeftIcon"; +import { withOverride } from "../../../../../components/componentOverride/withOverride"; +import { useTranslation } from "../../../../../translation/translationContext"; + +export type WebauthnMFAFooterProps = { + onSignOutClicked: () => void; +}; + +export const WebauthnMFAFooter = withOverride( + "WebauthnMFAFooter", + function PasswordlessMFAFooter(props: WebauthnMFAFooterProps): JSX.Element | null { + const t = useTranslation(); + + return ( +
+
+ + {t("WEBAUTHN_MFA_FOOTER_LOGOUT")} +
+
+ ); + } +); diff --git a/lib/ts/recipe/webauthn/components/themes/mfa/loadingScreen.tsx b/lib/ts/recipe/webauthn/components/themes/mfa/mfaLoadingScreen.tsx similarity index 100% rename from lib/ts/recipe/webauthn/components/themes/mfa/loadingScreen.tsx rename to lib/ts/recipe/webauthn/components/themes/mfa/mfaLoadingScreen.tsx diff --git a/lib/ts/recipe/webauthn/components/themes/mfa/signIn.tsx b/lib/ts/recipe/webauthn/components/themes/mfa/mfaSignIn.tsx similarity index 96% rename from lib/ts/recipe/webauthn/components/themes/mfa/signIn.tsx rename to lib/ts/recipe/webauthn/components/themes/mfa/mfaSignIn.tsx index 42a1753f2..0cdef51aa 100644 --- a/lib/ts/recipe/webauthn/components/themes/mfa/signIn.tsx +++ b/lib/ts/recipe/webauthn/components/themes/mfa/mfaSignIn.tsx @@ -9,6 +9,8 @@ import Button from "../../../../emailpassword/components/library/button"; import GeneralError from "../../../../emailpassword/components/library/generalError"; import { PasskeyNotSupportedError } from "../error/passkeyNotSupportedError"; +import { WebauthnMFAFooter } from "./mfaFooter"; + export type MFASignInProps = { onBackButtonClicked?: () => void; onSignIn: () => Promise; @@ -16,6 +18,7 @@ export type MFASignInProps = { deviceSupported: boolean; canRegisterPasskey: boolean; onRegisterPasskeyClick: () => void; + onSignOutClicked: () => void; }; export const WebauthnMFASignIn = withOverride( @@ -71,6 +74,7 @@ export const WebauthnMFASignIn = withOverride( )} {!props.deviceSupported && } + ); } diff --git a/lib/ts/recipe/webauthn/components/themes/mfa/signUp.tsx b/lib/ts/recipe/webauthn/components/themes/mfa/mfaSignUp.tsx similarity index 97% rename from lib/ts/recipe/webauthn/components/themes/mfa/signUp.tsx rename to lib/ts/recipe/webauthn/components/themes/mfa/mfaSignUp.tsx index 5947e80d3..d63d01a20 100644 --- a/lib/ts/recipe/webauthn/components/themes/mfa/signUp.tsx +++ b/lib/ts/recipe/webauthn/components/themes/mfa/mfaSignUp.tsx @@ -10,6 +10,8 @@ import FormBase from "../../../../emailpassword/components/library/formBase"; import GeneralError from "../../../../emailpassword/components/library/generalError"; import { defaultEmailValidator } from "../../../../emailpassword/validators"; +import { WebauthnMFAFooter } from "./mfaFooter"; + export type MFASignUpProps = { onContinueClick: (email: string) => void; clearError: () => void; @@ -19,6 +21,7 @@ export type MFASignUpProps = { onFetchError?: (error: Response) => void; onRecoverAccountClick: () => void; onBackButtonClicked?: () => void; + onSignOutClicked: () => void; }; export const WebauthnMFASignUp = withOverride( @@ -98,7 +101,7 @@ export const WebauthnMFASignUp = withOverride( }} validateOnBlur={false} showLabels={true} - footer={undefined} + footer={} /> diff --git a/lib/ts/recipe/webauthn/components/themes/mfa/signUpConfirmation.tsx b/lib/ts/recipe/webauthn/components/themes/mfa/mfaSignUpConfirmation.tsx similarity index 95% rename from lib/ts/recipe/webauthn/components/themes/mfa/signUpConfirmation.tsx rename to lib/ts/recipe/webauthn/components/themes/mfa/mfaSignUpConfirmation.tsx index 9e8165ea2..dcb1c478d 100644 --- a/lib/ts/recipe/webauthn/components/themes/mfa/signUpConfirmation.tsx +++ b/lib/ts/recipe/webauthn/components/themes/mfa/mfaSignUpConfirmation.tsx @@ -8,11 +8,14 @@ import Button from "../../../../emailpassword/components/library/button"; import GeneralError from "../../../../emailpassword/components/library/generalError"; import { PasskeyFeatureBlockList } from "../signUp/featureBlocks"; +import { WebauthnMFAFooter } from "./mfaFooter"; + export type MFASignUpConfirmationProps = { - onSignUp: () => Promise; - onBackButtonClicked?: () => void; email: string; error?: string; + onSignUp: () => Promise; + onBackButtonClicked?: () => void; + onSignOutClicked: () => void; }; export const WebauthnMFASignUpConfirmation = withOverride( @@ -59,6 +62,7 @@ export const WebauthnMFASignUpConfirmation = withOverride( /> + ); } diff --git a/lib/ts/recipe/webauthn/components/themes/translations.ts b/lib/ts/recipe/webauthn/components/themes/translations.ts index c31054b8a..97f091d12 100644 --- a/lib/ts/recipe/webauthn/components/themes/translations.ts +++ b/lib/ts/recipe/webauthn/components/themes/translations.ts @@ -59,5 +59,6 @@ export const defaultTranslationsWebauthn = { WEBAUTHN_MFA_DIVIDER: "or", WEBAUTHN_MFA_REGISTER_PASSKEY_SUBTITLE: "Set up a new authentication method to use for future logins.", WEBAUTHN_MFA_REGISTER_PASSKEY_TITLE: "Register a passkey", + WEBAUTHN_MFA_FOOTER_LOGOUT: "Logout", }, }; diff --git a/lib/ts/recipe/webauthn/types.ts b/lib/ts/recipe/webauthn/types.ts index 21bece64d..1b77d5669 100644 --- a/lib/ts/recipe/webauthn/types.ts +++ b/lib/ts/recipe/webauthn/types.ts @@ -34,6 +34,7 @@ import type { WebauthnMFALoadingScreen, WebauthnMFASignUp, WebauthnMFASignUpConfirmation, + WebauthnMFAFooter, } from "./components/themes/mfa"; import type { PasskeyRecoveryEmailSent } from "./components/themes/sendRecoveryEmail/emailSent"; import type { @@ -136,6 +137,7 @@ export type ComponentOverrideMap = { WebauthnMFALoadingScreen_Override?: ComponentOverride; WebauthnMFASignUp_Override?: ComponentOverride; WebauthnMFASignUpConfirmation_Override?: ComponentOverride; + WebauthnMFAFooter_Override?: ComponentOverride; }; export type SignUpThemeBaseProps = { diff --git a/test/end-to-end/mfa.factorscreen.webauthn.test.js b/test/end-to-end/mfa.factorscreen.webauthn.test.js index 394c790a8..25d8a79fc 100644 --- a/test/end-to-end/mfa.factorscreen.webauthn.test.js +++ b/test/end-to-end/mfa.factorscreen.webauthn.test.js @@ -377,6 +377,36 @@ describe("SuperTokens SignIn w/ MFA", function () { await waitForSTElement(page, "[data-supertokens~=factorChooserList]"); }); + it("should not show a back button during setup if only webauthn is required", async () => { + await setupST({ + ...appConfig, + mfaInfo: { + requirements: [factorId], + alreadySetup: [], + allowedToSetup: [factorId], + }, + }); + + await tryEmailPasswordSignIn(page, email); + const header = await waitForSTElement(page, "[data-supertokens~=webauthn-mfa]"); + await waitForSTElement(page, "[data-supertokens~=backButton]", true); + }); + + it("should not show a back button during completion if only webauthn is required", async () => { + await setupST({ + ...appConfig, + mfaInfo: { + requirements: [factorId], + alreadySetup: [factorId], + allowedToSetup: [], + }, + }); + + await tryEmailPasswordSignIn(page, email); + await waitForSTElement(page, "[data-supertokens~=webauthn-mfa]"); + await waitForSTElement(page, "[data-supertokens~=backButton]", true); + }); + it("should handle WebAuthn device setup errors gracefully", async () => { await setupST({ ...appConfig, diff --git a/test/unit/componentOverrides.test.tsx b/test/unit/componentOverrides.test.tsx index 05035c9c2..5d905b2c9 100644 --- a/test/unit/componentOverrides.test.tsx +++ b/test/unit/componentOverrides.test.tsx @@ -71,10 +71,11 @@ import { PasskeyFeatureBlock } from "../../lib/ts/recipe/webauthn/components/the import { ContinueWithoutPasskey } from "../../lib/ts/recipe/webauthn/components/themes/signUp/continueWithoutPasskey"; import { SignUpFormInner } from "../../lib/ts/recipe/webauthn/components/themes/signUp/signUpForm"; import { SignUpSomethingWentWrong } from "../../lib/ts/recipe/webauthn/components/themes/signUp/somethingWentWrong"; -import { WebauthnMFASignIn } from "../../lib/ts/recipe/webauthn/components/themes/mfa/signIn"; -import { WebauthnMFALoadingScreen } from "../../lib/ts/recipe/webauthn/components/themes/mfa/loadingScreen"; -import { WebauthnMFASignUp } from "../../lib/ts/recipe/webauthn/components/themes/mfa/signUp"; -import { WebauthnMFASignUpConfirmation } from "../../lib/ts/recipe/webauthn/components/themes/mfa/signUpConfirmation"; +import { WebauthnMFASignIn } from "../../lib/ts/recipe/webauthn/components/themes/mfa/mfaSignIn"; +import { WebauthnMFALoadingScreen } from "../../lib/ts/recipe/webauthn/components/themes/mfa/mfaLoadingScreen"; +import { WebauthnMFASignUp } from "../../lib/ts/recipe/webauthn/components/themes/mfa/mfaSignUp"; +import { WebauthnMFASignUpConfirmation } from "../../lib/ts/recipe/webauthn/components/themes/mfa/mfaSignUpConfirmation"; +import { WebauthnMFAFooter } from "../../lib/ts/recipe/webauthn/components/themes/mfa/mfaFooter"; type AllComponentsOverrideMap = AuthRecipeOverrideMap & EmailPasswordOverrideMap & @@ -167,6 +168,7 @@ describe("Theme component overrides", () => { WebauthnMFALoadingScreen_Override: WebauthnMFALoadingScreen, WebauthnMFASignUp_Override: WebauthnMFASignUp, WebauthnMFASignUpConfirmation_Override: WebauthnMFASignUpConfirmation, + WebauthnMFAFooter_Override: WebauthnMFAFooter, }; Object.entries(overrides).forEach(([key, comp]) => {