Skip to content

Commit 8cebd48

Browse files
committed
Display keycloak user
1 parent b98a8a2 commit 8cebd48

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

src/lib/keycloak-user.ts

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import { useState, useEffect } from "react"
2+
import keycloak from "../keycloak"
3+
4+
interface KeycloakProfile {
5+
username?: string
6+
email?: string
7+
}
8+
9+
interface KeycloakTokenParsed {
10+
preferred_username?: string
11+
email?: string
12+
}
13+
14+
interface KeycloakUser {
15+
name: string
16+
email: string
17+
avatar: string
18+
}
19+
20+
interface UseKeycloakReturn {
21+
isAuthenticated: boolean
22+
isLoading: boolean
23+
user: KeycloakUser | null
24+
}
25+
26+
export function useKeycloak(): UseKeycloakReturn {
27+
const [isAuthenticated, setIsAuthenticated] = useState(false)
28+
const [isLoading, setIsLoading] = useState(true)
29+
const [user, setUser] = useState<KeycloakUser | null>(null)
30+
31+
useEffect(() => {
32+
const updateAuthState = () => {
33+
if (keycloak.authenticated) {
34+
setIsAuthenticated(true)
35+
setUser({
36+
name: (keycloak.profile as KeycloakProfile)?.username ?? (keycloak.tokenParsed as KeycloakTokenParsed)?.preferred_username ?? 'Unknown User',
37+
email: (keycloak.profile as KeycloakProfile)?.email ?? (keycloak.tokenParsed as KeycloakTokenParsed)?.email ?? '',
38+
avatar: "",
39+
})
40+
} else {
41+
setIsAuthenticated(false)
42+
setUser(null)
43+
}
44+
setIsLoading(false)
45+
}
46+
47+
if (keycloak.authenticated) {
48+
updateAuthState()
49+
}
50+
51+
keycloak.onAuthSuccess = () => {
52+
updateAuthState()
53+
}
54+
55+
keycloak.onAuthError = () => {
56+
setIsAuthenticated(false)
57+
setUser(null)
58+
setIsLoading(false)
59+
}
60+
61+
keycloak.onAuthLogout = () => {
62+
setIsAuthenticated(false)
63+
setUser(null)
64+
setIsLoading(false)
65+
}
66+
67+
if (!keycloak.authenticated && !keycloak.loginRequired) {
68+
const checkAuth = () => {
69+
if (keycloak.authenticated || keycloak.loginRequired) {
70+
updateAuthState()
71+
} else {
72+
setTimeout(checkAuth, 100)
73+
}
74+
}
75+
checkAuth()
76+
}
77+
78+
return () => {
79+
keycloak.onAuthSuccess = undefined
80+
keycloak.onAuthError = undefined
81+
keycloak.onAuthLogout = undefined
82+
}
83+
}, [])
84+
85+
return {
86+
isAuthenticated,
87+
isLoading,
88+
user,
89+
}
90+
}

0 commit comments

Comments
 (0)