11import { useEffect , useMemo , useState } from 'react' ;
22import { useNavigate , useParams } from 'react-router-dom' ;
33import { useIntl } from '@edx/frontend-platform/i18n' ;
4+ import { logError } from '@edx/frontend-platform/logging' ;
45import { Container } from '@openedx/paragon' ;
56import { ROUTES } from '@src/authz-module/constants' ;
67import { Role } from 'types' ;
7- import { useToastManager } from 'authz-module/libraries-manager/ToastManagerContext' ;
8+ import { useToastManager } from '@src/ authz-module/libraries-manager/ToastManagerContext' ;
89import AuthZLayout from '../components/AuthZLayout' ;
910import { useLibraryAuthZ } from './context' ;
1011import RoleCard from '../components/RoleCard' ;
1112import { AssignNewRoleTrigger } from './components/AssignNewRoleModal' ;
13+ import ConfirmDeletionModal from './components/ConfirmDeletionModal' ;
1214import { useLibrary , useRevokeUserRoles , useTeamMembers } from '../data/hooks' ;
1315import { buildPermissionsByRoleMatrix } from './utils' ;
1416
1517import messages from './messages' ;
16- import ConfirmDeletionModal from './components/ConfirmDeletionModal' ;
1718
1819const LibrariesUserManager = ( ) => {
1920 const intl = useIntl ( ) ;
@@ -22,18 +23,26 @@ const LibrariesUserManager = () => {
2223 const {
2324 libraryId, permissions, roles, resources, canManageTeam,
2425 } = useLibraryAuthZ ( ) ;
26+ const teamMembersPath = `/authz/${ ROUTES . LIBRARIES_TEAM_PATH . replace ( ':libraryId' , libraryId ) } ` ;
27+
28+ useEffect ( ( ) => {
29+ if ( ! canManageTeam ) {
30+ navigate ( teamMembersPath ) ;
31+ }
32+ // eslint-disable-next-line react-hooks/exhaustive-deps
33+ } , [ canManageTeam ] ) ;
34+
2535 const { data : library } = useLibrary ( libraryId ) ;
2636 const { mutate : revokeUserRoles , isPending : isRevokingUserRole } = useRevokeUserRoles ( ) ;
2737 const rootBreadcrumb = intl . formatMessage ( messages [ 'library.authz.breadcrumb.root' ] ) || '' ;
2838 const pageManageTitle = intl . formatMessage ( messages [ 'library.authz.manage.page.title' ] ) ;
29- const teamMembersPath = `/authz/${ ROUTES . LIBRARIES_TEAM_PATH . replace ( ':libraryId' , libraryId ) } ` ;
3039
3140 const [ roleToDelete , setRoleToDelete ] = useState < Role | null > ( null ) ;
3241 const [ showConfirmDeletionModal , setShowConfirmDeletionModal ] = useState ( false ) ;
3342 const { handleShowToast, handleDiscardToast } = useToastManager ( ) ;
3443
35- const { data : teamMembers , isLoading : isLoadingTeamMembers } = useTeamMembers ( libraryId ) ;
36- const user = teamMembers ?. find ( member => member . username === username ) ;
44+ const { data : teamMember , isLoading : isLoadingTeamMember , isFetching : isFetchingMember } = useTeamMembers ( libraryId ) ;
45+ const user = teamMember ?. find ( member => member . username === username ) ;
3746 const userRoles = useMemo ( ( ) => {
3847 const assignedRoles = roles . filter ( role => user ?. roles . includes ( role . role ) )
3948 . map ( role => ( {
@@ -45,6 +54,15 @@ const LibrariesUserManager = () => {
4554 return assignedRoles ;
4655 } , [ roles , user ?. roles , permissions , resources , intl ] ) ;
4756
57+ useEffect ( ( ) => {
58+ if ( ! isFetchingMember ) {
59+ if ( ! isLoadingTeamMember && ! user ?. username ) {
60+ navigate ( teamMembersPath ) ;
61+ }
62+ }
63+ // eslint-disable-next-line react-hooks/exhaustive-deps
64+ } , [ isFetchingMember , isLoadingTeamMember , user ?. username ] ) ;
65+
4866 const handleCloseConfirmDeletionModal = ( ) => {
4967 setRoleToDelete ( null ) ;
5068 setShowConfirmDeletionModal ( false ) ;
@@ -80,21 +98,14 @@ const LibrariesUserManager = () => {
8098 handleCloseConfirmDeletionModal ( ) ;
8199 } ,
82100 onError : ( error ) => {
83- // eslint-disable-next-line no-console
84- console . error ( 'Failed to revoke user role:' , error ) ;
101+ logError ( error ) ;
102+ // eslint-disable-next-line react/no-unstable-nested-components
103+ handleShowToast ( intl . formatMessage ( messages [ 'library.authz.team.default.error.toast.message' ] , { b : chunk => < b > { chunk } </ b > , br : ( ) => < br /> } ) ) ;
85104 handleCloseConfirmDeletionModal ( ) ;
86- // Could add error toast here if needed
87105 } ,
88106 } ) ;
89107 } ;
90108
91- useEffect ( ( ) => {
92- if ( ! isLoadingTeamMembers && ! userRoles . length ) {
93- navigate ( teamMembersPath ) ;
94- }
95- // eslint-disable-next-line react-hooks/exhaustive-deps
96- } , [ userRoles . length ] ) ;
97-
98109 return (
99110 < div className = "authz-libraries" >
100111 < ConfirmDeletionModal
@@ -127,7 +138,7 @@ const LibrariesUserManager = () => {
127138 < Container className = "bg-light-200 p-5" >
128139 { userRoles && userRoles . map ( role => (
129140 < RoleCard
130- key = { `${ role } -${ username } ` }
141+ key = { `${ role . role } -${ username } ` }
131142 title = { role . name }
132143 objectName = { library . title }
133144 description = { role . description }
0 commit comments