2023-04-17 00:15:41 +02:00
import { createGetKcContext } from "keycloakify/login" ;
2023-02-26 12:32:22 +01:00
2023-03-12 01:00:41 +01:00
export type KcContextExtension =
2023-07-24 07:30:45 +02:00
// WARNING: It's important to keep in sync the extraThemeProperties declared in the package.json and this type definition.
| { pageId : "login.ftl" ; extraThemeProperties : { foo : string ; } ; }
2023-02-26 12:32:22 +01:00
| { pageId : "my-extra-page-1.ftl" ; }
| { pageId : "my-extra-page-2.ftl" ; someCustomValue : string ; }
// NOTE: register.ftl is deprecated in favor of register-user-profile.ftl
// but let's say we use it anyway and have this plugin enabled: https://github.com/micedre/keycloak-mail-whitelisting
// keycloak-mail-whitelisting define the non standard ftl global authorizedMailDomains, we declare it here.
2023-03-12 01:00:41 +01:00
| { pageId : "register.ftl" ; authorizedMailDomains : string [ ] ; } ;
//NOTE: In most of the cases you do not need to overload the KcContext, you can
2023-04-17 00:15:41 +02:00
// just call createGetKcContext(...) without type arguments.
2023-03-12 01:00:41 +01:00
// You want to overload the KcContext only if:
// - You have custom plugins that add some values to the context (like https://github.com/micedre/keycloak-mail-whitelisting that adds authorizedMailDomains)
// - You want to add support for extra pages that are not yey featured by default, see: https://docs.keycloakify.dev/contributing#adding-support-for-a-new-page
2023-04-17 00:15:41 +02:00
export const { getKcContext } = createGetKcContext < KcContextExtension > ( {
2023-02-26 12:32:22 +01:00
mockData : [
{
pageId : "login.ftl" ,
locale : {
//When we test the login page we do it in french
currentLanguageTag : "fr" ,
} ,
//Uncomment the following line for hiding the Alert message
//"message": undefined
//Uncomment the following line for showing an Error message
//message: { type: "error", summary: "This is an error" }
} ,
{
pageId : "my-extra-page-2.ftl" ,
someCustomValue : "foo bar baz"
} ,
{
//NOTE: You will either use register.ftl (legacy) or register-user-profile.ftl, not both
pageId : "register-user-profile.ftl" ,
locale : {
currentLanguageTag : "fr"
} ,
profile : {
attributes : [
{
validators : {
pattern : {
pattern : "^[a-zA-Z0-9]+$" ,
"ignore.empty.value" : true ,
// eslint-disable-next-line no-template-curly-in-string
"error-message" : "${alphanumericalCharsOnly}" ,
} ,
} ,
//NOTE: To override the default mock value
value : undefined ,
name : "username"
} ,
{
validators : {
options : {
options : [ "male" , "female" , "non-binary" , "transgender" , "intersex" , "non_communicated" ]
}
} ,
// eslint-disable-next-line no-template-curly-in-string
displayName : "${gender}" ,
annotations : { } ,
required : true ,
groupAnnotations : { } ,
readOnly : false ,
name : "gender"
}
]
}
2023-02-26 16:35:55 +01:00
} ,
{
pageId : "register.ftl" ,
authorizedMailDomains : [
"example.com" ,
"another-example.com" ,
"*.yet-another-example.com" ,
"*.example.com" ,
"hello-world.com"
] ,
// Simulate we got an error with the email field
messagesPerField : {
2023-03-12 01:00:41 +01:00
printIfExists : < T > ( fieldName : string , className : T ) = > { console . log ( { fieldName } ) ; return fieldName === "email" ? className : undefined ; } ,
existsError : ( fieldName : string ) = > fieldName === "email" ,
2023-02-26 16:35:55 +01:00
get : ( fieldName : string ) = > ` Fake error for ${ fieldName } ` ,
exists : ( fieldName : string ) = > fieldName === "email"
} ,
2023-03-12 01:00:41 +01:00
2023-02-26 12:32:22 +01:00
}
]
} ) ;
2023-04-17 00:15:41 +02:00
export const { kcContext } = getKcContext ( {
// Uncomment to test the login page for development.
//mockPageId: "login.ftl",
} ) ;
2023-04-17 15:16:43 +02:00
export type KcContext = NonNullable < ReturnType < typeof getKcContext > [ "kcContext" ] > ;