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 , Skeleton } 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,6 +23,15 @@ 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' ] ) || '' ;
@@ -39,11 +49,9 @@ const LibrariesUserManager = () => {
3949 const [ showConfirmDeletionModal , setShowConfirmDeletionModal ] = useState ( false ) ;
4050 const { handleShowToast, handleDiscardToast } = useToastManager ( ) ;
4151
42- const { data : teamMember , isLoading : isLoadingTeamMember } = useTeamMembers ( libraryId , querySettings ) ;
52+ const { data : teamMember , isLoading : isLoadingTeamMember , isFetching : isFetchingMember } = useTeamMembers ( libraryId , querySettings ) ;
4353 const user = teamMember ?. results ?. find ( member => member . username === username ) ;
4454
45- const teamMembersPath = `/authz/${ ROUTES . LIBRARIES_TEAM_PATH . replace ( ':libraryId' , libraryId ) } ` ;
46-
4755 const userRoles = useMemo ( ( ) => {
4856 const assignedRoles = roles . filter ( role => user ?. roles . includes ( role . role ) )
4957 . map ( role => ( {
@@ -55,6 +63,15 @@ const LibrariesUserManager = () => {
5563 return assignedRoles ;
5664 } , [ roles , user ?. roles , permissions , resources , intl ] ) ;
5765
66+ useEffect ( ( ) => {
67+ if ( ! isFetchingMember ) {
68+ if ( ! isLoadingTeamMember && ! user ?. username ) {
69+ navigate ( teamMembersPath ) ;
70+ }
71+ }
72+ // eslint-disable-next-line react-hooks/exhaustive-deps
73+ } , [ isFetchingMember , isLoadingTeamMember , user ?. username ] ) ;
74+
5875 const handleCloseConfirmDeletionModal = ( ) => {
5976 setRoleToDelete ( null ) ;
6077 setShowConfirmDeletionModal ( false ) ;
@@ -90,10 +107,10 @@ const LibrariesUserManager = () => {
90107 handleCloseConfirmDeletionModal ( ) ;
91108 } ,
92109 onError : ( error ) => {
93- // eslint-disable-next-line no-console
94- console . error ( 'Failed to revoke user role:' , error ) ;
110+ logError ( error ) ;
111+ // eslint-disable-next-line react/no-unstable-nested-components
112+ handleShowToast ( intl . formatMessage ( messages [ 'library.authz.team.default.error.toast.message' ] , { b : chunk => < b > { chunk } </ b > , br : ( ) => < br /> } ) ) ;
95113 handleCloseConfirmDeletionModal ( ) ;
96- // Could add error toast here if needed
97114 } ,
98115 } ) ;
99116 } ;
0 commit comments