1
- import { useContext , useEffect , useState } from 'react' ;
2
- import { RouterContext } from " ../context/context" ;
1
+ import { useContext , useEffect , useState } from 'react' ;
2
+ import { RouterContext } from ' ../context/context' ;
3
3
4
4
/**
5
5
* Custom hook that returns a boolean value if the user can access the specified route path,
@@ -17,50 +17,55 @@ export const useRole = (
17
17
) => {
18
18
const ctx = useContext ( RouterContext ) ;
19
19
if ( ! ctx ) {
20
- throw new Error (
21
- `useRole hook must be used inside AppRouter provider!` ,
22
- ) ;
20
+ throw new Error ( `useRole hook must be used inside AppRouter provider!` ) ;
23
21
}
24
- const [ userHasRequiredRole , setUserHasRequiredRole ] = useState ( false ) ;
25
22
const { userRole } = ctx ;
26
23
24
+ const [ userHasRequiredRole , setUserHasRequiredRole ] = useState ( ( ) =>
25
+ checkRole ( path , routeRoles , userRole , allRolesRequired ) ,
26
+ ) ;
27
+
27
28
useEffect ( ( ) => {
28
- /** the route has some roles */
29
- if ( routeRoles && routeRoles . length ) {
30
- if ( ! userRole ) {
31
- /** but user has no role */
32
- const errorMsg = `The path ${ path } has some required roles: ${ JSON . stringify (
33
- routeRoles ,
34
- ) } , but current user does not have a role!`;
35
- console . error ( errorMsg ) ;
36
- // throw new Error(errorMsg);
37
- } else {
38
- /** check against user role/s */
29
+ const canAccess = checkRole ( path , routeRoles , userRole , allRolesRequired ) ;
30
+ if ( canAccess !== userHasRequiredRole ) setUserHasRequiredRole ( canAccess ) ;
31
+ } , [ userRole , routeRoles ] ) ;
32
+
33
+ return [ userHasRequiredRole ] ;
34
+ } ;
39
35
40
- if ( Array . isArray ( userRole ) ) {
41
- /** user has multiple roles */
42
- if ( allRolesRequired ) {
43
- /** and all roles must be required */
44
- const hasAllRoles = routeRoles . every ( ( r ) => userRole . includes ( r ) ) ;
45
- setUserHasRequiredRole ( hasAllRoles ) ;
46
- } else {
47
- /** user must have at least one role */
48
- const hasAtLeastOneRole = userRole . some ( ( r ) =>
49
- routeRoles . includes ( r ) ,
50
- ) ;
51
- setUserHasRequiredRole ( hasAtLeastOneRole ) ;
52
- }
53
- } else {
54
- /** user has a single role */
55
- const roleIsIncluded = routeRoles . includes ( userRole ) ;
56
- setUserHasRequiredRole ( roleIsIncluded ) ;
36
+ const checkRole = (
37
+ path : string ,
38
+ routeRoles ?: string [ ] ,
39
+ userRole ?: string [ ] | string ,
40
+ allRolesRequired ?: boolean ,
41
+ ) : boolean => {
42
+ /** the route has some roles */
43
+ if ( routeRoles && routeRoles . length ) {
44
+ if ( ! userRole ) {
45
+ /** but user has no role */
46
+ const errorMsg = `The path ${ path } has some required roles: ${ JSON . stringify (
47
+ routeRoles ,
48
+ ) } , but current user does not have a role!`;
49
+ console . error ( errorMsg ) ;
50
+ // throw new Error(errorMsg);
51
+ } else {
52
+ /** check against user role/s */
53
+ if ( Array . isArray ( userRole ) ) {
54
+ /** user has multiple roles */
55
+ if ( allRolesRequired ) {
56
+ /** and all roles must be required */
57
+ const hasAllRoles = routeRoles . every ( ( r ) => userRole . includes ( r ) ) ;
58
+ return hasAllRoles ;
57
59
}
60
+ /** user must have at least one role */
61
+ const hasAtLeastOneRole = userRole . some ( ( r ) => routeRoles . includes ( r ) ) ;
62
+ return hasAtLeastOneRole ;
58
63
}
59
- } else {
60
- /** the route has no roles */
61
- setUserHasRequiredRole ( true ) ;
64
+ /** user has a single role */
65
+ const roleIsIncluded = routeRoles . includes ( userRole ) ;
66
+ return roleIsIncluded ;
62
67
}
63
- } , [ userRole , routeRoles ] ) ;
64
-
65
- return [ userHasRequiredRole ] ;
68
+ }
69
+ /** the route has no roles */
70
+ return true ;
66
71
} ;
0 commit comments