|
@@ -10,6 +10,7 @@ import {
|
10
|
10
|
VIDEO_QUALITY_LEVELS
|
11
|
11
|
} from '../../base/conference';
|
12
|
12
|
import { translate } from '../../base/i18n';
|
|
13
|
+import JitsiMeetJS from '../../base/lib-jitsi-meet';
|
13
|
14
|
|
14
|
15
|
const logger = require('jitsi-meet-logger').getLogger(__filename);
|
15
|
16
|
|
|
@@ -48,6 +49,12 @@ class VideoQualityDialog extends Component {
|
48
|
49
|
*/
|
49
|
50
|
_receiveVideoQuality: PropTypes.number,
|
50
|
51
|
|
|
52
|
+ /**
|
|
53
|
+ * Whether or not displaying video is supported in the current
|
|
54
|
+ * environment. If false, the slider will be disabled.
|
|
55
|
+ */
|
|
56
|
+ _videoSupported: PropTypes.bool,
|
|
57
|
+
|
51
|
58
|
/**
|
52
|
59
|
* Invoked to request toggling of audio only mode.
|
53
|
60
|
*/
|
|
@@ -116,17 +123,26 @@ class VideoQualityDialog extends Component {
|
116
|
123
|
* @returns {ReactElement}
|
117
|
124
|
*/
|
118
|
125
|
render() {
|
119
|
|
- const { _audioOnly, _p2p, t } = this.props;
|
|
126
|
+ const { _audioOnly, _p2p, _videoSupported, t } = this.props;
|
120
|
127
|
const activeSliderOption = this._mapCurrentQualityToSliderValue();
|
121
|
|
- const showP2PWarning = _p2p && !_audioOnly;
|
|
128
|
+
|
|
129
|
+ let classNames = 'video-quality-dialog';
|
|
130
|
+ let warning = null;
|
|
131
|
+
|
|
132
|
+ if (!_videoSupported) {
|
|
133
|
+ classNames += ' video-not-supported';
|
|
134
|
+ warning = this._renderAudioOnlyLockedMessage();
|
|
135
|
+ } else if (_p2p && !_audioOnly) {
|
|
136
|
+ warning = this._renderP2PMessage();
|
|
137
|
+ }
|
122
|
138
|
|
123
|
139
|
return (
|
124
|
|
- <div className = 'video-quality-dialog'>
|
|
140
|
+ <div className = { classNames }>
|
125
|
141
|
<h3 className = 'video-quality-dialog-title'>
|
126
|
142
|
{ t('videoStatus.callQuality') }
|
127
|
143
|
</h3>
|
128
|
|
- <div className = { showP2PWarning ? '' : 'hide-warning' }>
|
129
|
|
- { this._renderP2PMessage() }
|
|
144
|
+ <div className = { warning ? '' : 'hide-warning' }>
|
|
145
|
+ { warning }
|
130
|
146
|
</div>
|
131
|
147
|
<div className = 'video-quality-dialog-contents'>
|
132
|
148
|
<div className = 'video-quality-dialog-slider-container'>
|
|
@@ -136,6 +152,7 @@ class VideoQualityDialog extends Component {
|
136
|
152
|
*/ }
|
137
|
153
|
<input
|
138
|
154
|
className = 'video-quality-dialog-slider'
|
|
155
|
+ disabled = { !_videoSupported }
|
139
|
156
|
max = { this._sliderOptions.length - 1 }
|
140
|
157
|
min = '0'
|
141
|
158
|
onChange = { this._onSliderChange }
|
|
@@ -154,6 +171,24 @@ class VideoQualityDialog extends Component {
|
154
|
171
|
);
|
155
|
172
|
}
|
156
|
173
|
|
|
174
|
+ /**
|
|
175
|
+ * Creates a React Element for notifying that the browser is in audio only
|
|
176
|
+ * and cannot be changed.
|
|
177
|
+ *
|
|
178
|
+ * @private
|
|
179
|
+ * @returns {ReactElement}
|
|
180
|
+ */
|
|
181
|
+ _renderAudioOnlyLockedMessage() {
|
|
182
|
+ const { t } = this.props;
|
|
183
|
+
|
|
184
|
+ return (
|
|
185
|
+ <InlineMessage
|
|
186
|
+ title = { t('videoStatus.onlyAudioAvailable') }>
|
|
187
|
+ { t('videoStatus.onlyAudioSupported') }
|
|
188
|
+ </InlineMessage>
|
|
189
|
+ );
|
|
190
|
+ }
|
|
191
|
+
|
157
|
192
|
/**
|
158
|
193
|
* Creates React Elements for notifying that peer to peer is enabled.
|
159
|
194
|
*
|
|
@@ -330,7 +365,8 @@ function _mapStateToProps(state) {
|
330
|
365
|
return {
|
331
|
366
|
_audioOnly: audioOnly,
|
332
|
367
|
_p2p: p2p,
|
333
|
|
- _receiveVideoQuality: receiveVideoQuality
|
|
368
|
+ _receiveVideoQuality: receiveVideoQuality,
|
|
369
|
+ _videoSupported: JitsiMeetJS.mediaDevices.supportsVideo()
|
334
|
370
|
};
|
335
|
371
|
}
|
336
|
372
|
|