Skip to content

Commit fd70acd

Browse files
committed
Add RoleEditModal
1 parent 5ffd4ff commit fd70acd

2 files changed

Lines changed: 89 additions & 9 deletions

File tree

src/modals/RoleEditModal.tsx

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { AuthContext } from '@luna/contexts/api/auth/AuthContext';
2+
3+
import { newUninitializedRole, Role } from '@luna/contexts/api/auth/types';
4+
import { CreateOrUpdateRolePayload } from '@luna/contexts/api/auth/types/CreateOrUpdateRolePayload';
5+
import {
6+
Button,
7+
Input,
8+
Modal,
9+
ModalBody,
10+
ModalContent,
11+
ModalFooter,
12+
ModalHeader,
13+
} from '@heroui/react';
14+
import { useCallback, useContext, useEffect, useState } from 'react';
15+
16+
export interface RoleEditModalProps {
17+
id: number;
18+
isOpen: boolean;
19+
setOpen: (open: boolean) => void;
20+
}
21+
22+
export function RoleEditModal({ id, isOpen, setOpen }: RoleEditModalProps) {
23+
const [role, setRole] = useState<Role>(newUninitializedRole());
24+
25+
const auth = useContext(AuthContext);
26+
27+
// initialize modal state
28+
useEffect(() => {
29+
if (!isOpen) return;
30+
const fetchRole = async () => {
31+
const roleResult = await auth.getRoleById(id);
32+
if (roleResult.ok) {
33+
setRole(roleResult.value);
34+
} else {
35+
setRole(newUninitializedRole());
36+
}
37+
};
38+
fetchRole();
39+
}, [id, isOpen, auth]);
40+
41+
const editRole = useCallback(async () => {
42+
const payload: CreateOrUpdateRolePayload = {
43+
name: role.name,
44+
};
45+
const result = await auth.updateRole(id, payload);
46+
if (result.ok) {
47+
console.log('Updated role', id, ':', payload);
48+
} else {
49+
console.log('Update role failed:', result.error);
50+
}
51+
// TODO: feedback from the request (success, error)
52+
setOpen(false);
53+
}, [role, auth, id, setOpen]);
54+
55+
return (
56+
<Modal isOpen={isOpen} onOpenChange={setOpen}>
57+
<ModalContent>
58+
{onClose => (
59+
<>
60+
<ModalHeader>Edit Role</ModalHeader>
61+
<ModalBody>
62+
<Input label="ID" value={id.toString()} isDisabled />
63+
<Input
64+
label="Name"
65+
value={role.name}
66+
onValueChange={name => {
67+
if (!role) return;
68+
setRole({ ...role, name });
69+
}}
70+
/>
71+
</ModalBody>
72+
<ModalFooter>
73+
<Button color="warning" onPress={editRole}>
74+
Save
75+
</Button>
76+
<Button onPress={onClose}>Cancel</Button>
77+
</ModalFooter>
78+
</>
79+
)}
80+
</ModalContent>
81+
</Modal>
82+
);
83+
}

src/screens/home/admin/RolesView.tsx

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
import { useContext, useState } from 'react';
2626
import { RoleAddModal } from '@luna/modals/RoleAddModal';
2727
import { RoleDeleteModal } from '@luna/modals/RoleDeleteModal';
28+
import { RoleEditModal } from '@luna/modals/RoleEditModal';
2829

2930
export function RolesView() {
3031
const auth = useContext(AuthContext);
@@ -78,6 +79,11 @@ export function RolesView() {
7879
}
7980
>
8081
<RoleAddModal isOpen={showRoleAddModal} setOpen={setShowRoleAddModal} />
82+
<RoleEditModal
83+
id={roleId}
84+
isOpen={showRoleAddModal}
85+
setOpen={setShowRoleAddModal}
86+
/>
8187
<RoleDeleteModal
8288
id={roleId}
8389
isOpen={showRoleAddModal}
@@ -114,15 +120,6 @@ export function RolesView() {
114120
<TableCell>{role.updatedAt.toLocaleString()}</TableCell>
115121
<TableCell>
116122
<div className="relative flex items-center gap-2">
117-
<Tooltip content="Details">
118-
<IconEye
119-
className="text-lg cursor-pointer active:opacity-50"
120-
onClick={() => {
121-
setRoleId(role.id);
122-
setShowRoleDetailsModal(true);
123-
}}
124-
/>
125-
</Tooltip>
126123
<Tooltip content="Edit role">
127124
<IconPencil
128125
className="text-lg cursor-pointer active:opacity-50"

0 commit comments

Comments
 (0)