@@ -204,13 +204,15 @@ class Dashboard extends Component {
204204 this . setQueryParams ( filters ) ;
205205 } ;
206206
207- logoutUser = ( userId ) => {
208- return API . revokeRefreshToken ( userId )
207+ _buttonAction = ( apiAction , userId , update ) => {
208+ return apiAction ( )
209209 . then ( ( res ) => {
210- const { user } = res . data ;
210+ const { user, username } = res . data ;
211211
212- if ( user ) {
213- this . updateVisibleResource ( userId , { socketId : null } ) ;
212+ // API actions return different values if successful,
213+ // so allow for a couple of possibilities.
214+ if ( user || username ) {
215+ this . updateVisibleResource ( userId , update ) ;
214216 }
215217 this . stopManageUser ( ) ;
216218 } )
@@ -221,39 +223,32 @@ class Dashboard extends Component {
221223 } ) ;
222224 } ;
223225
224- suspendUser = ( userId ) => {
225- return API . suspendUser ( userId )
226- . then ( ( res ) => {
227- const { user } = res . data ;
226+ logoutUser = ( userId ) =>
227+ this . _buttonAction ( ( ) => API . revokeRefreshToken ( userId ) , userId , {
228+ socketId : null ,
229+ } ) ;
228230
229- if ( user ) {
230- this . updateVisibleResource ( userId , { isSuspended : true } ) ;
231- }
232- this . stopManageUser ( ) ;
233- } )
234- . catch ( ( err ) => {
235- this . stopManageUser ( ) ;
236- // eslint-disable-next-line no-console
237- console . log ( { err } ) ;
238- } ) ;
239- } ;
231+ suspendUser = ( userId ) =>
232+ this . _buttonAction ( ( ) => API . suspendUser ( userId ) , userId , {
233+ isSuspended : true ,
234+ } ) ;
240235
241- reinstateUser = ( userId ) => {
242- return API . reinstateUser ( userId )
243- . then ( ( res ) => {
244- const { user } = res . data ;
236+ reinstateUser = ( userId ) =>
237+ this . _buttonAction ( ( ) => API . reinstateUser ( userId ) , userId , {
238+ isSuspended : false ,
239+ } ) ;
245240
246- if ( user ) {
247- this . updateVisibleResource ( userId , { isSuspended : false } ) ;
248- }
249- this . stopManageUser ( ) ;
241+ removeAsAdmin = ( userId ) =>
242+ this . logoutUser ( userId ) . then ( ( ) =>
243+ this . _buttonAction ( ( ) => API . removeAsAdmin ( userId ) , userId , {
244+ isAdmin : false ,
250245 } )
251- . catch ( ( err ) => {
252- this . stopManageUser ( ) ;
253- // eslint-disable-next-line no-console
254- console . log ( { err } ) ;
255- } ) ;
256- } ;
246+ ) ;
247+
248+ makeAdmin = ( userId ) =>
249+ this . logoutUser ( userId ) . then ( ( ) =>
250+ this . _buttonAction ( ( ) => API . makeAdmin ( userId ) , userId , { isAdmin : true } )
251+ ) ;
257252
258253 updateVisibleResource = ( itemId , update ) => {
259254 const { visibleResources } = this . state ;
@@ -282,6 +277,62 @@ class Dashboard extends Component {
282277 } ) ;
283278 } ;
284279
280+ _getIconActions = ( details , resource , isSelf ) => {
281+ if ( resource !== 'users' ) return [ ] ;
282+ const suspendReinstateAction = details . isSuspended
283+ ? {
284+ iconClass : 'fas fa-undo' ,
285+ title : 'Reinstate User' ,
286+ testid : 'reinstate' ,
287+ color : 'green' ,
288+ onClick : ( ) => {
289+ this . manageUser ( details , 'reinstateUser' ) ;
290+ } ,
291+ }
292+ : {
293+ iconClass : 'fas fa-ban' ,
294+ title : 'Suspend User' ,
295+ testid : 'suspend' ,
296+ color : 'red' ,
297+ onClick : ( ) => {
298+ this . manageUser ( details , 'suspendUser' ) ;
299+ } ,
300+ } ;
301+
302+ const forceLogoutAction = {
303+ iconClass : 'fas fa-power-off' ,
304+ title : 'Force Logout' ,
305+ testid : 'force-logout' ,
306+ onClick : ( ) => {
307+ this . manageUser ( details , 'logoutUser' ) ;
308+ } ,
309+ } ;
310+
311+ const makeRemoveAdmin = details . isAdmin
312+ ? {
313+ iconClass : 'fas fa-minus' ,
314+ title : 'Remove as Admin' ,
315+ testid : 'remove-as-admin' ,
316+ onClick : ( ) => {
317+ this . manageUser ( details , 'removeAsAdmin' ) ;
318+ } ,
319+ }
320+ : {
321+ iconClass : 'fas fa-plus' ,
322+ title : 'Make into Admin' ,
323+ testid : 'make-as-admin' ,
324+ onClick : ( ) => {
325+ this . manageUser ( details , 'makeAdmin' ) ;
326+ } ,
327+ } ;
328+
329+ const iconActions = [ ] ;
330+ if ( details . socketId && ! details . doForceLogout )
331+ iconActions . push ( forceLogoutAction ) ;
332+ if ( ! isSelf ) iconActions . push ( suspendReinstateAction , makeRemoveAdmin ) ;
333+ return iconActions ;
334+ } ;
335+
285336 render ( ) {
286337 const { match, user } = this . props ;
287338 const {
@@ -315,6 +366,8 @@ class Dashboard extends Component {
315366 logoutUser : `Are you sure you want to manually logout ${ username } ?` ,
316367 reinstateUser : `Are you sure you want to reinstate ${ username } ?` ,
317368 suspendUser : `Are you sure you want to suspend ${ username } . They will not be able to use VMT until they are reinstated.` ,
369+ removeAsAdmin : `Are you sure you want to remove ${ username } as an Admin?` ,
370+ makeAdmin : `Are you sure you want to give ${ username } Admin privileges?` ,
318371 } ;
319372 manageUserPrompt = actionMessageHash [ manageUserAction ] ;
320373 }
@@ -340,6 +393,7 @@ class Dashboard extends Component {
340393 manageUser = { this . manageUser }
341394 ownUserId = { user . _id }
342395 isLoading = { isLoading }
396+ getIconActions = { this . _getIconActions }
343397 />
344398 < Modal show = { userToManage !== null } closeModal = { this . stopManageUser } >
345399 { manageUserPrompt }
0 commit comments