1
1
import React , {
2
- createContext , ReactChild , useContext , useState , useEffect , useMemo ,
2
+ createContext , ReactChild , useState , useEffect , useMemo , useContext ,
3
3
} from 'react' ;
4
- import SecurityContext from '@/context/SecurityContext' ;
5
-
6
4
import { checkAccess , ALL_ROLES } from '@/utils/checkAccess' ;
5
+ import { useSecurity } from '@/hooks/useSecurity' ;
7
6
import ResourceContextType from './types' ;
7
+ import ReportContext from '../ReportContext' ;
8
8
9
9
const GERMLINE_ACCESS = [ 'admin' , 'analyst' , 'bioinformatician' , 'projects' , 'manager' ] ;
10
10
const GERMLINE_BLOCK = ALL_ROLES ;
@@ -13,42 +13,57 @@ const REPORTS_BLOCK = [];
13
13
const ADMIN_ACCESS = [ 'admin' ] ;
14
14
const ADMIN_BLOCK = ALL_ROLES ;
15
15
16
- type UseResourcesReturnType = {
17
- germlineAccess : boolean ;
18
- reportsAccess : boolean ;
19
- adminAccess : boolean ;
20
- reportSettingAccess : boolean ;
21
- } ;
22
-
23
- const useResources = ( ) : UseResourcesReturnType => {
24
- const { userDetails } = useContext ( SecurityContext ) ;
16
+ const useResources = ( ) : ResourceContextType => {
17
+ const { userDetails : { groups, ident : userIdent } } = useSecurity ( ) ;
18
+ const { report } = useContext ( ReportContext ) ;
25
19
26
20
const [ germlineAccess , setGermlineAccess ] = useState ( false ) ;
27
21
const [ reportsAccess , setReportsAccess ] = useState ( false ) ;
22
+ const [ reportEditAccess , setReportEditAccess ] = useState ( false ) ;
28
23
const [ adminAccess , setAdminAccess ] = useState ( false ) ;
29
24
const [ reportSettingAccess , setReportSettingAccess ] = useState ( false ) ;
30
25
26
+ // Check user group first to see which resources they can access
31
27
useEffect ( ( ) => {
32
- if ( userDetails ?. groups ) {
33
- if ( checkAccess ( userDetails . groups , GERMLINE_ACCESS , GERMLINE_BLOCK ) ) {
28
+ if ( groups ) {
29
+ if ( checkAccess ( groups , GERMLINE_ACCESS , GERMLINE_BLOCK ) ) {
34
30
setGermlineAccess ( true ) ;
35
31
}
36
32
37
- if ( checkAccess ( userDetails . groups , REPORTS_ACCESS , REPORTS_BLOCK ) ) {
33
+ if ( checkAccess ( groups , REPORTS_ACCESS , REPORTS_BLOCK ) ) {
38
34
setReportsAccess ( true ) ;
39
35
}
40
36
41
- if ( checkAccess ( userDetails . groups , ADMIN_ACCESS , ADMIN_BLOCK ) ) {
37
+ if ( checkAccess ( groups , ADMIN_ACCESS , ADMIN_BLOCK ) ) {
42
38
setAdminAccess ( true ) ;
43
39
}
44
- if ( checkAccess ( userDetails . groups , [ ...ADMIN_ACCESS , 'manager' ] , ADMIN_BLOCK ) ) {
40
+
41
+ if ( checkAccess ( groups , [ ...ADMIN_ACCESS , 'manager' ] , ADMIN_BLOCK ) ) {
45
42
setReportSettingAccess ( true ) ;
43
+ setReportEditAccess ( true ) ;
44
+ }
45
+ }
46
+ } , [ groups ] ) ;
47
+
48
+ /**
49
+ * Check report specific permissions if user isn't admin
50
+ */
51
+ useEffect ( ( ) => {
52
+ if ( ! adminAccess ) {
53
+ if ( report && report . users . some ( ( { ident : i } ) => i === userIdent ) ) {
54
+ setReportEditAccess ( true ) ;
55
+ } else {
56
+ setReportEditAccess ( false ) ;
46
57
}
47
58
}
48
- } , [ userDetails ?. groups ] ) ;
59
+ } , [ report , userIdent , adminAccess ] ) ;
49
60
50
61
return {
51
- germlineAccess, reportsAccess, adminAccess, reportSettingAccess,
62
+ germlineAccess,
63
+ reportsAccess,
64
+ adminAccess,
65
+ reportSettingAccess,
66
+ reportEditAccess,
52
67
} ;
53
68
} ;
54
69
@@ -57,6 +72,7 @@ const ResourceContext = createContext<ResourceContextType>({
57
72
reportsAccess : false ,
58
73
adminAccess : false ,
59
74
reportSettingAccess : false ,
75
+ reportEditAccess : false ,
60
76
} ) ;
61
77
62
78
type ResourceContextProviderProps = {
@@ -65,19 +81,21 @@ type ResourceContextProviderProps = {
65
81
66
82
const ResourceContextProvider = ( { children } : ResourceContextProviderProps ) : JSX . Element => {
67
83
const {
68
- germlineAccess, reportsAccess, adminAccess, reportSettingAccess,
84
+ germlineAccess, reportsAccess, adminAccess, reportSettingAccess, reportEditAccess ,
69
85
} = useResources ( ) ;
70
86
71
87
const providerValue = useMemo ( ( ) => ( {
72
88
germlineAccess,
73
89
reportsAccess,
74
90
adminAccess,
75
91
reportSettingAccess,
92
+ reportEditAccess,
76
93
} ) , [
77
94
germlineAccess ,
78
95
reportsAccess ,
79
96
adminAccess ,
80
97
reportSettingAccess ,
98
+ reportEditAccess ,
81
99
] ) ;
82
100
83
101
return (
0 commit comments