-
Notifications
You must be signed in to change notification settings - Fork 149
/
User.ts
56 lines (50 loc) · 2.24 KB
/
User.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import { type OidcUserInfo, OidcClient } from '@axa-fr/oidc-client';
import { useEffect, useState } from 'react';
export enum OidcUserStatus {
Unauthenticated= 'Unauthenticated',
Loading = 'Loading user',
Loaded = 'User loaded',
LoadingError = 'Error loading user'
}
export type OidcUser<T extends OidcUserInfo = OidcUserInfo> = {
user: T | null;
status: OidcUserStatus;
}
export const useOidcUser = <T extends OidcUserInfo = OidcUserInfo>(configurationName = 'default', demonstrating_proof_of_possession=false) => {
const [oidcUser, setOidcUser] = useState<OidcUser<T>>({ user: null, status: OidcUserStatus.Unauthenticated });
const [oidcUserId, setOidcUserId] = useState<string>('');
useEffect(() => {
const oidc = OidcClient.get(configurationName);
let isMounted = true;
if (oidc && oidc.tokens) {
setOidcUser({ ...oidcUser, status: OidcUserStatus.Loading });
const isNoCache = oidcUserId !== '';
oidc.userInfoAsync(isNoCache, demonstrating_proof_of_possession)
.then((info) => {
if (isMounted) {
// @ts-ignore
setOidcUser({ user: info, status: OidcUserStatus.Loaded });
}
})
.catch(() => setOidcUser({ ...oidcUser, status: OidcUserStatus.LoadingError }));
} else {
setOidcUser({ user: null, status: OidcUserStatus.Unauthenticated });
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const newSubscriptionId = oidc.subscribeEvents((name: string, data: any) => {
if (name === OidcClient.eventNames.logout_from_another_tab || name === OidcClient.eventNames.logout_from_same_tab) {
if (isMounted) {
setOidcUser({ user: null, status: OidcUserStatus.Unauthenticated });
}
}
});
return () => {
isMounted = false;
oidc.removeEventSubscription(newSubscriptionId);
};
}, [oidcUserId]);
const reloadOidcUser = () => {
setOidcUserId(oidcUserId + ' ');
};
return { oidcUser: oidcUser.user, oidcUserLoadingState: oidcUser.status, reloadOidcUser };
};