浏览代码

feat: Add a new setting to remove individual sharing features from UI (#8660)

* Added new config to enable individual sharing features

* make config values url friendly

* Add new setting to whitelist

* Fixed some linter issues

* Fixed more linter issues

* Fixed merge error

* Check if interfaceConfig is defined

* Only show more numbers link if there is more than one number
master
Steffen Kolmer 4 年前
父节点
当前提交
5d8bf0c1e7
没有帐户链接到提交者的电子邮件

+ 7
- 0
interface_config.js 查看文件

168
     REMOTE_THUMBNAIL_RATIO: 1, // 1:1
168
     REMOTE_THUMBNAIL_RATIO: 1, // 1:1
169
 
169
 
170
     SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar' ],
170
     SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar' ],
171
+
172
+    /**
173
+     * Specify which sharing features should be displayed. If the value is not set
174
+     * all sharing features will be shown. You can set [] to disable all.
175
+     */
176
+    // SHARING_FEATURES: ['email', 'url', 'dial-in', 'embed'],
177
+
171
     SHOW_BRAND_WATERMARK: false,
178
     SHOW_BRAND_WATERMARK: false,
172
 
179
 
173
     /**
180
     /**

+ 1
- 0
react/features/base/config/interfaceConfigWhitelist.js 查看文件

43
     'RECENT_LIST_ENABLED',
43
     'RECENT_LIST_ENABLED',
44
     'REMOTE_THUMBNAIL_RATIO',
44
     'REMOTE_THUMBNAIL_RATIO',
45
     'SETTINGS_SECTIONS',
45
     'SETTINGS_SECTIONS',
46
+    'SHARING_FEATURES',
46
     'SHOW_CHROME_EXTENSION_BANNER',
47
     'SHOW_CHROME_EXTENSION_BANNER',
47
     'SHOW_DEEP_LINKING_IMAGE',
48
     'SHOW_DEEP_LINKING_IMAGE',
48
     'SHOW_POWERED_BY',
49
     'SHOW_POWERED_BY',

+ 3
- 1
react/features/base/premeeting/components/web/PreMeetingScreen.js 查看文件

4
 
4
 
5
 import { AudioSettingsButton, VideoSettingsButton } from '../../../../toolbox/components/web';
5
 import { AudioSettingsButton, VideoSettingsButton } from '../../../../toolbox/components/web';
6
 import { Avatar } from '../../../avatar';
6
 import { Avatar } from '../../../avatar';
7
+import { allowUrlSharing } from '../../functions';
7
 
8
 
8
 import ConnectionStatus from './ConnectionStatus';
9
 import ConnectionStatus from './ConnectionStatus';
9
 import CopyMeetingUrl from './CopyMeetingUrl';
10
 import CopyMeetingUrl from './CopyMeetingUrl';
79
      */
80
      */
80
     render() {
81
     render() {
81
         const { name, showAvatar, showConferenceInfo, title, videoMuted, videoTrack } = this.props;
82
         const { name, showAvatar, showConferenceInfo, title, videoMuted, videoTrack } = this.props;
83
+        const showSharingButton = allowUrlSharing();
82
 
84
 
83
         return (
85
         return (
84
             <div
86
             <div
103
                             <div className = 'title'>
105
                             <div className = 'title'>
104
                                 { title }
106
                                 { title }
105
                             </div>
107
                             </div>
106
-                            <CopyMeetingUrl />
108
+                            {showSharingButton ? <CopyMeetingUrl /> : null}
107
                         </>
109
                         </>
108
                     )}
110
                     )}
109
                     { this.props.children }
111
                     { this.props.children }

+ 13
- 0
react/features/base/premeeting/functions.js 查看文件

4
 
4
 
5
 import { CONNECTION_TYPE } from './constants';
5
 import { CONNECTION_TYPE } from './constants';
6
 
6
 
7
+declare var interfaceConfig: Object;
8
+
7
 const LOSS_AUDIO_THRESHOLDS = [ 0.33, 0.05 ];
9
 const LOSS_AUDIO_THRESHOLDS = [ 0.33, 0.05 ];
8
 const LOSS_VIDEO_THRESHOLDS = [ 0.33, 0.1, 0.05 ];
10
 const LOSS_VIDEO_THRESHOLDS = [ 0.33, 0.1, 0.05 ];
9
 
11
 
211
         connectionDetails: []
213
         connectionDetails: []
212
     };
214
     };
213
 }
215
 }
216
+
217
+/**
218
+ * Returns if url sharing is enabled in interface configuration.
219
+ *
220
+ * @returns {boolean}
221
+ */
222
+export function allowUrlSharing() {
223
+    return typeof interfaceConfig === 'undefined'
224
+        || typeof interfaceConfig.SHARING_FEATURES === 'undefined'
225
+        || (interfaceConfig.SHARING_FEATURES.length && interfaceConfig.SHARING_FEATURES.indexOf('url') > -1);
226
+}

+ 40
- 7
react/features/invite/components/add-people-dialog/web/AddPeopleDialog.js 查看文件

12
 import EmbedMeetingTrigger from '../../../../embed-meeting/components/EmbedMeetingTrigger';
12
 import EmbedMeetingTrigger from '../../../../embed-meeting/components/EmbedMeetingTrigger';
13
 import { getActiveSession } from '../../../../recording';
13
 import { getActiveSession } from '../../../../recording';
14
 import { updateDialInNumbers } from '../../../actions';
14
 import { updateDialInNumbers } from '../../../actions';
15
-import { _getDefaultPhoneNumber, getInviteText, isAddPeopleEnabled, isDialOutEnabled } from '../../../functions';
15
+import {
16
+    _getDefaultPhoneNumber,
17
+    getInviteText,
18
+    isAddPeopleEnabled,
19
+    isDialOutEnabled,
20
+    sharingFeatures,
21
+    isSharingEnabled
22
+} from '../../../functions';
16
 
23
 
17
 import CopyMeetingLinkSection from './CopyMeetingLinkSection';
24
 import CopyMeetingLinkSection from './CopyMeetingLinkSection';
18
 import DialInSection from './DialInSection';
25
 import DialInSection from './DialInSection';
34
      */
41
      */
35
     _embedMeetingVisible: boolean,
42
     _embedMeetingVisible: boolean,
36
 
43
 
44
+    /**
45
+     * Whether or not dial in number should be visible.
46
+     */
47
+    _dialInVisible: boolean,
48
+
49
+    /**
50
+     * Whether or not url sharing button should be visible.
51
+     */
52
+    _urlSharingVisible: boolean,
53
+
54
+    /**
55
+     * Whether or not email sharing features should be visible.
56
+     */
57
+    _emailSharingVisible: boolean,
58
+
37
     /**
59
     /**
38
      * The meeting invitation text.
60
      * The meeting invitation text.
39
      */
61
      */
78
 function AddPeopleDialog({
100
 function AddPeopleDialog({
79
     _dialIn,
101
     _dialIn,
80
     _embedMeetingVisible,
102
     _embedMeetingVisible,
103
+    _dialInVisible,
104
+    _urlSharingVisible,
105
+    _emailSharingVisible,
81
     _invitationText,
106
     _invitationText,
82
     _inviteContactsVisible,
107
     _inviteContactsVisible,
83
     _inviteUrl,
108
     _inviteUrl,
123
             width = { 'small' }>
148
             width = { 'small' }>
124
             <div className = 'invite-more-dialog'>
149
             <div className = 'invite-more-dialog'>
125
                 { _inviteContactsVisible && <InviteContactsSection /> }
150
                 { _inviteContactsVisible && <InviteContactsSection /> }
126
-                <CopyMeetingLinkSection url = { _inviteUrl } />
127
-                <InviteByEmailSection
128
-                    inviteSubject = { inviteSubject }
129
-                    inviteText = { _invitationText } />
151
+                {_urlSharingVisible ? <CopyMeetingLinkSection url = { _inviteUrl } /> : null}
152
+                {
153
+                    _emailSharingVisible
154
+                        ? <InviteByEmailSection
155
+                            inviteSubject = { inviteSubject }
156
+                            inviteText = { _invitationText } />
157
+                        : null
158
+                }
130
                 { _embedMeetingVisible && <EmbedMeetingTrigger /> }
159
                 { _embedMeetingVisible && <EmbedMeetingTrigger /> }
131
                 <div className = 'invite-more-dialog separator' />
160
                 <div className = 'invite-more-dialog separator' />
132
                 {
161
                 {
134
                         && <LiveStreamSection liveStreamViewURL = { _liveStreamViewURL } />
163
                         && <LiveStreamSection liveStreamViewURL = { _liveStreamViewURL } />
135
                 }
164
                 }
136
                 {
165
                 {
137
-                    _dialIn.numbers
166
+                    _phoneNumber
167
+                        && _dialInVisible
138
                         && <DialInSection phoneNumber = { _phoneNumber } />
168
                         && <DialInSection phoneNumber = { _phoneNumber } />
139
                 }
169
                 }
140
             </div>
170
             </div>
163
 
193
 
164
     return {
194
     return {
165
         _dialIn: dialIn,
195
         _dialIn: dialIn,
166
-        _embedMeetingVisible: !isVpaasMeeting(state),
196
+        _embedMeetingVisible: !isVpaasMeeting(state) && isSharingEnabled(sharingFeatures.embed),
197
+        _dialInVisible: isSharingEnabled(sharingFeatures.dialIn),
198
+        _urlSharingVisible: isSharingEnabled(sharingFeatures.url),
199
+        _emailSharingVisible: isSharingEnabled(sharingFeatures.email),
167
         _invitationText: getInviteText({ state,
200
         _invitationText: getInviteText({ state,
168
             phoneNumber,
201
             phoneNumber,
169
             t: ownProps.t }),
202
             t: ownProps.t }),

+ 2
- 2
react/features/invite/components/add-people-dialog/web/DialInSection.js 查看文件

51
             <DialInNumber
51
             <DialInNumber
52
                 conferenceID = { _dialIn.conferenceID }
52
                 conferenceID = { _dialIn.conferenceID }
53
                 phoneNumber = { phoneNumber } />
53
                 phoneNumber = { phoneNumber } />
54
-            <a
54
+            {_dialIn.numbers && _dialIn.numbers.length > 1 ? <a
55
                 className = 'more-numbers'
55
                 className = 'more-numbers'
56
                 href = { _dialInfoPageUrl }
56
                 href = { _dialInfoPageUrl }
57
                 rel = 'noopener noreferrer'
57
                 rel = 'noopener noreferrer'
58
                 target = '_blank'>
58
                 target = '_blank'>
59
                 { t('info.moreNumbers') }
59
                 { t('info.moreNumbers') }
60
-            </a>
60
+            </a> : null}
61
         </div>
61
         </div>
62
     );
62
     );
63
 }
63
 }

+ 19
- 0
react/features/invite/functions.js 查看文件

720
 
720
 
721
     return res.ok ? json : Promise.reject(json);
721
     return res.ok ? json : Promise.reject(json);
722
 }
722
 }
723
+
724
+export const sharingFeatures = {
725
+    email: 'email',
726
+    url: 'url',
727
+    dialIn: 'dial-in',
728
+    embed: 'embed'
729
+};
730
+
731
+/**
732
+ * Returns true if a specific sharing feature is enabled in interface configuration.
733
+ *
734
+ * @param {string} sharingFeature - The sharing feature to check.
735
+ * @returns {boolean}
736
+ */
737
+export function isSharingEnabled(sharingFeature: string) {
738
+    return typeof interfaceConfig === 'undefined'
739
+        || typeof interfaceConfig.SHARING_FEATURES === 'undefined'
740
+        || (interfaceConfig.SHARING_FEATURES.length && interfaceConfig.SHARING_FEATURES.indexOf(sharingFeature) > -1);
741
+}

正在加载...
取消
保存