1- import { useMemo } from 'react' ;
2- import { useParams } from 'react-router-dom' ;
1+ import { useEffect , useMemo } from 'react' ;
2+ import { useNavigate , useParams } from 'react-router-dom' ;
33import { useIntl } from '@edx/frontend-platform/i18n' ;
4- import { Container , Skeleton } from '@openedx/paragon' ;
4+ import { Container } from '@openedx/paragon' ;
55import { ROUTES } from '@src/authz-module/constants' ;
66import AuthZLayout from '../components/AuthZLayout' ;
77import { useLibraryAuthZ } from './context' ;
88import RoleCard from '../components/RoleCard' ;
99import { AssignNewRoleTrigger } from './components/AssignNewRoleModal' ;
10- import { useLibrary , useTeamMembers } from '../data/hooks' ;
10+ import { useLibrary , useRevokeUserRoles , useTeamMembers } from '../data/hooks' ;
1111import { buildPermissionsByRoleMatrix } from './utils' ;
1212
1313import messages from './messages' ;
1414
1515const LibrariesUserManager = ( ) => {
1616 const intl = useIntl ( ) ;
17+ const navigate = useNavigate ( ) ;
1718 const { username } = useParams ( ) ;
1819 const {
1920 libraryId, permissions, roles, resources, canManageTeam,
2021 } = useLibraryAuthZ ( ) ;
2122 const { data : library } = useLibrary ( libraryId ) ;
23+ const { mutate : revokeUserRoles } = useRevokeUserRoles ( ) ;
2224 const rootBreadcrumb = intl . formatMessage ( messages [ 'library.authz.breadcrumb.root' ] ) || '' ;
2325 const pageManageTitle = intl . formatMessage ( messages [ 'library.authz.manage.page.title' ] ) ;
26+ const teamMembersPath = `/authz/${ ROUTES . LIBRARIES_TEAM_PATH . replace ( ':libraryId' , libraryId ) } ` ;
2427
25- const { data : teamMembers , isLoading } = useTeamMembers ( libraryId ) ;
28+ const { data : teamMembers , isLoading : isLoadingTeamMembers } = useTeamMembers ( libraryId ) ;
2629 const user = teamMembers ?. find ( member => member . username === username ) ;
2730 const userRoles = useMemo ( ( ) => {
2831 const assignedRoles = roles . filter ( role => user ?. roles . includes ( role . role ) )
@@ -35,11 +38,30 @@ const LibrariesUserManager = () => {
3538 return assignedRoles ;
3639 } , [ roles , user ?. roles , permissions , resources , intl ] ) ;
3740
41+ const handleRevokeUserRole = ( role : string ) => {
42+ if ( user ) {
43+ const data = {
44+ users : user . username ,
45+ role,
46+ scope : libraryId ,
47+ } ;
48+
49+ revokeUserRoles ( { data } ) ;
50+ }
51+ } ;
52+
53+ useEffect ( ( ) => {
54+ if ( ! isLoadingTeamMembers && ! userRoles . length ) {
55+ navigate ( teamMembersPath ) ;
56+ }
57+ // eslint-disable-next-line react-hooks/exhaustive-deps
58+ } , [ userRoles , libraryId ] ) ;
59+
3860 return (
3961 < div className = "authz-libraries" >
4062 < AuthZLayout
4163 context = { { id : libraryId , title : library . title , org : library . org } }
42- navLinks = { [ { label : rootBreadcrumb } , { label : pageManageTitle , to : `/authz/ ${ ROUTES . LIBRARIES_TEAM_PATH . replace ( ':libraryId' , libraryId ) } ` } ] }
64+ navLinks = { [ { label : rootBreadcrumb } , { label : pageManageTitle , to : teamMembersPath } ] }
4365 activeLabel = { user ?. username || '' }
4466 pageTitle = { user ?. username || '' }
4567 pageSubtitle = { < p > { user ?. email } </ p > }
@@ -52,14 +74,13 @@ const LibrariesUserManager = () => {
5274 : [ ] }
5375 >
5476 < Container className = "bg-light-200 p-5" >
55- { isLoading ? < Skeleton count = { 2 } height = { 200 } /> : null }
5677 { userRoles && userRoles . map ( role => (
5778 < RoleCard
5879 key = { `${ role } -${ username } ` }
5980 title = { role . name }
6081 objectName = { library . title }
6182 description = { role . description }
62- showDelete
83+ handleDelete = { ( ) => handleRevokeUserRole ( role . role ) }
6384 permissions = { role . permissions as any [ ] }
6485 />
6586 ) ) }
0 commit comments