1- import React , { useMemo } from 'react' ;
1+ import React , { useContext , useMemo , useState } from 'react' ;
22import { useIntl } from '@edx/frontend-platform/i18n' ;
3+ import { AppContext } from '@edx/frontend-platform/react' ;
4+ import type { AppContextType } from '@edx/frontend-platform/react' ;
35import debounce from 'lodash.debounce' ;
46import {
57 Container , DataTable ,
@@ -12,19 +14,30 @@ import { useUserAccount } from '@src/data/hooks';
1214import baseMessages from '@src/authz-module/messages' ;
1315import AddRoleButton from '@src/authz-module/components/AddRoleButton' ;
1416import {
15- OrgCell , RoleCell , ScopeCell , PermissionsCell , ViewAllPermissionsCell , ActionsCell ,
17+ OrgCell , RoleCell , ScopeCell , PermissionsCell , ViewAllPermissionsCell ,
18+ createActionsCell ,
1619} from '@src/authz-module/components/TableCells' ;
1720import { useQuerySettings } from '@src/authz-module/hooks/useQuerySettings' ;
18- import { useUserAssignedRoles } from '@src/authz-module/data/hooks' ;
21+ import { useRevokeUserRoles , useUserAssignedRoles } from '@src/authz-module/data/hooks' ;
22+ import { Role } from 'types' ;
23+ import { useToastManager } from 'authz-module/libraries-manager/ToastManagerContext' ;
1924import messages from './messages' ;
25+ import ConfirmDeletionModal from '../components/ConfirmDeletionModal' ;
2026
2127const AuditUserPage = ( ) => {
2228 const { formatMessage } = useIntl ( ) ;
2329 const { username } = useParams ( ) ;
30+ const { authenticatedUser } = useContext ( AppContext ) as AppContextType ;
2431 const navigate = useNavigate ( ) ;
32+ const [ roleToDelete , setRoleToDelete ] = useState < Role | null > ( null ) ;
33+ const [ showConfirmDeletionModal , setShowConfirmDeletionModal ] = useState ( false ) ;
34+ const {
35+ showToast, showErrorToast, Bold, Br,
36+ } = useToastManager ( ) ;
37+ const { mutate : revokeUserRoles , isPending : isRevokingUserRolePending } = useRevokeUserRoles ( ) ;
2538 const { isLoading : isLoadingUser , data : user } = useUserAccount ( username ?? '' ) ;
2639 const { querySettings, handleTableFetch } = useQuerySettings ( ) ;
27- const { data : { results : userAssignments } = { results : [ ] } } = useUserAssignedRoles ( username ?? '' , querySettings ) ;
40+ const { data : { results : userAssignments , count } = { results : [ ] } } = useUserAssignedRoles ( username ?? '' , querySettings ) ;
2841
2942 if ( ! user && ! isLoadingUser ) {
3043 navigate ( AUTHZ_HOME_PATH ) ;
@@ -35,18 +48,7 @@ const AuditUserPage = () => {
3548 to : AUTHZ_HOME_PATH ,
3649 } ,
3750 ] ;
38- const additionalColumns = [
39- {
40- id : 'view_permissions' ,
41- Header : '' ,
42- Cell : ViewAllPermissionsCell ,
43- } ,
44- {
45- id : 'action' ,
46- Header : formatMessage ( messages [ 'authz.user.table.action.column.header' ] ) ,
47- Cell : ActionsCell ,
48- } ,
49- ] ;
51+
5052 const columns = [
5153 {
5254 Header : formatMessage ( messages [ 'authz.user.table.role.column.header' ] ) ,
@@ -75,8 +77,103 @@ const AuditUserPage = () => {
7577
7678 const fetchData = useMemo ( ( ) => debounce ( handleTableFetch , 500 ) , [ handleTableFetch ] ) ;
7779
80+ const handleShowConfirmDeletionModal = ( role : Role ) => {
81+ if ( isRevokingUserRolePending ) { return ; }
82+
83+ setRoleToDelete ( role ) ;
84+ setShowConfirmDeletionModal ( true ) ;
85+ } ;
86+
87+ const handleCloseConfirmDeletionModal = ( ) => {
88+ setRoleToDelete ( null ) ;
89+ setShowConfirmDeletionModal ( false ) ;
90+ } ;
91+
92+ const handleRevokeUserRole = ( ) => {
93+ if ( ! user || ! roleToDelete ) { return ; }
94+
95+ const data = {
96+ users : user . username ,
97+ role : roleToDelete . role ,
98+ scope : roleToDelete . scope ,
99+ } ;
100+
101+ const runRevokeRole = ( variables ) => {
102+ const variablesData = {
103+ data : {
104+ ...variables . data ,
105+ querySettings,
106+ } ,
107+
108+ } ;
109+ revokeUserRoles ( variablesData , {
110+ onSuccess : ( response ) => {
111+ const { errors } = response ;
112+
113+ if ( errors . length ) {
114+ showToast ( {
115+ type : 'error' ,
116+ message : formatMessage (
117+ baseMessages [ 'authz.team.toast.default.error.message' ] ,
118+ { Bold, Br } ,
119+ ) ,
120+ } ) ;
121+ // authzQueryKeys.userRoles(username, querySettings),
122+ return ;
123+ }
124+
125+ const remainingRolesCount = count ? count - 1 : 0 ;
126+ showToast ( {
127+ message : formatMessage (
128+ baseMessages [ 'authz.team.remove.user.toast.success.description' ] ,
129+ {
130+ role : roleToDelete . name ,
131+ rolesCount : remainingRolesCount ,
132+ } ,
133+ ) ,
134+ type : 'success' ,
135+ } ) ;
136+ handleCloseConfirmDeletionModal ( ) ;
137+ } ,
138+ onError : ( error , retryVariables ) => {
139+ showErrorToast ( error , ( ) => runRevokeRole ( retryVariables ) ) ;
140+ } ,
141+ } ) ;
142+ } ;
143+
144+ runRevokeRole ( { data } ) ;
145+ } ;
146+
147+ const additionalColumns = [
148+ {
149+ id : 'view_permissions' ,
150+ Header : '' ,
151+ Cell : ViewAllPermissionsCell ,
152+ } ,
153+ {
154+ id : 'action' ,
155+ Header : formatMessage ( messages [ 'authz.user.table.action.column.header' ] ) ,
156+ Cell : createActionsCell ( {
157+ onClickDeleteButton : handleShowConfirmDeletionModal ,
158+ isUserAuthenticatedPage : username === authenticatedUser . username ,
159+ } ) ,
160+ } ,
161+ ] ;
162+
78163 return (
79164 < div className = "authz-module" >
165+ < ConfirmDeletionModal
166+ isOpen = { showConfirmDeletionModal }
167+ close = { handleCloseConfirmDeletionModal }
168+ onSave = { handleRevokeUserRole }
169+ isDeleting = { isRevokingUserRolePending }
170+ context = { {
171+ userName : user ?. username || '' ,
172+ scope : roleToDelete ?. scope || '' ,
173+ role : roleToDelete ?. name || '' ,
174+ rolesCount : count || 0 ,
175+ } }
176+ />
80177 < AuthZLayout
81178 context = { {
82179 id : '' ,
0 commit comments