-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCreateUserDialog.tsx
More file actions
79 lines (73 loc) · 1.93 KB
/
CreateUserDialog.tsx
File metadata and controls
79 lines (73 loc) · 1.93 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
import { gql } from "@apollo/client";
import { useMutation } from "@apollo/client/react";
import { useState } from "react";
import { User } from "./types";
export const CREATE_USER_MUTATION = gql`
mutation CreateUser($name: String!, $email: String!, $role: String!) {
createUser(name: $name, email: $email, role: $role) {
id
name
email
role
}
}
`;
export default function CreateUserDialog(props: {
isOpen: boolean;
onClose: () => void;
onSuccess: (user: User) => void;
onError: (error: Error) => void;
}) {
const [formState, setFormState] = useState({ name: "", email: "", role: "" });
const [createUser, { loading, error }] = useMutation<{
createUser: User;
}>(CREATE_USER_MUTATION);
const handleSubmit = async () => {
try {
const result = await createUser({
variables: {
name: formState.name,
email: formState.email,
role: formState.role,
},
});
const user = result.data?.createUser;
if (!user) throw new Error("No user created");
props.onSuccess(user);
props.onClose();
} catch (error) {
props.onError(error as Error);
}
};
return (
<dialog open={props.isOpen} onClose={props.onClose}>
<label>
Name
<input
type="text"
value={formState.name}
onChange={(e) => setFormState({ ...formState, name: e.target.value })}
/>
</label>
<label>
Email
<input
type="email"
value={formState.email}
onChange={(e) =>
setFormState({ ...formState, email: e.target.value })
}
/>
</label>
<label>
Role
<input
type="text"
value={formState.role}
onChange={(e) => setFormState({ ...formState, role: e.target.value })}
/>
</label>
<button onClick={handleSubmit}>Create</button>
</dialog>
);
}