@@ -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,28 @@ 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 ( ) ;
250- } )
251- . catch ( ( err ) => {
252- this . stopManageUser ( ) ;
253- // eslint-disable-next-line no-console
254- console . log ( { err } ) ;
255- } ) ;
256- } ;
241+ removeAsAdmin = ( userId ) =>
242+ this . _buttonAction ( ( ) => API . removeAsAdmin ( userId ) , userId , {
243+ isAdmin : false ,
244+ } ) ;
245+
246+ makeAdmin = ( userId ) =>
247+ this . _buttonAction ( ( ) => API . makeAdmin ( userId ) , userId , { isAdmin : true } ) ;
257248
258249 updateVisibleResource = ( itemId , update ) => {
259250 const { visibleResources } = this . state ;
@@ -282,6 +273,62 @@ class Dashboard extends Component {
282273 } ) ;
283274 } ;
284275
276+ _getIconActions = ( details , resource , isSelf ) => {
277+ if ( resource !== 'users' ) return [ ] ;
278+ const suspendReinstateAction = details . isSuspended
279+ ? {
280+ iconClass : 'fas fa-undo' ,
281+ title : 'Reinstate User' ,
282+ testid : 'reinstate' ,
283+ color : 'green' ,
284+ onClick : ( ) => {
285+ this . manageUser ( details , 'reinstateUser' ) ;
286+ } ,
287+ }
288+ : {
289+ iconClass : 'fas fa-ban' ,
290+ title : 'Suspend User' ,
291+ testid : 'suspend' ,
292+ color : 'red' ,
293+ onClick : ( ) => {
294+ this . manageUser ( details , 'suspendUser' ) ;
295+ } ,
296+ } ;
297+
298+ const forceLogoutAction = {
299+ iconClass : 'fas fa-power-off' ,
300+ title : 'Force Logout' ,
301+ testid : 'force-logout' ,
302+ onClick : ( ) => {
303+ this . manageUser ( details , 'logoutUser' ) ;
304+ } ,
305+ } ;
306+
307+ const makeRemoveAdmin = details . isAdmin
308+ ? {
309+ iconClass : 'fas fa-minus' ,
310+ title : 'Remove as Admin' ,
311+ testid : 'remove-as-admin' ,
312+ onClick : ( ) => {
313+ this . manageUser ( details , 'removeAsAdmin' ) ;
314+ } ,
315+ }
316+ : {
317+ iconClass : 'fas fa-plus' ,
318+ title : 'Make into Admin' ,
319+ testid : 'make-as-admin' ,
320+ onClick : ( ) => {
321+ this . manageUser ( details , 'makeAdmin' ) ;
322+ } ,
323+ } ;
324+
325+ const iconActions = [ ] ;
326+ if ( details . socketId && ! details . doForceLogout )
327+ iconActions . push ( forceLogoutAction ) ;
328+ if ( ! isSelf ) iconActions . push ( suspendReinstateAction , makeRemoveAdmin ) ;
329+ return iconActions ;
330+ } ;
331+
285332 render ( ) {
286333 const { match, user } = this . props ;
287334 const {
@@ -315,6 +362,8 @@ class Dashboard extends Component {
315362 logoutUser : `Are you sure you want to manually logout ${ username } ?` ,
316363 reinstateUser : `Are you sure you want to reinstate ${ username } ?` ,
317364 suspendUser : `Are you sure you want to suspend ${ username } . They will not be able to use VMT until they are reinstated.` ,
365+ removeAsAdmin : `Are you sure you want to remove ${ username } as an Admin?` ,
366+ makeAdmin : `Are you sure you want to give ${ username } Admin privileges?` ,
318367 } ;
319368 manageUserPrompt = actionMessageHash [ manageUserAction ] ;
320369 }
@@ -340,6 +389,7 @@ class Dashboard extends Component {
340389 manageUser = { this . manageUser }
341390 ownUserId = { user . _id }
342391 isLoading = { isLoading }
392+ getIconActions = { this . _getIconActions }
343393 />
344394 < Modal show = { userToManage !== null } closeModal = { this . stopManageUser } >
345395 { manageUserPrompt }
0 commit comments