1
- import { useActor } from "@xstate/react"
1
+ import { useActor , useSelector } from "@xstate/react"
2
2
import React , { useContext , useEffect } from "react"
3
3
import { useNavigate } from "react-router"
4
4
import { ConfirmDialog } from "../../components/ConfirmDialog/ConfirmDialog"
5
5
import { ResetPasswordDialog } from "../../components/ResetPasswordDialog/ResetPasswordDialog"
6
+ import { selectPermissions } from "../../xServices/auth/authSelectors"
6
7
import { XServiceContext } from "../../xServices/StateContext"
7
8
import { UsersPageView } from "./UsersPageView"
8
9
@@ -12,39 +13,38 @@ export const Language = {
12
13
suspendDialogMessagePrefix :"Do you want to suspend the user" ,
13
14
}
14
15
15
- const useRoles = ( ) => {
16
- const xServices = useContext ( XServiceContext )
17
- const [ rolesState , rolesSend ] = useActor ( xServices . siteRolesXService )
18
- const { roles} = rolesState . context
19
-
20
- /**
21
- * Fetch roles on component mount
22
- */
23
- useEffect ( ( ) => {
24
- rolesSend ( {
25
- type :"GET_ROLES" ,
26
- } )
27
- } , [ rolesSend ] )
28
-
29
- return roles
30
- }
31
-
32
16
export const UsersPage :React . FC = ( ) => {
33
17
const xServices = useContext ( XServiceContext )
34
18
const [ usersState , usersSend ] = useActor ( xServices . usersXService )
19
+ const [ rolesState , rolesSend ] = useActor ( xServices . siteRolesXService )
35
20
const { users, getUsersError, userIdToSuspend, userIdToResetPassword, newUserPassword} = usersState . context
36
21
const navigate = useNavigate ( )
37
22
const userToBeSuspended = users ?. find ( ( u ) => u . id === userIdToSuspend )
38
23
const userToResetPassword = users ?. find ( ( u ) => u . id === userIdToResetPassword )
39
- const roles = useRoles ( )
24
+ const permissions = useSelector ( xServices . authXService , selectPermissions )
25
+ const canEditUsers = permissions && permissions . updateUsers
26
+ const { roles} = rolesState . context
27
+ // Is loading if
28
+ // - permissions are not loaded or
29
+ // - users are not loaded or
30
+ // - the user can edit the users but the roles are not loaded yet
31
+ const isLoading = ! permissions || ! users || ( canEditUsers && ! roles )
40
32
41
- /**
42
- * Fetch users on component mount
43
- */
33
+ // Fetch users on component mount
44
34
useEffect ( ( ) => {
45
35
usersSend ( "GET_USERS" )
46
36
} , [ usersSend ] )
47
37
38
+ // Fetch roles on component mount
39
+ useEffect ( ( ) => {
40
+ // Only fetch the roles if the user has permission for it
41
+ if ( canEditUsers ) {
42
+ rolesSend ( {
43
+ type :"GET_ROLES" ,
44
+ } )
45
+ }
46
+ } , [ canEditUsers , rolesSend ] )
47
+
48
48
return (
49
49
< >
50
50
< UsersPageView
@@ -68,6 +68,8 @@ export const UsersPage: React.FC = () => {
68
68
} }
69
69
error = { getUsersError }
70
70
isUpdatingUserRoles = { usersState . matches ( "updatingUserRoles" ) }
71
+ isLoading = { isLoading }
72
+ canEditUsers = { canEditUsers }
71
73
/>
72
74
73
75
< ConfirmDialog