1
1
import { getGroup , patchGroup } from "api/api"
2
2
import { getErrorMessage } from "api/errors"
3
3
import { Group } from "api/typesGenerated"
4
- import { displayError } from "components/GlobalSnackbar/utils"
4
+ import { displayError , displaySuccess } from "components/GlobalSnackbar/utils"
5
5
import { assign , createMachine } from "xstate"
6
6
7
7
export const groupMachine = createMachine (
@@ -12,6 +12,7 @@ export const groupMachine = createMachine(
12
12
groupId : string
13
13
group ?: Group
14
14
addMemberCallback ?: ( ) => void
15
+ removingMember ?: string
15
16
} ,
16
17
services : { } as {
17
18
loadGroup : {
@@ -20,12 +21,20 @@ export const groupMachine = createMachine(
20
21
addMember : {
21
22
data : Group
22
23
}
24
+ removeMember : {
25
+ data : Group
26
+ }
23
27
} ,
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
+ } ,
29
38
} ,
30
39
tsTypes : { } as import ( "./groupXService.typegen" ) . Typegen0 ,
31
40
initial : "loading" ,
@@ -49,6 +58,10 @@ export const groupMachine = createMachine(
49
58
target : "addingMember" ,
50
59
actions : [ "assignAddMemberCallback" ] ,
51
60
} ,
61
+ REMOVE_MEMBER : {
62
+ target : "removingMember" ,
63
+ actions : [ "removeUserFromMembers" ] ,
64
+ } ,
52
65
} ,
53
66
} ,
54
67
addingMember : {
@@ -64,6 +77,19 @@ export const groupMachine = createMachine(
64
77
} ,
65
78
} ,
66
79
} ,
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
+ } ,
67
93
} ,
68
94
} ,
69
95
{
@@ -76,6 +102,13 @@ export const groupMachine = createMachine(
76
102
77
103
return patchGroup ( group . id , { name : "" , add_users : [ userId ] , remove_users : [ ] } )
78
104
} ,
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
+ } ,
79
112
} ,
80
113
actions : {
81
114
assignGroup : assign ( {
@@ -97,6 +130,26 @@ export const groupMachine = createMachine(
97
130
addMemberCallback ( )
98
131
}
99
132
} ,
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
+ } ,
100
153
} ,
101
154
} ,
102
155
)
0 commit comments