diff --git a/src/bin/keycloakify/generateFtl/pageId.ts b/src/bin/keycloakify/generateFtl/pageId.ts index 2dc5c7f7..efe852c9 100644 --- a/src/bin/keycloakify/generateFtl/pageId.ts +++ b/src/bin/keycloakify/generateFtl/pageId.ts @@ -30,7 +30,8 @@ export const loginThemePageIds = [ "code.ftl", "delete-account-confirm.ftl", "frontchannel-logout.ftl", - "login-recovery-authn-code-config.ftl" + "login-recovery-authn-code-config.ftl", + "login-recovery-authn-code-input.ftl" ] as const; export const accountThemePageIds = ["password.ftl", "account.ftl", "sessions.ftl", "totp.ftl", "applications.ftl", "log.ftl"] as const; diff --git a/src/login/Fallback.tsx b/src/login/Fallback.tsx index 4a6ad13d..32036e4b 100644 --- a/src/login/Fallback.tsx +++ b/src/login/Fallback.tsx @@ -36,6 +36,7 @@ const Code = lazy(() => import("keycloakify/login/pages/Code")); const DeleteAccountConfirm = lazy(() => import("keycloakify/login/pages/DeleteAccountConfirm")); const FrontchannelLogout = lazy(() => import("keycloakify/login/pages/FrontchannelLogout")); const LoginRecoveryAuthnCodeConfig = lazy(() => import("keycloakify/login/pages/LoginRecoveryAuthnCodeConfig")); +const LoginRecoveryAuthnCodeInput = lazy(() => import("keycloakify/login/pages/LoginRecoveryAuthnCodeInput")); type FallbackProps = PageProps & { UserProfileFormFields: LazyOrNot<(props: UserProfileFormFieldsProps) => JSX.Element>; @@ -110,6 +111,8 @@ export default function Fallback(props: FallbackProps) { return ; case "login-recovery-authn-code-config.ftl": return ; + case "login-recovery-authn-code-input.ftl": + return ; } assert>(false); })()} diff --git a/src/login/kcContext/KcContext.ts b/src/login/kcContext/KcContext.ts index 77953b61..0a0c5b3f 100644 --- a/src/login/kcContext/KcContext.ts +++ b/src/login/kcContext/KcContext.ts @@ -542,6 +542,9 @@ export declare namespace KcContext { export type LoginRecoveryAuthnCodeInput = Common & { pageId: "login-recovery-authn-code-input.ftl"; + recoveryAuthnCodesInputBean: { + codeNumber: number; + }; }; } diff --git a/src/login/pages/LoginRecoveryAuthnCodeInput.tsx b/src/login/pages/LoginRecoveryAuthnCodeInput.tsx new file mode 100644 index 00000000..b18d5904 --- /dev/null +++ b/src/login/pages/LoginRecoveryAuthnCodeInput.tsx @@ -0,0 +1,73 @@ +import { clsx } from "keycloakify/tools/clsx"; +import type { PageProps } from "keycloakify/login/pages/PageProps"; +import { useGetClassName } from "keycloakify/login/lib/useGetClassName"; +import type { KcContext } from "../kcContext"; +import type { I18n } from "../i18n"; + +export default function LoginRecoveryAuthnCodeInput(props: PageProps, I18n>) { + const { kcContext, i18n, doUseDefaultCss, Template, classes } = props; + + const { getClassName } = useGetClassName({ + doUseDefaultCss, + classes + }); + + const { url, messagesPerField, recoveryAuthnCodesInputBean } = kcContext; + + const { msg, msgStr } = i18n; + + return ( + + ); +}