@@ -10,6 +10,7 @@ import {SettingsContext} from "./SettingsContextProvider"
1010import { getLanguageFromURL } from "../utils/queryParams"
1111import { useTranslation } from "react-i18next"
1212import { IPermissions } from "../types/keycloak"
13+ import { appendLoginHints , LoginHints } from "../utils/loginHints"
1314
1415/**
1516 * AuthContextValues defines the structure for the default values of the {@link AuthContext}.
@@ -66,7 +67,8 @@ export interface AuthContextValues {
6667 tenantId : string ,
6768 eventId : string ,
6869 authType ?: "register" | "login" ,
69- defaultLocale ?: string
70+ defaultLocale ?: string ,
71+ loginHints ?: LoginHints
7072 ) => void
7173
7274 /**
@@ -100,7 +102,13 @@ const defaultAuthContextValues: AuthContextValues = {
100102 keycloakAccessToken : undefined ,
101103 logout : ( ) => { } ,
102104 getExpiry : ( ) => undefined ,
103- setTenantEvent : ( _tenantId : string , _eventId : string , _authType , _defaultLocale ) => { } ,
105+ setTenantEvent : (
106+ _tenantId : string ,
107+ _eventId : string ,
108+ _authType ,
109+ _defaultLocale ,
110+ _loginHints
111+ ) => { } ,
104112 hasRole : ( ) => false ,
105113 isKiosk : ( ) => false ,
106114 openProfileLink : ( ) => new Promise ( ( ) => undefined ) ,
@@ -144,6 +152,7 @@ const AuthContextProvider = (props: AuthContextProviderProps) => {
144152 const [ eventId , setEventId ] = useState < string | null > ( null )
145153 const [ authType , setAuthType ] = useState < "register" | "login" | null > ( null )
146154 const [ defaultLocale , setDefaultLocale ] = useState < string | undefined > ( undefined )
155+ const [ loginHints , setLoginHints ] = useState < LoginHints > ( { } )
147156
148157 const { i18n} = useTranslation ( )
149158
@@ -294,15 +303,41 @@ const AuthContextProvider = (props: AuthContextProviderProps) => {
294303 if ( authType === "register" ) {
295304 const baseUrl = window . location . origin + window . location . pathname
296305 const queryString = window . location . search
297-
298- return await keycloak . register ( {
306+ const registerOptions = {
299307 ...keycloakInitOptions ,
300308 // after successful enrollment, we should redirect to login
301309 redirectUri : baseUrl . endsWith ( "/enroll" )
302310 ? baseUrl . replace ( / \/ e n r o l l $ / , "/login" ) + queryString
303311 : undefined ,
304- } )
312+ loginHint : loginHints . username ,
313+ }
314+
315+ if ( Object . keys ( loginHints ) . length > 0 ) {
316+ window . location . assign (
317+ appendLoginHints (
318+ keycloak . createRegisterUrl ( registerOptions ) ,
319+ loginHints
320+ )
321+ )
322+ return
323+ }
324+
325+ return await keycloak . register ( registerOptions )
305326 } else {
327+ if ( Object . keys ( loginHints ) . length > 0 ) {
328+ window . location . assign (
329+ appendLoginHints (
330+ keycloak . createLoginUrl ( {
331+ ...keycloakInitOptions ,
332+ // Stock username forms only understand the standard OIDC hint.
333+ loginHint : loginHints . username ,
334+ } ) ,
335+ loginHints
336+ )
337+ )
338+ return
339+ }
340+
306341 return await keycloak . login ( keycloakInitOptions )
307342 }
308343 }
@@ -326,7 +361,7 @@ const AuthContextProvider = (props: AuthContextProviderProps) => {
326361 if ( keycloak && ! isAuthenticated && ! isKeycloakInitialized ) {
327362 initializeKeycloak ( )
328363 }
329- } , [ keycloak , isAuthenticated , isKeycloakInitialized , authType , defaultLocale ] )
364+ } , [ keycloak , isAuthenticated , isKeycloakInitialized , authType , defaultLocale , loginHints ] )
330365
331366 /**
332367 * Returns true only if the JWT has gold permissions and the JWT
@@ -395,12 +430,14 @@ const AuthContextProvider = (props: AuthContextProviderProps) => {
395430 tenantId : string ,
396431 eventId : string ,
397432 authType ?: "register" | "login" ,
398- defaultLocale ?: string
433+ defaultLocale ?: string ,
434+ initialLoginHints ?: LoginHints
399435 ) => {
400436 setTenantId ( tenantId )
401437 setEventId ( eventId )
402438 setDefaultLocale ( defaultLocale )
403439 authType && setAuthType ( authType )
440+ setLoginHints ( initialLoginHints ?? { } )
404441 }
405442
406443 const getRedirectUrl = ( redirectUrl ?: string ) => {
0 commit comments