-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathUserAddModal.tsx
More file actions
104 lines (98 loc) · 2.95 KB
/
UserAddModal.tsx
File metadata and controls
104 lines (98 loc) · 2.95 KB
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
import { AuthContext } from '@luna/contexts/api/auth/AuthContext';
import { newUninitializedUser, User } from '@luna/contexts/api/auth/types';
import { CreateOrUpdateUserPayload } from '@luna/contexts/api/auth/types/CreateOrUpdateUserPayload';
import {
Button,
Checkbox,
Input,
Modal,
ModalBody,
ModalContent,
ModalFooter,
ModalHeader,
} from '@heroui/react';
import { useCallback, useContext, useEffect, useState } from 'react';
export interface UserAddModalProps {
isOpen: boolean;
setOpen: (show: boolean) => void;
}
export function UserAddModal({ isOpen, setOpen }: UserAddModalProps) {
const [user, setUser] = useState<User>(newUninitializedUser());
const [password, setPassword] = useState('');
// initialize/reset modal state
useEffect(() => {
if (!isOpen) return;
setUser(newUninitializedUser());
setPassword('');
}, [isOpen]);
const auth = useContext(AuthContext);
const addUser = useCallback(async () => {
const payload: CreateOrUpdateUserPayload = {
username: user.username,
password,
email: user.email,
permanent_api_token: user.permanentApiToken,
};
const result = await auth.createUser(payload);
if (result.ok) {
console.log('added user:', payload);
} else {
console.log('failed to add user:', result.error);
}
// TODO: UI feedback from the request (success, error)
setOpen(false);
}, [setOpen, user, password, auth]);
return (
<Modal isOpen={isOpen} onOpenChange={setOpen}>
<ModalContent>
{onClose => (
<>
<ModalHeader>Add User</ModalHeader>
<ModalBody>
<Input
label="Username"
value={user.username}
onValueChange={username => {
if (!user) return;
setUser({ ...user, username });
}}
/>
<Input
type="password"
label="Password"
value={password}
onValueChange={setPassword}
/>
<Input
label="E-Mail"
value={user.email}
onValueChange={email => {
if (!user) return;
setUser({ ...user, email });
}}
/>
<Checkbox
isSelected={user.permanentApiToken}
onValueChange={permanentApiToken => {
if (!user) return;
setUser({
...user,
permanentApiToken,
});
}}
>
Permanent API Token
</Checkbox>
</ModalBody>
<ModalFooter>
<Button color="success" onPress={addUser}>
Add
</Button>
<Button onPress={onClose}>Cancel</Button>
</ModalFooter>
</>
)}
</ModalContent>
</Modal>
);
}