@@ -3,13 +3,14 @@ import { FC, useState } from 'react'
3
3
import { useCurrentProfile } from '@baseapp-frontend/authentication'
4
4
import { AvatarWithPlaceholder , ConfirmDialog } from '@baseapp-frontend/design-system'
5
5
6
- import { Box , Button , MenuItem , SelectChangeEvent , Typography } from '@mui/material'
6
+ import { Box , Button , MenuItem , SelectChangeEvent , Typography , useTheme } from '@mui/material'
7
7
import { useFragment } from 'react-relay'
8
8
9
9
import { ProfileItemFragment$key } from '../../../../__generated__/ProfileItemFragment.graphql'
10
10
import { useChangeUserRoleMutation } from '../../graphql/mutations/ChangeUserRole'
11
+ import { useRemoveMemberMutation } from '../../graphql/mutations/RemoveMember'
11
12
import { ProfileItemFragment } from '../../graphql/queries/ProfileItem'
12
- import { MemberRoles , MemberStatuses , roleOptions } from '../constants'
13
+ import { MemberActions , MemberRoles , MemberStatuses , roleOptions } from '../constants'
13
14
import { capitalizeFirstLetter } from '../utils'
14
15
import { MemberItemContainer , MemberPersonalInformation , Select } from './styled'
15
16
import { MemberItemProps } from './types'
@@ -25,12 +26,16 @@ const MemberItem: FC<MemberItemProps> = ({
25
26
userId,
26
27
searchQuery,
27
28
} ) => {
29
+ const theme = useTheme ( )
30
+
28
31
const memberProfile = useFragment < ProfileItemFragment$key > ( ProfileItemFragment , member )
29
32
30
33
const { currentProfile } = useCurrentProfile ( )
31
34
32
35
const [ changeUserRole , isChangingUserRole ] = useChangeUserRoleMutation ( )
36
+ const [ removeMember , isRemovingMember ] = useRemoveMemberMutation ( )
33
37
const [ openConfirmChangeMember , setOpenConfirmChangeMember ] = useState ( false )
38
+ const [ openConfirmRemoveMember , setOpenConfirmRemoveMember ] = useState ( false )
34
39
35
40
if ( ! memberProfile ) return null
36
41
@@ -39,6 +44,25 @@ const MemberItem: FC<MemberItemProps> = ({
39
44
40
45
const haveMemberRoleAndStatus = memberRole && status
41
46
47
+ const removeProfileMember = ( ) => {
48
+ if ( currentProfile ?. id && userId ) {
49
+ removeMember ( {
50
+ variables : { input : { profileId : currentProfile . id , userId } } ,
51
+ } )
52
+ }
53
+ }
54
+
55
+ const confirmRemoveProfileMember = ( ) => {
56
+ if ( currentProfile ?. id && userId ) {
57
+ removeProfileMember ( )
58
+ }
59
+ setOpenConfirmRemoveMember ( false )
60
+ }
61
+
62
+ const handleRemoveMemberDialog = ( ) => {
63
+ setOpenConfirmRemoveMember ( ! openConfirmRemoveMember )
64
+ }
65
+
42
66
const changeRole = ( roleType : MemberRoles ) => {
43
67
if ( currentProfile ?. id && userId ) {
44
68
changeUserRole ( {
@@ -76,16 +100,27 @@ const MemberItem: FC<MemberItemProps> = ({
76
100
< Box >
77
101
< Select
78
102
value = { memberRole }
79
- onChange = { ( event , _ ) =>
80
- handleRoleChange ( event as SelectChangeEvent < { value : MemberRoles } > )
81
- }
103
+ onChange = { ( event , _ ) => {
104
+ const { value } = event . target
105
+ if ( value === MemberActions . remove ) {
106
+ handleRemoveMemberDialog ( )
107
+ } else {
108
+ handleRoleChange ( event as SelectChangeEvent < { value : MemberRoles } > )
109
+ }
110
+ } }
82
111
displayEmpty
83
112
variant = "filled"
84
113
size = "small"
85
- disabled = { isChangingUserRole }
114
+ disabled = { isChangingUserRole || isRemovingMember }
86
115
>
87
116
{ roleOptions . map ( ( { value, label } ) => (
88
- < MenuItem key = { value } value = { value } >
117
+ < MenuItem
118
+ key = { value }
119
+ value = { value }
120
+ sx = { {
121
+ color : value === MemberActions . remove ? theme . palette . error . main : 'inherit' ,
122
+ } }
123
+ >
89
124
{ label }
90
125
</ MenuItem >
91
126
) ) }
@@ -130,6 +165,23 @@ const MemberItem: FC<MemberItemProps> = ({
130
165
}
131
166
cancelText = "Back"
132
167
/>
168
+ < ConfirmDialog
169
+ title = "Remove member"
170
+ open = { openConfirmRemoveMember }
171
+ onClose = { handleRemoveMemberDialog }
172
+ content = {
173
+ < Typography variant = "body1" >
174
+ Are you sure you want to remove this member? This action will revoke their access to the
175
+ organization profile.
176
+ </ Typography >
177
+ }
178
+ cancelText = "Back"
179
+ action = {
180
+ < Button variant = "contained" color = "error" onClick = { confirmRemoveProfileMember } >
181
+ Remove
182
+ </ Button >
183
+ }
184
+ />
133
185
< MemberPersonalInformation isActive = { status === MemberStatuses . active || false } >
134
186
< AvatarWithPlaceholder
135
187
width = { avatarWidth }
0 commit comments