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' ;
33
44/**
55 * Custom hook that returns a boolean value if the user can access the specified route path,
@@ -17,50 +17,55 @@ export const useRole = (
1717) => {
1818 const ctx = useContext ( RouterContext ) ;
1919 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!` ) ;
2321 }
24- const [ userHasRequiredRole , setUserHasRequiredRole ] = useState ( false ) ;
2522 const { userRole } = ctx ;
2623
24+ const [ userHasRequiredRole , setUserHasRequiredRole ] = useState ( ( ) =>
25+ checkRole ( path , routeRoles , userRole , allRolesRequired ) ,
26+ ) ;
27+
2728 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+ } ;
3935
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 ;
5759 }
60+ /** user must have at least one role */
61+ const hasAtLeastOneRole = userRole . some ( ( r ) => routeRoles . includes ( r ) ) ;
62+ return hasAtLeastOneRole ;
5863 }
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 ;
6267 }
63- } , [ userRole , routeRoles ] ) ;
64-
65- return [ userHasRequiredRole ] ;
68+ }
69+ /** the route has no roles */
70+ return true ;
6671} ;
0 commit comments