Skip to content

Commit cba7065

Browse files
committed
Remove members from group
1 parent 4bb1e5f commit cba7065

File tree

2 files changed

+75
-7
lines changed

2 files changed

+75
-7
lines changed

site/src/pages/GroupsPage/GroupPage.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { LoadingButton } from "components/LoadingButton/LoadingButton"
1515
import { Margins } from "components/Margins/Margins"
1616
import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader"
1717
import { Stack } from "components/Stack/Stack"
18+
import { TableRowMenu } from "components/TableRowMenu/TableRowMenu"
1819
import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete"
1920
import { useState } from "react"
2021
import { Helmet } from "react-helmet-async"
@@ -133,7 +134,21 @@ export const GroupPage: React.FC = () => {
133134
highlightTitle
134135
/>
135136
</TableCell>
136-
<TableCell width="1%"></TableCell>
137+
<TableCell width="1%">
138+
<TableCell>
139+
<TableRowMenu
140+
data={member}
141+
menuItems={[
142+
{
143+
label: "Remove",
144+
onClick: () => {
145+
send({ type: "REMOVE_MEMBER", userId: member.id })
146+
},
147+
},
148+
]}
149+
/>
150+
</TableCell>
151+
</TableCell>
137152
</TableRow>
138153
))}
139154
</Cond>

site/src/xServices/groups/groupXService.ts

Lines changed: 59 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { getGroup, patchGroup } from "api/api"
22
import { getErrorMessage } from "api/errors"
33
import { Group } from "api/typesGenerated"
4-
import { displayError } from "components/GlobalSnackbar/utils"
4+
import { displayError, displaySuccess } from "components/GlobalSnackbar/utils"
55
import { assign, createMachine } from "xstate"
66

77
export const groupMachine = createMachine(
@@ -12,6 +12,7 @@ export const groupMachine = createMachine(
1212
groupId: string
1313
group?: Group
1414
addMemberCallback?: () => void
15+
removingMember?: string
1516
},
1617
services: {} as {
1718
loadGroup: {
@@ -20,12 +21,20 @@ export const groupMachine = createMachine(
2021
addMember: {
2122
data: Group
2223
}
24+
removeMember: {
25+
data: Group
26+
}
2327
},
24-
events: {} as {
25-
type: "ADD_MEMBER"
26-
userId: string
27-
callback: () => void
28-
},
28+
events: {} as
29+
| {
30+
type: "ADD_MEMBER"
31+
userId: string
32+
callback: () => void
33+
}
34+
| {
35+
type: "REMOVE_MEMBER"
36+
userId: string
37+
},
2938
},
3039
tsTypes: {} as import("./groupXService.typegen").Typegen0,
3140
initial: "loading",
@@ -49,6 +58,10 @@ export const groupMachine = createMachine(
4958
target: "addingMember",
5059
actions: ["assignAddMemberCallback"],
5160
},
61+
REMOVE_MEMBER: {
62+
target: "removingMember",
63+
actions: ["removeUserFromMembers"],
64+
},
5265
},
5366
},
5467
addingMember: {
@@ -64,6 +77,19 @@ export const groupMachine = createMachine(
6477
},
6578
},
6679
},
80+
removingMember: {
81+
invoke: {
82+
src: "removeMember",
83+
onDone: {
84+
actions: ["assignGroup", "displayRemoveMemberSuccess"],
85+
target: "idle",
86+
},
87+
onError: {
88+
target: "idle",
89+
actions: ["displayRemoveMemberError"],
90+
},
91+
},
92+
},
6793
},
6894
},
6995
{
@@ -76,6 +102,13 @@ export const groupMachine = createMachine(
76102

77103
return patchGroup(group.id, { name: "", add_users: [userId], remove_users: [] })
78104
},
105+
removeMember: ({ group }, { userId }) => {
106+
if (!group) {
107+
throw new Error("Group not defined.")
108+
}
109+
110+
return patchGroup(group.id, { name: "", add_users: [], remove_users: [userId] })
111+
},
79112
},
80113
actions: {
81114
assignGroup: assign({
@@ -97,6 +130,26 @@ export const groupMachine = createMachine(
97130
addMemberCallback()
98131
}
99132
},
133+
// Optimistically remove the user from members
134+
removeUserFromMembers: assign({
135+
group: ({ group }, { userId }) => {
136+
if (!group) {
137+
throw new Error("Group is not defined.")
138+
}
139+
140+
return {
141+
...group,
142+
members: group.members.filter((currentMember) => currentMember.id !== userId),
143+
}
144+
},
145+
}),
146+
displayRemoveMemberError: (_, { data }) => {
147+
const message = getErrorMessage(data, "Failed to remove member from the group.")
148+
displayError(message)
149+
},
150+
displayRemoveMemberSuccess: () => {
151+
displaySuccess("Member removed successfully.")
152+
},
100153
},
101154
},
102155
)

0 commit comments

Comments
 (0)