diff --git a/src/login/TermsAcceptance.tsx b/src/login/TermsAcceptance.tsx new file mode 100644 index 00000000..9d39fbb5 --- /dev/null +++ b/src/login/TermsAcceptance.tsx @@ -0,0 +1,81 @@ +import type { ClassKey } from "keycloakify/login/TemplateProps"; +import { useRerenderOnStateChange } from "evt/hooks"; +import { Markdown } from "keycloakify/tools/Markdown"; +import { evtTermMarkdown } from "keycloakify/login/lib/useDownloadTerms"; +import type { KcContext } from "keycloakify/login/kcContext/KcContext"; +import type { I18n } from "./i18n"; + +export type PropsOfTermsAcceptance = { + kcContext: KcContextLike; + i18n: I18n; + getClassName: (classKey: ClassKey) => string; +}; + +type KcContextLike = { + termsAcceptanceRequired?: boolean; + messagesPerField: Pick; +}; + +export function TermsAcceptance(props: PropsOfTermsAcceptance) { + const { + kcContext: { termsAcceptanceRequired = false } + } = props; + + if (!termsAcceptanceRequired) { + return null; + } + + return ; +} + +export function TermsAcceptanceEnabled(props: PropsOfTermsAcceptance) { + const { + i18n, + getClassName, + kcContext: { messagesPerField } + } = props; + + const { msg } = i18n; + + useRerenderOnStateChange(evtTermMarkdown); + + const termMarkdown = evtTermMarkdown.state; + + if (termMarkdown === undefined) { + return null; + } + + return ( + <> +
+
+ {msg("termsTitle")} +
+ {termMarkdown} +
+
+
+
+
+ + +
+ {messagesPerField.existsError("termsAccepted") && ( +
+ + {messagesPerField.get("termsAccepted")} + +
+ )} +
+ + ); +}