/
Header.tsx
116 lines (107 loc) · 3.06 KB
/
Header.tsx
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import * as React from 'react';
import { Menu, Icon, Dropdown, Button } from 'antd';
import { UserManager, User } from 'oidc-client';
import { useNexusContext } from '@bbp/react-nexus';
import { Realm } from '@bbp/nexus-sdk';
import { SETTINGS } from '../config';
import { getConfig } from '../utils/auth';
import HeaderComponent from '../components/Header';
const Login: React.FunctionComponent<{
realms: Realm[];
onRealmSelected(realm: Realm): void;
}> = ({ realms, onRealmSelected }) => {
const [selectedRealm, setSelectedRealm] = React.useState<Realm>(realms[0]);
React.useEffect(() => {
if (!selectedRealm) {
setSelectedRealm(realms[0]);
}
}, [realms, setSelectedRealm, selectedRealm]);
const menu = (
<Menu>
{realms.map(realm => (
<Menu.Item key={realm['@id']} onClick={() => setSelectedRealm(realm)}>
{realm._label}
</Menu.Item>
))}
</Menu>
);
return selectedRealm ? (
<Dropdown.Button
overlay={menu}
onClick={() => onRealmSelected(selectedRealm)}
icon={<Icon type="down" />}
>
Login with {selectedRealm._label} <Icon type="login" />
</Dropdown.Button>
) : null;
};
const Logout: React.FunctionComponent<{
userName: string;
onLogout(): void;
}> = ({ userName, onLogout }) => {
return (
<Button icon="logout" onClick={onLogout}>
{userName}: Logout
</Button>
);
};
const Header: React.FunctionComponent<{
userManager: UserManager | null;
user: User | null;
}> = ({ userManager, user }) => {
const nexus = useNexusContext();
// fetch list of available realms when application mounts
const [realms, setRealms] = React.useState<Realm[]>([]);
React.useEffect(() => {
nexus.Realm.list()
.then(realms => {
// nexus uses a realm called `serviceaccount` internally, we need to filter it out
setRealms(
realms._results.filter(
realm => realm._label !== SETTINGS.serviceAccountName,
),
);
})
.catch(e => console.error(e));
}, [nexus]);
const handleLogin = (realm: Realm) => {
if (!userManager) {
return;
}
const nextUserManagerConfig = getConfig(realm);
const nextUserManager = new UserManager(nextUserManagerConfig);
nextUserManager
.signinRedirect()
.then(() => {
userManager.revokeAccessToken();
userManager.clearStaleState();
localStorage.setItem(
SETTINGS.preferredRealmKey,
JSON.stringify({ _issuer: nextUserManagerConfig.authority }),
);
})
.catch(e => console.log(e.message));
};
const handleLogout = () => {
if (!userManager) {
return;
}
userManager
.signoutRedirect()
.then(() => {
userManager.revokeAccessToken();
userManager.clearStaleState();
localStorage.removeItem(SETTINGS.preferredRealmKey);
})
.catch(e => console.log(e.message));
};
return HeaderComponent({
handleLogout,
handleLogin,
Logout,
Login,
realms,
userName: user && user.profile.name,
});
};
export default Header;