@@ -6,12 +6,12 @@ import styles from './Users.module.scss'
6
6
import Select from '../Select'
7
7
import UserCard from '../UserCard'
8
8
import PrimaryButton from '../Buttons/PrimaryButton'
9
- import Modal from '../Modal'
10
- import SelectUserAutocomplete from '../SelectUserAutocomplete'
11
9
import { PROJECT_ROLES , AUTOCOMPLETE_DEBOUNCE_TIME_MS } from '../../config/constants'
12
10
import { checkAdmin } from '../../util/tc'
13
- import { addUserToProject , removeUserFromProject } from '../../services/projects'
11
+ import { removeUserFromProject } from '../../services/projects'
14
12
import ConfirmationModal from '../Modal/ConfirmationModal'
13
+ import UserAddModalContent from './user-add.modal'
14
+ import InviteUserModalContent from './invite-user.modal' // Import the new component
15
15
16
16
const theme = {
17
17
container : styles . modalContainer
@@ -23,11 +23,7 @@ class Users extends Component {
23
23
this . state = {
24
24
projectOption : null ,
25
25
showAddUserModal : false ,
26
- userToAdd : null ,
27
- userPermissionToAdd : PROJECT_ROLES . READ ,
28
- showSelectUserError : false ,
29
- isAdding : false ,
30
- addUserError : false ,
26
+ showInviteUserModal : false , // Add state for invite user modal
31
27
isRemoving : false ,
32
28
removeError : null ,
33
29
showRemoveConfirmationModal : false ,
@@ -36,10 +32,9 @@ class Users extends Component {
36
32
}
37
33
this . setProjectOption = this . setProjectOption . bind ( this )
38
34
this . onAddUserClick = this . onAddUserClick . bind ( this )
35
+ this . onInviteUserClick = this . onInviteUserClick . bind ( this ) // Bind the new method
39
36
this . resetAddUserState = this . resetAddUserState . bind ( this )
40
- this . onUpdateUserToAdd = this . onUpdateUserToAdd . bind ( this )
41
- this . onAddUserConfirmClick = this . onAddUserConfirmClick . bind ( this )
42
- this . updatePermission = this . updatePermission . bind ( this )
37
+ this . resetInviteUserState = this . resetInviteUserState . bind ( this ) // Bind reset method
43
38
this . onRemoveClick = this . onRemoveClick . bind ( this )
44
39
this . resetRemoveUserState = this . resetRemoveUserState . bind ( this )
45
40
this . onRemoveConfirmClick = this . onRemoveConfirmClick . bind ( this )
@@ -54,78 +49,24 @@ class Users extends Component {
54
49
loadProject ( projectOption . value , false )
55
50
}
56
51
57
- updatePermission ( newRole ) {
58
- this . setState ( {
59
- userPermissionToAdd : newRole
60
- } )
61
- }
62
-
63
52
onAddUserClick ( ) {
64
53
this . setState ( {
65
54
showAddUserModal : true
66
55
} )
67
56
}
68
57
69
- resetAddUserState ( ) {
58
+ onInviteUserClick ( ) {
70
59
this . setState ( {
71
- userToAdd : null ,
72
- showSelectUserError : false ,
73
- isAdding : false ,
74
- showAddUserModal : false ,
75
- userPermissionToAdd : PROJECT_ROLES . READ ,
76
- addUserError : null
60
+ showInviteUserModal : true
77
61
} )
78
62
}
79
63
80
- onUpdateUserToAdd ( option ) {
81
- let userToAdd = null
82
- if ( option && option . value ) {
83
- userToAdd = {
84
- handle : option . label ,
85
- userId : parseInt ( option . value , 10 )
86
- }
87
- }
88
-
89
- this . setState ( {
90
- userToAdd,
91
- showSelectUserError : ! userToAdd
92
- } )
64
+ resetAddUserState ( ) {
65
+ this . setState ( { showAddUserModal : false } )
93
66
}
94
67
95
- async onAddUserConfirmClick ( ) {
96
- const { addNewProjectMember } = this . props
97
- if ( this . state . isAdding ) { return }
98
-
99
- this . setState ( {
100
- showSelectUserError : false ,
101
- addUserError : null
102
- } )
103
-
104
- if ( ! this . state . userToAdd ) {
105
- this . setState ( {
106
- showSelectUserError : true
107
- } )
108
- return
109
- }
110
-
111
- this . setState ( {
112
- isAdding : true
113
- } )
114
-
115
- try {
116
- const newUserInfo = await addUserToProject ( this . state . projectOption . value , this . state . userToAdd . userId , this . state . userPermissionToAdd )
117
- newUserInfo . handle = this . state . userToAdd . handle
118
- // wait for a second so that project's members are updated
119
- addNewProjectMember ( newUserInfo )
120
- this . resetAddUserState ( )
121
- } catch ( e ) {
122
- const error = _ . get (
123
- e ,
124
- 'response.data.message' ,
125
- `Unable to add user`
126
- )
127
- this . setState ( { isAdding : false , addUserError : error } )
128
- }
68
+ resetInviteUserState ( ) {
69
+ this . setState ( { showInviteUserModal : false } )
129
70
}
130
71
131
72
getHandle ( ) {
@@ -260,133 +201,28 @@ class Users extends Component {
260
201
text = { 'Add User' }
261
202
type = { 'info' }
262
203
onClick = { ( ) => this . onAddUserClick ( ) } />
204
+ < PrimaryButton
205
+ text = { 'Invite User' }
206
+ type = { 'info' }
207
+ onClick = { ( ) => this . onInviteUserClick ( ) } />
263
208
</ div >
264
209
)
265
210
}
266
211
{
267
212
this . state . showAddUserModal && (
268
- < Modal theme = { theme } onCancel = { ( ) => this . resetAddUserState ( ) } >
269
- < div className = { cn ( styles . contentContainer , styles . confirm ) } >
270
- < div className = { styles . title } > Add User</ div >
271
- < div className = { styles . addUserContentContainer } >
272
- < div className = { styles . row } >
273
- < div className = { cn ( styles . field , styles . col1 , styles . addUserTitle ) } >
274
- Member< span className = { styles . required } > *</ span > :
275
- </ div >
276
- < div className = { cn ( styles . field , styles . col2 ) } >
277
- < SelectUserAutocomplete
278
- value = { this . state . userToAdd ? { label : this . state . userToAdd . handle , value : this . state . userToAdd . userId . toString ( ) } : null }
279
- onChange = { this . onUpdateUserToAdd }
280
- />
281
- </ div >
282
- </ div >
283
- {
284
- this . state . showSelectUserError && (
285
- < div className = { styles . row } >
286
- < div className = { styles . errorMesssage } > Please select a member.</ div >
287
- </ div >
288
- )
289
- }
290
- < div className = { styles . row } >
291
- < div className = { cn ( styles . field , styles . col1 , styles . addUserTitle ) } >
292
- < label htmlFor = 'memberToAdd' > Role :</ label >
293
- </ div >
294
- < div className = { cn ( styles . col5 ) } >
295
- < div className = { styles . tcRadioButton } >
296
- < input
297
- name = { `add-user-radio` }
298
- type = 'radio'
299
- id = { `read-add-user` }
300
- checked = { this . state . userPermissionToAdd === PROJECT_ROLES . READ }
301
- onChange = { ( e ) => e . target . checked && this . updatePermission ( PROJECT_ROLES . READ ) }
302
- />
303
- < label htmlFor = { `read-add-user` } >
304
- < div >
305
- Read
306
- </ div >
307
- < input type = 'hidden' />
308
- </ label >
309
- </ div >
310
- </ div >
311
- < div className = { cn ( styles . col5 ) } >
312
- < div className = { styles . tcRadioButton } >
313
- < input
314
- name = { `add-user-radio` }
315
- type = 'radio'
316
- id = { `write-add-user` }
317
- checked = { this . state . userPermissionToAdd === PROJECT_ROLES . WRITE }
318
- onChange = { ( e ) => e . target . checked && this . updatePermission ( PROJECT_ROLES . WRITE ) }
319
- />
320
- < label htmlFor = { `write-add-user` } >
321
- < div >
322
- Write
323
- </ div >
324
- < input type = 'hidden' />
325
- </ label >
326
- </ div >
327
- </ div >
328
- < div className = { cn ( styles . col5 ) } >
329
- < div className = { styles . tcRadioButton } >
330
- < input
331
- name = { `add-user-radio` }
332
- type = 'radio'
333
- id = { `full-access-add-user` }
334
- checked = { this . state . userPermissionToAdd === PROJECT_ROLES . MANAGER }
335
- onChange = { ( e ) => e . target . checked && this . updatePermission ( PROJECT_ROLES . MANAGER ) }
336
- />
337
- < label htmlFor = { `full-access-add-user` } >
338
- < div >
339
- Full Access
340
- </ div >
341
- < input type = 'hidden' />
342
- </ label >
343
- </ div >
344
- </ div >
345
- < div className = { cn ( styles . col5 ) } >
346
- < div className = { styles . tcRadioButton } >
347
- < input
348
- name = { `add-user-radio` }
349
- type = 'radio'
350
- id = { `copilot-add-user` }
351
- checked = { this . state . userPermissionToAdd === PROJECT_ROLES . COPILOT }
352
- onChange = { ( e ) => e . target . checked && this . updatePermission ( PROJECT_ROLES . COPILOT ) }
353
- />
354
- < label htmlFor = { `copilot-add-user` } >
355
- < div >
356
- Copilot
357
- </ div >
358
- < input type = 'hidden' />
359
- </ label >
360
- </ div >
361
- </ div >
362
- </ div >
363
- {
364
- this . state . addUserError && (
365
- < div className = { styles . errorMesssage } >
366
- { this . state . addUserError }
367
- </ div >
368
- )
369
- }
370
- </ div >
371
-
372
- < div className = { styles . buttonGroup } >
373
- < div className = { styles . buttonSizeA } >
374
- < PrimaryButton
375
- text = { 'Close' }
376
- type = { 'info' }
377
- onClick = { ( ) => this . resetAddUserState ( ) }
378
- />
379
- </ div >
380
- < div className = { styles . buttonSizeA } >
381
- < PrimaryButton
382
- text = { this . state . isAdding ? 'Adding user...' : 'Add User' }
383
- type = { 'info' }
384
- onClick = { ( ) => this . onAddUserConfirmClick ( ) }
385
- />
386
- </ div >
387
- </ div >
388
- </ div >
389
- </ Modal >
213
+ < UserAddModalContent
214
+ projectId = { this . state . projectOption . value }
215
+ addNewProjectMember = { this . props . addNewProjectMember }
216
+ onClose = { this . resetAddUserState }
217
+ />
218
+ )
219
+ }
220
+ {
221
+ this . state . showInviteUserModal && (
222
+ < InviteUserModalContent
223
+ projectId = { this . state . projectOption . value }
224
+ onClose = { this . resetInviteUserState }
225
+ />
390
226
)
391
227
}
392
228
{
0 commit comments