1
1
import { Sidebar , Dropdown } from '@rocket.chat/fuselage' ;
2
2
import { useMutableCallback } from '@rocket.chat/fuselage-hooks' ;
3
+ import { usePermission , useAtLeastOnePermission } from '@rocket.chat/ui-contexts' ;
3
4
import type { HTMLAttributes , VFC } from 'react' ;
4
- import React , { useRef } from 'react' ;
5
+ import React , { useCallback , useRef } from 'react' ;
5
6
import { createPortal } from 'react-dom' ;
6
7
7
8
import { AccountBox } from '../../../../app/ui-utils/client' ;
9
+ import type { IAppAccountBoxItem , AccountBoxItem } from '../../../../app/ui-utils/client/lib/AccountBox' ;
10
+ import { isAppAccountBoxItem } from '../../../../app/ui-utils/client/lib/AccountBox' ;
11
+ import { useHasLicenseModule } from '../../../../ee/client/hooks/useHasLicenseModule' ;
8
12
import AdministrationList from '../../../components/AdministrationList/AdministrationList' ;
13
+ import AdministrationModelList from '../../../components/AdministrationList/AdministrationModelList' ;
14
+ import AppsModelList from '../../../components/AdministrationList/AppsModelList' ;
15
+ import AuditModelList from '../../../components/AdministrationList/AuditModelList' ;
9
16
import { useReactiveValue } from '../../../hooks/useReactiveValue' ;
10
17
import { useDropdownVisibility } from '../hooks/useDropdownVisibility' ;
11
18
19
+ const ADMIN_PERMISSIONS = [
20
+ 'view-statistics' ,
21
+ 'run-import' ,
22
+ 'view-user-administration' ,
23
+ 'view-room-administration' ,
24
+ 'create-invite-links' ,
25
+ 'manage-cloud' ,
26
+ 'view-logs' ,
27
+ 'manage-sounds' ,
28
+ 'view-federation-data' ,
29
+ 'manage-email-inbox' ,
30
+ 'manage-emoji' ,
31
+ 'manage-outgoing-integrations' ,
32
+ 'manage-own-outgoing-integrations' ,
33
+ 'manage-incoming-integrations' ,
34
+ 'manage-own-incoming-integrations' ,
35
+ 'manage-oauth-apps' ,
36
+ 'access-mailer' ,
37
+ 'manage-user-status' ,
38
+ 'access-permissions' ,
39
+ 'access-setting-permissions' ,
40
+ 'view-privileged-setting' ,
41
+ 'edit-privileged-setting' ,
42
+ 'manage-selected-settings' ,
43
+ 'view-engagement-dashboard' ,
44
+ 'view-moderation-console' ,
45
+ ] ;
46
+
12
47
const Administration : VFC < Omit < HTMLAttributes < HTMLElement > , 'is' > > = ( props ) => {
13
48
const reference = useRef ( null ) ;
14
49
const target = useRef ( null ) ;
@@ -18,13 +53,46 @@ const Administration: VFC<Omit<HTMLAttributes<HTMLElement>, 'is'>> = (props) =>
18
53
const getAccountBoxItems = useMutableCallback ( ( ) => AccountBox . getItems ( ) ) ;
19
54
const accountBoxItems = useReactiveValue ( getAccountBoxItems ) ;
20
55
56
+ const hasAuditLicense = useHasLicenseModule ( 'auditing' ) === true ;
57
+ const hasManageAppsPermission = usePermission ( 'manage-apps' ) ;
58
+ const hasAccessMarketplacePermission = usePermission ( 'access-marketplace' ) ;
59
+ const hasAdminPermission = useAtLeastOnePermission ( ADMIN_PERMISSIONS ) ;
60
+ const hasAuditPermission = usePermission ( 'can-audit' ) && hasAuditLicense ;
61
+ const hasAuditLogPermission = usePermission ( 'can-audit-log' ) && hasAuditLicense ;
62
+
63
+ const appBoxItems = accountBoxItems . filter ( ( item ) : item is IAppAccountBoxItem => isAppAccountBoxItem ( item ) ) ;
64
+ const adminBoxItems = accountBoxItems . filter ( ( item ) : item is AccountBoxItem => ! isAppAccountBoxItem ( item ) ) ;
65
+ const showAdmin = hasAdminPermission || ! ! adminBoxItems . length ;
66
+ const showAudit = hasAuditPermission || hasAuditLogPermission ;
67
+ const showWorkspace = hasAdminPermission ;
68
+ const showApps = hasAccessMarketplacePermission || hasManageAppsPermission || ! ! appBoxItems . length ;
69
+
70
+ const onDismiss = useCallback ( ( ) : void => toggle ( false ) , [ toggle ] ) ;
71
+
72
+ const optionsList = [
73
+ showAdmin && < AdministrationModelList showWorkspace = { showWorkspace } accountBoxItems = { adminBoxItems } onDismiss = { onDismiss } /> ,
74
+ showApps && (
75
+ < AppsModelList
76
+ appBoxItems = { appBoxItems }
77
+ onDismiss = { onDismiss }
78
+ appsManagementAllowed = { hasManageAppsPermission }
79
+ showMarketplace = { hasAccessMarketplacePermission || hasManageAppsPermission }
80
+ />
81
+ ) ,
82
+ showAudit && < AuditModelList showAudit = { hasAuditPermission } showAuditLog = { hasAuditLogPermission } onDismiss = { onDismiss } /> ,
83
+ ] . filter ( Boolean ) ;
84
+
85
+ if ( ! optionsList || optionsList . length === 0 ) {
86
+ return null ;
87
+ }
88
+
21
89
return (
22
90
< >
23
91
< Sidebar . TopBar . Action icon = 'menu' onClick = { ( ) : void => toggle ( ) } { ...props } ref = { reference } />
24
92
{ isVisible &&
25
93
createPortal (
26
94
< Dropdown reference = { reference } ref = { target } >
27
- < AdministrationList accountBoxItems = { accountBoxItems } onDismiss = { ( ) : void => toggle ( false ) } />
95
+ < AdministrationList optionsList = { optionsList } />
28
96
</ Dropdown > ,
29
97
document . body ,
30
98
) }
0 commit comments