Skip to content

Commit 489fbf2

Browse files
committed
Add RegistrationKeyDetailsModal
1 parent 3369b12 commit 489fbf2

3 files changed

Lines changed: 135 additions & 0 deletions

File tree

src/contexts/api/auth/AuthContext.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ export interface AuthContextValue {
117117

118118
/** Deletes a registration key */
119119
deleteRegistrationKey(id: number): Promise<Result<void>>;
120+
121+
/** Get all users that registered with this registration key */
122+
getUsersOfRegistrationKey(id: number): Promise<Result<User[]>>;
120123
}
121124

122125
export const AuthContext = createContext<AuthContextValue>({
@@ -155,6 +158,8 @@ export const AuthContext = createContext<AuthContextValue>({
155158
errorResult('No auth context for updating registration key'),
156159
deleteRegistrationKey: async () =>
157160
errorResult('No auth context for deleting registration key'),
161+
getUsersOfRegistrationKey: async () =>
162+
errorResult('No auth context for fetching users of registration key'),
158163
});
159164

160165
interface AuthContextProviderProps {
@@ -521,6 +526,18 @@ export function AuthContextProvider({ children }: AuthContextProviderProps) {
521526
);
522527
}
523528
},
529+
530+
async getUsersOfRegistrationKey(id) {
531+
try {
532+
const apiUsersResponse =
533+
await apiRef.current.registrationKeys.usersDetail(id);
534+
return okResult(apiUsersResponse.data.map(convert.userFromApi));
535+
} catch (error) {
536+
return errorResult(
537+
`Fetching users of role with id ${id} failed: ${await formatError(error)}`
538+
);
539+
}
540+
},
524541
}),
525542
[apiRef, apiUser?.id, isInitialized, token, updateToken, user]
526543
);
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import { AuthContext } from '@luna/contexts/api/auth/AuthContext';
2+
import {
3+
newUninitializedRegistrationKey,
4+
RegistrationKey,
5+
User,
6+
} from '@luna/contexts/api/auth/types';
7+
import {
8+
Button,
9+
Checkbox,
10+
Input,
11+
Modal,
12+
ModalBody,
13+
ModalContent,
14+
ModalFooter,
15+
ModalHeader,
16+
Table,
17+
TableBody,
18+
TableCell,
19+
TableColumn,
20+
TableHeader,
21+
TableRow,
22+
} from '@heroui/react';
23+
import { useContext, useEffect, useState } from 'react';
24+
25+
export interface RegistrationKeyShowModalProps {
26+
id: number;
27+
isOpen: boolean;
28+
setOpen: (open: boolean) => void;
29+
}
30+
31+
export function RegistrationKeyDetailsModal({
32+
id,
33+
isOpen,
34+
setOpen,
35+
}: RegistrationKeyShowModalProps) {
36+
const [regKey, setRegKey] = useState<RegistrationKey>(
37+
newUninitializedRegistrationKey()
38+
);
39+
const [users, setUsers] = useState<User[]>([]);
40+
const auth = useContext(AuthContext);
41+
42+
// initialize modal state
43+
useEffect(() => {
44+
if (!isOpen) return;
45+
const fetchRegistrationKey = async () => {
46+
const regKeyResult = await auth.getRegistrationKeyById(id);
47+
if (regKeyResult.ok) {
48+
setRegKey(regKeyResult.value);
49+
} else {
50+
console.log('Failed to fetch registration key:', regKeyResult.error);
51+
setRegKey(newUninitializedRegistrationKey());
52+
}
53+
const usersResult = await auth.getUsersOfRegistrationKey(id);
54+
if (usersResult.ok) {
55+
setUsers(usersResult.value);
56+
} else {
57+
console.log(
58+
'Failed to fetch users of registration key:',
59+
usersResult.error
60+
);
61+
setRegKey(newUninitializedRegistrationKey());
62+
}
63+
};
64+
fetchRegistrationKey();
65+
}, [auth, id, isOpen]);
66+
67+
return (
68+
<Modal isOpen={isOpen} onOpenChange={setOpen}>
69+
<ModalContent>
70+
{onClose => (
71+
<>
72+
<ModalHeader>Registration Key</ModalHeader>
73+
<ModalBody>
74+
<Input label="ID" value={id.toString()} isDisabled />
75+
<Input label="Key" value={regKey.key} />
76+
<Input label="Description" value={regKey.description} />
77+
<Input
78+
label="Expires At"
79+
value={regKey.expiresAt.toLocaleString()}
80+
/>
81+
<Checkbox isSelected={regKey.permanent}>
82+
Permanent Registration Key
83+
</Checkbox>
84+
Users:
85+
<Table>
86+
<TableHeader>
87+
<TableColumn key="id" allowsSorting>
88+
ID
89+
</TableColumn>
90+
<TableColumn key="id" allowsSorting>
91+
Username
92+
</TableColumn>
93+
</TableHeader>
94+
<TableBody items={users}>
95+
{user => (
96+
<TableRow key={user.username}>
97+
<TableCell>{user.id}</TableCell>
98+
<TableCell>{user.username}</TableCell>
99+
</TableRow>
100+
)}
101+
</TableBody>
102+
</Table>
103+
</ModalBody>
104+
<ModalFooter>
105+
<Button onPress={onClose}>Cancel</Button>
106+
</ModalFooter>
107+
</>
108+
)}
109+
</ModalContent>
110+
</Modal>
111+
);
112+
}

src/screens/home/admin/RegistrationKeysView.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { useCallback, useContext, useState } from 'react';
2222
import { RegistrationKeyAddModal } from '@luna/modals/RegistrationKeyAddModal';
2323
import { RegistrationKeyDeleteModal } from '@luna/modals/RegistrationKeyDeleteModal';
2424
import { RegistrationKeyEditModal } from '@luna/modals/RegistrationKeyEditModal';
25+
import { RegistrationKeyDetailsModal } from '@luna/modals/RegistrationKeyDetailsModal';
2526

2627
export function RegistrationKeysView() {
2728
const auth = useContext(AuthContext);
@@ -81,6 +82,11 @@ export function RegistrationKeysView() {
8182
setOpen={setShowKeyAddModal}
8283
onSuccess={onSuccess}
8384
/>
85+
<RegistrationKeyDetailsModal
86+
id={keyId}
87+
isOpen={showKeyDetailsModal}
88+
setOpen={setShowKeyDetailsModal}
89+
/>
8490
<RegistrationKeyEditModal
8591
id={keyId}
8692
isOpen={showKeyEditModal}

0 commit comments

Comments
 (0)