trtc-cloud-js-sdk 1.0.13 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +88 -0
- package/.prettierrc +5 -0
- package/CHANGELOG.md +58 -0
- package/build/jsdoc/clean-doc.js +12 -0
- package/build/jsdoc/fix-doc.js +141 -0
- package/build/jsdoc/jsdoc.json +42 -0
- package/build/package-bundle.js +29 -0
- package/build/rollup.config.dev.js +88 -0
- package/build/rollup.config.prod.js +93 -0
- package/build/rollup.js +359 -0
- package/build/template/npm-package/package.json +24 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/base.css +213 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/index.html +80 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/prettify.css +1 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/prettify.js +1 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/sort-arrow-sprite.png +0 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/sorter.js +158 -0
- package/examples/apiExample/.env +2 -0
- package/examples/apiExample/README.md +70 -0
- package/examples/apiExample/package-lock.json +30915 -0
- package/examples/apiExample/package.json +51 -0
- package/examples/apiExample/public/audio.js +195 -0
- package/examples/apiExample/public/audio.js.map +7 -0
- package/examples/apiExample/public/av_processing.js +1 -0
- package/examples/apiExample/public/basic/av_processing.wasm +0 -0
- package/examples/apiExample/public/basic/worker.js +10434 -0
- package/examples/apiExample/public/favicon.ico +0 -0
- package/examples/apiExample/public/index.html +47 -0
- package/examples/apiExample/public/logo192.png +0 -0
- package/examples/apiExample/public/logo512.png +0 -0
- package/examples/apiExample/public/manifest.json +25 -0
- package/examples/apiExample/public/robots.txt +3 -0
- package/examples/apiExample/src/App.css +37 -0
- package/examples/apiExample/src/App.js +25 -0
- package/examples/apiExample/src/api/http.js +127 -0
- package/examples/apiExample/src/api/nav.js +44 -0
- package/examples/apiExample/src/components/BasicInfoComponent.css +16 -0
- package/examples/apiExample/src/components/BasicInfoComponent.js +27 -0
- package/examples/apiExample/src/config/gen-test-user-sig.js +64 -0
- package/examples/apiExample/src/config/lib-generate-test-usersig.min.js +7052 -0
- package/examples/apiExample/src/config/nav.js +136 -0
- package/examples/apiExample/src/home.js +16 -0
- package/examples/apiExample/src/index.css +21 -0
- package/examples/apiExample/src/index.js +12 -0
- package/examples/apiExample/src/logo.svg +1 -0
- package/examples/apiExample/src/page/basic/screen-share/index.css +52 -0
- package/examples/apiExample/src/page/basic/screen-share/index.js +223 -0
- package/examples/apiExample/src/page/basic/setDevice/index.js +262 -0
- package/examples/apiExample/src/page/basic/setDevice/index.scss +93 -0
- package/examples/apiExample/src/page/basic/video-call/index.js +521 -0
- package/examples/apiExample/src/page/basic/video-call/index.scss +93 -0
- package/examples/apiExample/src/page/basic/video-call-init/index.js +382 -0
- package/examples/apiExample/src/page/basic/video-call-init/index.scss +93 -0
- package/examples/apiExample/src/page/basic/video-live/index.css +37 -0
- package/examples/apiExample/src/page/basic/video-live/index.js +188 -0
- package/examples/apiExample/src/page/layout.js +22 -0
- package/examples/apiExample/src/page/layout.scss +76 -0
- package/examples/apiExample/src/utils/utils.js +35 -0
- package/examples/jsExample/assets/css/bootstrap-material-design.css +12169 -0
- package/examples/jsExample/assets/css/bootstrap-material-design.min.css +8 -0
- package/examples/jsExample/assets/css/common.css +48 -0
- package/examples/jsExample/assets/icon/iconfont.js +1 -0
- package/examples/jsExample/assets/js/bootstrap-material-design.js +6939 -0
- package/examples/jsExample/assets/js/bootstrap-material-design.js.map +1 -0
- package/examples/jsExample/assets/js/bootstrap-material-design.min.js +1 -0
- package/examples/jsExample/assets/js/graph.js +695 -0
- package/examples/jsExample/assets/js/jquery-3.2.1.min.js +4 -0
- package/examples/jsExample/assets/js/jquery-3.2.1.slim.min.js +4 -0
- package/examples/jsExample/assets/js/lib-generate-test-usersig.min.js +2 -0
- package/examples/jsExample/assets/js/popper.js +2442 -0
- package/examples/jsExample/index.html +57 -0
- package/examples/jsExample/rtc/css/common.css +82 -0
- package/examples/jsExample/rtc/index.html +107 -0
- package/examples/jsExample/rtc/js/index.js +142 -0
- package/examples/vueDemo/LICENSE +21 -0
- package/examples/vueDemo/README.md +144 -0
- package/examples/vueDemo/README_EN.md +136 -0
- package/examples/vueDemo/av_processing.wasm +0 -0
- package/examples/vueDemo/index.html +23 -0
- package/examples/vueDemo/package-lock.json +1375 -0
- package/examples/vueDemo/package.json +36 -0
- package/examples/vueDemo/src/App.vue +12 -0
- package/examples/vueDemo/src/api/index.js +59 -0
- package/examples/vueDemo/src/assets/css/color-dark.css +28 -0
- package/examples/vueDemo/src/assets/css/icon.css +4 -0
- package/examples/vueDemo/src/assets/css/main.css +177 -0
- package/examples/vueDemo/src/assets/img/img.jpg +0 -0
- package/examples/vueDemo/src/assets/img/login-bg.jpg +0 -0
- package/examples/vueDemo/src/components/Header.vue +172 -0
- package/examples/vueDemo/src/components/Sidebar.vue +117 -0
- package/examples/vueDemo/src/components/Tags.vue +174 -0
- package/examples/vueDemo/src/components/tendency.vue +206 -0
- package/examples/vueDemo/src/components/trtc/main-menu.vue +50 -0
- package/examples/vueDemo/src/components/trtc/nav-bar.vue +53 -0
- package/examples/vueDemo/src/components/trtc/show-screen-capture.vue +118 -0
- package/examples/vueDemo/src/components/trtc/trtc-state-check.vue +117 -0
- package/examples/vueDemo/src/config/gen-test-user-sig.js +67 -0
- package/examples/vueDemo/src/config/lib-generate-test-usersig.min.js +7052 -0
- package/examples/vueDemo/src/main.js +11 -0
- package/examples/vueDemo/src/plugins/element.js +17 -0
- package/examples/vueDemo/src/router/index.js +73 -0
- package/examples/vueDemo/src/store/sidebar.js +17 -0
- package/examples/vueDemo/src/store/tags.js +48 -0
- package/examples/vueDemo/src/utils/i18n.js +24 -0
- package/examples/vueDemo/src/utils/request.js +34 -0
- package/examples/vueDemo/src/utils/utils.js +35 -0
- package/examples/vueDemo/src/views/Home.vue +46 -0
- package/examples/vueDemo/src/views/I18n.vue +40 -0
- package/examples/vueDemo/src/views/Icon.vue +229 -0
- package/examples/vueDemo/src/views/basic/trtc.vue +194 -0
- package/examples/vueDemo/src/views/feature/index.vue +259 -0
- package/examples/vueDemo/src/views/github/index.vue +243 -0
- package/examples/vueDemo/src/views/improve/live-index.vue +256 -0
- package/examples/vueDemo/src/views/improve/live-room-anchor.vue +689 -0
- package/examples/vueDemo/src/views/improve/live-room-audience.vue +383 -0
- package/examples/vueDemo/src/views/sdkAppId/index.vue +284 -0
- package/examples/vueDemo/vite.config.js +18 -0
- package/examples/vueDemo/worker.js +22 -0
- package/karma.conf.js +99 -0
- package/package.json +57 -7
- package/scripts/publish.js +86 -0
- package/src/Camera.ts +80 -0
- package/src/Mic.ts +145 -0
- package/src/common/IError.ts +6 -0
- package/src/common/ITRTCCloud.ts +68 -0
- package/src/common/constants.ts +116 -0
- package/src/common/trtc-code.ts +43 -0
- package/src/common/trtc-define.ts +1007 -0
- package/src/common/trtc-event.ts +29 -0
- package/src/index.ts +1672 -0
- package/src/utils/environment.js +297 -0
- package/src/utils/raf.js +131 -0
- package/src/utils/time.js +22 -0
- package/src/utils/utils.ts +71 -0
- package/src/utils/uuid.js +12 -0
- package/test/unit/env.test.js +25 -0
- package/test/unit/get-user-media.test.js +40 -0
- package/test/unit/ice-parser.test.js +23 -0
- package/test/unit/sdp.test.js +45 -0
- package/test/unit/signal.test.js +78 -0
- package/tsconfig.json +32 -0
- package/trtc-cloud-js-sdk.js +0 -1
- /package/{README.md → build/template/npm-package/README.md} +0 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
import React, { useState, useEffect } from 'react';
|
|
3
|
+
import { Button } from '@material-ui/core';
|
|
4
|
+
import './index.scss';
|
|
5
|
+
import BasicInfoComponent from '../../../components/BasicInfoComponent';
|
|
6
|
+
import TRTCCloud, { TRTCAppScene, TRTCParams, TRTCVideoStreamType } from 'trtc-cloud-js-sdk';
|
|
7
|
+
import genTestUserSig from '../../../config/gen-test-user-sig';
|
|
8
|
+
import { validParams } from '../../../utils/utils';
|
|
9
|
+
const trtcCloud = TRTCCloud.getTRTCShareInstance();
|
|
10
|
+
let preRemoteUserIdList = [];
|
|
11
|
+
|
|
12
|
+
export default function SetDevice() {
|
|
13
|
+
const [userId, setUserId] = useState('TRTCCloud_' + parseInt(Math.random() * 100000));
|
|
14
|
+
const [roomId, setRoomId] = useState(parseInt(Math.random() * 100000) + '');
|
|
15
|
+
const [remoteUserIdList, setRemoteUserIdList] = useState([]);
|
|
16
|
+
const [cameraList, setCameraList] = useState([]);
|
|
17
|
+
const [micList, setMicList] = useState([]);
|
|
18
|
+
const [speakerList, setSpeakerList] = useState([]);
|
|
19
|
+
let info = {};
|
|
20
|
+
let sdkAppId = 0 || info.sdkAppId;
|
|
21
|
+
let userSignature = '';
|
|
22
|
+
const LOG_PREFIX = '[Video Call]';
|
|
23
|
+
|
|
24
|
+
useEffect(async () => {
|
|
25
|
+
console.warn(`${LOG_PREFIX} TRTC version:`, trtcCloud.getSDKVersion());
|
|
26
|
+
subscribeEvents();
|
|
27
|
+
|
|
28
|
+
const tempCameraList = await trtcCloud.getCameraDevicesList();
|
|
29
|
+
const tempMicList = await trtcCloud.getMicDevicesList();
|
|
30
|
+
const tempSpeakerList = await trtcCloud.getSpeakerDevicesList();
|
|
31
|
+
console.warn('==== camera list = ', tempCameraList);
|
|
32
|
+
console.warn('==== mic list = ', tempMicList);
|
|
33
|
+
console.warn('==== speaker list = ', tempSpeakerList);
|
|
34
|
+
|
|
35
|
+
setCameraList(tempCameraList);
|
|
36
|
+
setMicList(tempMicList);
|
|
37
|
+
setSpeakerList(tempSpeakerList);
|
|
38
|
+
}, []);
|
|
39
|
+
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
try {
|
|
42
|
+
remoteUserIdList.forEach(async (userId) => {
|
|
43
|
+
const domElement = document.getElementById(userId);
|
|
44
|
+
await trtcCloud.startRemoteView(userId, domElement, TRTCVideoStreamType.TRTCVideoStreamTypeBig);
|
|
45
|
+
});
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.error(`${LOG_PREFIX} remoteUserIdList useEffect error: ${JSON.stringify(error)}`);
|
|
48
|
+
}
|
|
49
|
+
}, [remoteUserIdList]);
|
|
50
|
+
|
|
51
|
+
// 进房
|
|
52
|
+
const enterRoom = async () => {
|
|
53
|
+
const trtcParams = new TRTCParams();
|
|
54
|
+
trtcParams.userId = userId;
|
|
55
|
+
trtcParams.sdkAppId = sdkAppId;
|
|
56
|
+
trtcParams.userSig = userSignature;
|
|
57
|
+
trtcParams.roomId = +roomId;
|
|
58
|
+
await trtcCloud.enterRoom(trtcParams, TRTCAppScene.TRTCAppSceneVideoCall);
|
|
59
|
+
await startLocalPreview();
|
|
60
|
+
await startLocalAudio();
|
|
61
|
+
};
|
|
62
|
+
// 退房
|
|
63
|
+
const exitRoom = () => {
|
|
64
|
+
setRemoteUserIdList([]);
|
|
65
|
+
preRemoteUserIdList = [];
|
|
66
|
+
stopLocalPreview();
|
|
67
|
+
stopLocalAudio();
|
|
68
|
+
trtcCloud.exitRoom();
|
|
69
|
+
unsubscribeEvents();
|
|
70
|
+
};
|
|
71
|
+
// input 输入框内容改变处理
|
|
72
|
+
const handleInputChange = (event, type) => {
|
|
73
|
+
if (type === 'USERID') {
|
|
74
|
+
setUserId(event.target.value);
|
|
75
|
+
}
|
|
76
|
+
if (type === 'ROOMID') {
|
|
77
|
+
setRoomId(event.target.value);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const handleStart = () => {
|
|
81
|
+
info = genTestUserSig(userId);
|
|
82
|
+
sdkAppId = info.sdkAppId;
|
|
83
|
+
userSignature = info.userSig;
|
|
84
|
+
if (!validParams(userId, +roomId, sdkAppId, userSignature)) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
enterRoom();
|
|
88
|
+
};
|
|
89
|
+
const handleStop = () => exitRoom();
|
|
90
|
+
// 打开本地视频
|
|
91
|
+
const startLocalPreview = async () => {
|
|
92
|
+
const localVideoWrapper = document.getElementById('localVideoWrapper');
|
|
93
|
+
await trtcCloud.startLocalPreview(localVideoWrapper);
|
|
94
|
+
};
|
|
95
|
+
// 关闭本地视频
|
|
96
|
+
const stopLocalPreview = () => trtcCloud.stopLocalPreview();
|
|
97
|
+
// 开启本地音频
|
|
98
|
+
const startLocalAudio = async () => await trtcCloud.startLocalAudio();
|
|
99
|
+
// 关闭本地音频
|
|
100
|
+
const stopLocalAudio = async () => await trtcCloud.stopLocalAudio();
|
|
101
|
+
// 切换设备
|
|
102
|
+
const handleChangeDevice = async (e, type) => {
|
|
103
|
+
const deviceId = e.target.value;
|
|
104
|
+
console.warn(' select device id: ', deviceId);
|
|
105
|
+
if (type === 'CAMERA') {
|
|
106
|
+
await trtcCloud.setCurrentCameraDevice(deviceId);
|
|
107
|
+
} else if (type === 'MIC') {
|
|
108
|
+
let currentMicDevice = trtcCloud.getCurrentMicDevice();
|
|
109
|
+
console.warn(`${LOG_PREFIX} current Mic deviceId before :`, currentMicDevice);
|
|
110
|
+
|
|
111
|
+
await trtcCloud.setCurrentMicDevice(deviceId);
|
|
112
|
+
|
|
113
|
+
currentMicDevice = trtcCloud.getCurrentMicDevice();
|
|
114
|
+
console.warn(`${LOG_PREFIX} current Mic deviceId after :`, currentMicDevice);
|
|
115
|
+
} else if (type === 'SPEAKER') {
|
|
116
|
+
await trtcCloud.setCurrentSpeakerDevice(deviceId);
|
|
117
|
+
console.warn('---- 切换 speaker ');
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
// ============================【所有需要监听事件的回调】============================
|
|
122
|
+
// 错误回调
|
|
123
|
+
const onError = (errCode, errMsg) => {
|
|
124
|
+
console.warn(`${LOG_PREFIX} onError: errCode: ${errCode}, errMsg: ${errMsg}`);
|
|
125
|
+
};
|
|
126
|
+
// 进房回调
|
|
127
|
+
const onEnterRoom = (elapsed) => {
|
|
128
|
+
if (elapsed > 0) {
|
|
129
|
+
console.warn(`${LOG_PREFIX} onEnterRoom: elapsed: ${elapsed}`);
|
|
130
|
+
} else {
|
|
131
|
+
console.warn(`${LOG_PREFIX} onEnterRoom failed: elapsed: ${elapsed}`);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
// 退房回调
|
|
135
|
+
const onExitRoom = (reason) => {
|
|
136
|
+
console.warn(`${LOG_PREFIX} onExitRoom: reason: ${reason}`);
|
|
137
|
+
};
|
|
138
|
+
// 远端用户进房事件
|
|
139
|
+
const onRemoteUserEnterRoom = (userId) => {
|
|
140
|
+
console.warn(`${LOG_PREFIX} onRemoteUserEnterRoom: userId: ${userId}`);
|
|
141
|
+
};
|
|
142
|
+
// 远端用户退房事件
|
|
143
|
+
const onRemoteUserLeaveRoom = (userId, reason) => {
|
|
144
|
+
console.warn(`${LOG_PREFIX} onRemoteUserLeaveRoom: userId: ${userId}, ${reason}`);
|
|
145
|
+
};
|
|
146
|
+
// 远端用户 video 可用事件
|
|
147
|
+
const onUserVideoAvailable = (userId, available) => {
|
|
148
|
+
console.warn(`${LOG_PREFIX} onUserVideoAvailable: userId: ${userId}, available: ${available}`);
|
|
149
|
+
if (available) {
|
|
150
|
+
if (preRemoteUserIdList.indexOf(userId) === -1) {
|
|
151
|
+
preRemoteUserIdList = [...preRemoteUserIdList, userId];
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
preRemoteUserIdList = preRemoteUserIdList.filter((str) => str !== userId);
|
|
155
|
+
}
|
|
156
|
+
setRemoteUserIdList(preRemoteUserIdList);
|
|
157
|
+
};
|
|
158
|
+
// audio available
|
|
159
|
+
const handleUserAudioAvailable = (userId, available) => {
|
|
160
|
+
console.warn(`${LOG_PREFIX} onUserAudioAvailable: userId: ${userId}, available: ${available}`);
|
|
161
|
+
};
|
|
162
|
+
// 注册所有的事件监听
|
|
163
|
+
const subscribeEvents = () => {
|
|
164
|
+
trtcCloud.on('onError', onError);
|
|
165
|
+
trtcCloud.on('onEnterRoom', onEnterRoom);
|
|
166
|
+
trtcCloud.on('onExitRoom', onExitRoom);
|
|
167
|
+
trtcCloud.on('onRemoteUserEnterRoom', onRemoteUserEnterRoom);
|
|
168
|
+
trtcCloud.on('onRemoteUserLeaveRoom', onRemoteUserLeaveRoom);
|
|
169
|
+
trtcCloud.on('onUserVideoAvailable', onUserVideoAvailable);
|
|
170
|
+
trtcCloud.on('onUserAudioAvailable', handleUserAudioAvailable);
|
|
171
|
+
};
|
|
172
|
+
// 注销所有的事件监听
|
|
173
|
+
const unsubscribeEvents = () => {
|
|
174
|
+
trtcCloud.off('onError', onError);
|
|
175
|
+
trtcCloud.off('onEnterRoom', onEnterRoom);
|
|
176
|
+
trtcCloud.off('onExitRoom', onExitRoom);
|
|
177
|
+
trtcCloud.off('onRemoteUserEnterRoom', onRemoteUserEnterRoom);
|
|
178
|
+
trtcCloud.off('onRemoteUserLeaveRoom', onRemoteUserLeaveRoom);
|
|
179
|
+
trtcCloud.off('onUserVideoAvailable', onUserVideoAvailable);
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
return (
|
|
183
|
+
<div className="content-container">
|
|
184
|
+
<div className="operate-container">
|
|
185
|
+
<BasicInfoComponent userId={userId} roomId={roomId} handleInputChange={handleInputChange} handleStart={handleStart} handleStop={handleStop}></BasicInfoComponent>
|
|
186
|
+
{/* 摄像头选择 */}
|
|
187
|
+
<div className="select-container">
|
|
188
|
+
<label htmlFor="camera-select" className="select-item-label">
|
|
189
|
+
摄像头:
|
|
190
|
+
</label>
|
|
191
|
+
<select id="camera-select" className="select-item" onChange={(e) => handleChangeDevice(e, 'CAMERA')}>
|
|
192
|
+
{cameraList.map((obj, idx) => (
|
|
193
|
+
<option key={obj.deviceId} value={obj.deviceId}>
|
|
194
|
+
{obj.deviceName}
|
|
195
|
+
</option>
|
|
196
|
+
))}
|
|
197
|
+
</select>
|
|
198
|
+
</div>
|
|
199
|
+
{/* 麦克风选择 */}
|
|
200
|
+
<div className="select-container">
|
|
201
|
+
<label htmlFor="mic-select" className="select-item-label">
|
|
202
|
+
麦克风:
|
|
203
|
+
</label>
|
|
204
|
+
<select id="mic-select" className="select-item" onChange={(e) => handleChangeDevice(e, 'MIC')}>
|
|
205
|
+
{micList.map((obj, idx) => (
|
|
206
|
+
<option key={obj.deviceId} value={obj.deviceId}>
|
|
207
|
+
{obj.deviceName}
|
|
208
|
+
</option>
|
|
209
|
+
))}
|
|
210
|
+
</select>
|
|
211
|
+
</div>
|
|
212
|
+
{/* Speaker */}
|
|
213
|
+
<div className="select-container">
|
|
214
|
+
<label htmlFor="speaker-select" className="select-item-label">
|
|
215
|
+
外放:
|
|
216
|
+
</label>
|
|
217
|
+
<select id="speaker-select" className="select-item" onChange={(e) => handleChangeDevice(e, 'SPEAKER')}>
|
|
218
|
+
{speakerList.map((obj, idx) => (
|
|
219
|
+
<option key={obj.deviceId} value={obj.deviceId}>
|
|
220
|
+
{obj.deviceName}
|
|
221
|
+
</option>
|
|
222
|
+
))}
|
|
223
|
+
</select>
|
|
224
|
+
</div>
|
|
225
|
+
|
|
226
|
+
{/* 额外操作 */}
|
|
227
|
+
<div className="external-operate-container">
|
|
228
|
+
{/* <Button variant="contained" color="primary" onChange={() => operateFirstRemote()} style={{ marginTop: '8px' }}>
|
|
229
|
+
{isStopRemote ? 'start' : 'stop'}第一个远端用户
|
|
230
|
+
</Button> */}
|
|
231
|
+
{/*
|
|
232
|
+
<Button variant="contained" color="primary" onChange={() => disableAudioVolumeEvaluation()} style={{ marginTop: '8px' }}>关闭音量采集</Button>
|
|
233
|
+
<Button variant="contained" color="primary" onChange={() => muteAllRemoteAudio()} style={{ marginTop: '8px' }}>{isMuteAllRemoteAudio ? '开启' : '关闭'}远端所有音频</Button> */}
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
|
|
237
|
+
<div className="video-view-preview">
|
|
238
|
+
<div className="video-wrapper local-user">
|
|
239
|
+
<div className="user-desc">
|
|
240
|
+
<span className="user-type">本地用户</span>
|
|
241
|
+
<span className="user-role" id="localUserRole"></span>
|
|
242
|
+
</div>
|
|
243
|
+
<div id="localVideoWrapper"></div>
|
|
244
|
+
</div>
|
|
245
|
+
<div className="video-wrapper remote-user">
|
|
246
|
+
<div className="user-desc">
|
|
247
|
+
<span className="user-type">远程用户</span>
|
|
248
|
+
<span className="user-role" id="remoteUserRole"></span>
|
|
249
|
+
</div>
|
|
250
|
+
<div className="video-wrapper-container">
|
|
251
|
+
<div className="remoteVideoWrapper" id="remote-screen-share-container">
|
|
252
|
+
<div className="remote-share-text">远端屏幕分享</div>
|
|
253
|
+
</div>
|
|
254
|
+
{remoteUserIdList.map((userId, index) => (
|
|
255
|
+
<div id={userId} key={userId + '_' + index} className="remoteVideoWrapper"></div>
|
|
256
|
+
))}
|
|
257
|
+
</div>
|
|
258
|
+
</div>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
);
|
|
262
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
.content-container {
|
|
2
|
+
display: flex;
|
|
3
|
+
.operate-container {
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
width: 330px;
|
|
7
|
+
.external-operate-container {
|
|
8
|
+
display: flex;
|
|
9
|
+
justify-content: center;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
.btn-operate-group {
|
|
12
|
+
display: flex;
|
|
13
|
+
justify-content: space-between;
|
|
14
|
+
margin-top: 6px;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
.select-container {
|
|
18
|
+
display: flex;
|
|
19
|
+
margin-top: 8px;
|
|
20
|
+
.select-item-label {
|
|
21
|
+
flex: 1;
|
|
22
|
+
}
|
|
23
|
+
.select-item {
|
|
24
|
+
height: 28px;
|
|
25
|
+
width: 200px;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
.video-view-preview {
|
|
30
|
+
margin-left: 12px;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
.video-view-preview {
|
|
34
|
+
/* padding: 1rem 2rem; */
|
|
35
|
+
display: flex;
|
|
36
|
+
flex-direction: column;
|
|
37
|
+
justify-content: center;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.video-wrapper {
|
|
41
|
+
flex: 0 0 auto;
|
|
42
|
+
padding: 0 0.5rem;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.user-desc {
|
|
46
|
+
margin: 0.5rem 0rem;
|
|
47
|
+
}
|
|
48
|
+
.user-type {
|
|
49
|
+
font-weight: bold;
|
|
50
|
+
}
|
|
51
|
+
.video-wrapper-container {
|
|
52
|
+
display: flex;
|
|
53
|
+
flex-wrap: wrap;
|
|
54
|
+
margin-bottom: 1rem;
|
|
55
|
+
}
|
|
56
|
+
#localVideoWrapper,
|
|
57
|
+
.remoteVideoWrapper {
|
|
58
|
+
position: relative;
|
|
59
|
+
width: 320px;
|
|
60
|
+
height: 184px;
|
|
61
|
+
box-shadow: 2px 2px 18px 4px #c0c0c0;
|
|
62
|
+
background-color: lightblue;
|
|
63
|
+
margin-right: 20px;
|
|
64
|
+
border-radius: 8px;
|
|
65
|
+
}
|
|
66
|
+
.remote-share-text {
|
|
67
|
+
position: absolute;
|
|
68
|
+
background-color: white;
|
|
69
|
+
color: black;
|
|
70
|
+
opacity: 0.7;
|
|
71
|
+
border-radius: 6px;
|
|
72
|
+
bottom: 0rem;
|
|
73
|
+
display: flex;
|
|
74
|
+
justify-content: center;
|
|
75
|
+
align-items: center;
|
|
76
|
+
padding: 0rem 0.5rem;
|
|
77
|
+
z-index: 100;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.local-statistic,
|
|
81
|
+
.remote-statistic {
|
|
82
|
+
margin-top: 1rem;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.config-form {
|
|
86
|
+
margin: 1rem 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.form-line {
|
|
90
|
+
padding: 0.5rem 0.25rem;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|