@tencentcloud/roomkit-electron-vue3 2.3.3 → 2.4.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.
Files changed (106) hide show
  1. package/es/components/ManageMember/MemberControl/index.vue.mjs +1 -1
  2. package/es/components/ManageMember/MemberControl/index.vue2.mjs +5 -4
  3. package/es/components/ManageMember/MemberControl/useMemberControlHooks.mjs +19 -4
  4. package/es/components/ManageMember/useIndexHooks.mjs +2 -1
  5. package/es/components/RoomFooter/ApplyControl/MemberApplyControl.vue.mjs +1 -1
  6. package/es/components/RoomFooter/ApplyControl/MemberApplyControl.vue2.mjs +2 -2
  7. package/es/components/RoomFooter/VirtualBackground.vue.mjs +1 -1
  8. package/es/components/RoomFooter/VirtualBackground.vue2.mjs +87 -27
  9. package/es/components/RoomFooter/index/index.vue.mjs +1 -1
  10. package/es/components/RoomFooter/index/index.vue2.mjs +0 -2
  11. package/es/components/RoomHeader/RoomInfo/useRoomInfoHooks.mjs +2 -2
  12. package/es/components/RoomHeader/index/LayoutControl.vue.mjs +1 -1
  13. package/es/components/RoomHeader/index/LayoutControl.vue2.mjs +1 -3
  14. package/es/components/RoomHeader/index/NetworkInfo.vue.mjs +1 -1
  15. package/es/components/RoomHeader/index/NetworkInfo.vue2.mjs +0 -2
  16. package/es/components/common/base/MessageBox/index.mjs +3 -1
  17. package/es/conference.d.ts +1 -1
  18. package/es/conference.vue.mjs +1 -1
  19. package/es/conference.vue2.mjs +1 -14
  20. package/es/constants/room.d.ts +3 -1
  21. package/es/extension/RoomMessageCard/RoomMessageCard.vue.mjs +1 -1
  22. package/es/extension/RoomMessageCard/RoomMessageCard.vue2.mjs +2 -2
  23. package/es/extension/chatExtension.mjs +1 -1
  24. package/es/hooks/useDeviceManager.d.ts +3 -1
  25. package/es/hooks/useMasterApplyControl.mjs +16 -10
  26. package/es/hooks/useRoomEngine.d.ts +3 -1
  27. package/es/index.d.ts +2 -1
  28. package/es/index.mjs +1494 -1437
  29. package/es/locales/en-US.d.ts +8 -7
  30. package/es/locales/en-US.mjs +8 -7
  31. package/es/locales/zh-CN.d.ts +10 -9
  32. package/es/locales/zh-CN.mjs +10 -9
  33. package/es/services/function/virtualBackground.d.ts +2 -0
  34. package/es/services/function/virtualBackground.mjs +19 -9
  35. package/es/services/function/waterMark.mjs +3 -0
  36. package/es/services/manager/componentManager.mjs +1 -1
  37. package/es/services/manager/roomActionManager.mjs +1 -1
  38. package/es/services/roomService.d.ts +3 -2
  39. package/es/stores/room.mjs +9 -1
  40. package/lib/components/ManageMember/MemberControl/index.vue.js +1 -1
  41. package/lib/components/ManageMember/MemberControl/index.vue2.js +4 -3
  42. package/lib/components/ManageMember/MemberControl/useMemberControlHooks.js +19 -4
  43. package/lib/components/ManageMember/useIndexHooks.js +2 -1
  44. package/lib/components/RoomFooter/ApplyControl/MemberApplyControl.vue.js +1 -1
  45. package/lib/components/RoomFooter/ApplyControl/MemberApplyControl.vue2.js +2 -2
  46. package/lib/components/RoomFooter/VirtualBackground.vue.js +1 -1
  47. package/lib/components/RoomFooter/VirtualBackground.vue2.js +86 -26
  48. package/lib/components/RoomFooter/index/index.vue.js +1 -1
  49. package/lib/components/RoomFooter/index/index.vue2.js +0 -2
  50. package/lib/components/RoomHeader/RoomInfo/useRoomInfoHooks.js +2 -2
  51. package/lib/components/RoomHeader/index/LayoutControl.vue.js +1 -1
  52. package/lib/components/RoomHeader/index/LayoutControl.vue2.js +1 -3
  53. package/lib/components/RoomHeader/index/NetworkInfo.vue.js +1 -1
  54. package/lib/components/RoomHeader/index/NetworkInfo.vue2.js +0 -2
  55. package/lib/components/common/base/MessageBox/index.js +3 -1
  56. package/lib/conference.d.ts +1 -1
  57. package/lib/conference.vue.js +1 -1
  58. package/lib/conference.vue2.js +10 -23
  59. package/lib/constants/room.d.ts +3 -1
  60. package/lib/extension/RoomMessageCard/RoomMessageCard.vue.js +1 -1
  61. package/lib/extension/RoomMessageCard/RoomMessageCard.vue2.js +2 -2
  62. package/lib/extension/chatExtension.js +1 -1
  63. package/lib/hooks/useDeviceManager.d.ts +3 -1
  64. package/lib/hooks/useMasterApplyControl.js +16 -10
  65. package/lib/hooks/useRoomEngine.d.ts +3 -1
  66. package/lib/index.d.ts +2 -1
  67. package/lib/index.js +1493 -1436
  68. package/lib/locales/en-US.d.ts +8 -7
  69. package/lib/locales/en-US.js +8 -7
  70. package/lib/locales/zh-CN.d.ts +10 -9
  71. package/lib/locales/zh-CN.js +10 -9
  72. package/lib/services/function/virtualBackground.d.ts +2 -0
  73. package/lib/services/function/virtualBackground.js +19 -9
  74. package/lib/services/function/waterMark.js +3 -0
  75. package/lib/services/manager/componentManager.js +1 -1
  76. package/lib/services/manager/roomActionManager.js +1 -1
  77. package/lib/services/roomService.d.ts +3 -2
  78. package/lib/stores/room.js +9 -1
  79. package/package.json +2 -2
  80. package/src/TUIRoom/assets/style/global.scss +1 -1
  81. package/src/TUIRoom/components/ManageMember/MemberControl/index.vue +5 -4
  82. package/src/TUIRoom/components/ManageMember/MemberControl/useMemberControlHooks.ts +20 -5
  83. package/src/TUIRoom/components/ManageMember/useIndexHooks.ts +3 -2
  84. package/src/TUIRoom/components/RoomFooter/ApplyControl/MemberApplyControl.vue +2 -2
  85. package/src/TUIRoom/components/RoomFooter/VirtualBackground.vue +100 -16
  86. package/src/TUIRoom/components/RoomFooter/index/index.vue +0 -3
  87. package/src/TUIRoom/components/RoomHeader/RoomInfo/useRoomInfoHooks.ts +2 -2
  88. package/src/TUIRoom/components/RoomHeader/index/LayoutControl.vue +0 -2
  89. package/src/TUIRoom/components/RoomHeader/index/NetworkInfo.vue +0 -2
  90. package/src/TUIRoom/components/common/base/MessageBox/index.ts +2 -1
  91. package/src/TUIRoom/conference.vue +6 -13
  92. package/src/TUIRoom/extension/RoomMessageCard/RoomMessageCard.vue +1 -1
  93. package/src/TUIRoom/extension/chatExtension.ts +1 -1
  94. package/src/TUIRoom/hooks/useMasterApplyControl.ts +15 -10
  95. package/src/TUIRoom/index.ts +2 -1
  96. package/src/TUIRoom/locales/en-US.ts +8 -7
  97. package/src/TUIRoom/locales/zh-CN.ts +10 -9
  98. package/src/TUIRoom/services/function/virtualBackground.ts +21 -9
  99. package/src/TUIRoom/services/function/waterMark.ts +6 -0
  100. package/src/TUIRoom/services/manager/componentManager.ts +1 -1
  101. package/src/TUIRoom/services/manager/roomActionManager.ts +1 -1
  102. package/src/TUIRoom/stores/room.ts +9 -1
  103. package/es/utils/aegis/config.mjs +0 -12
  104. package/es/utils/aegis/index.mjs +0 -63
  105. package/lib/utils/aegis/config.js +0 -12
  106. package/lib/utils/aegis/index.js +0 -63
@@ -8,11 +8,16 @@
8
8
  v-model="isDialogVisible" :title="t('VirtualBackground')" width="600px" :modal="true"
9
9
  :append-to-room-container="true" @close="closeSettingPanel"
10
10
  >
11
- <div id="stream-preview" class="stream-preview"></div>
11
+ <div id="stream-preview" class="stream-preview">
12
+ <div v-if="isLoading" class="mask"></div>
13
+ <div v-if="isLoading" class="spinner"></div>
14
+ </div>
12
15
  <div class="setting">
13
16
  <div
14
- :class="['setting-item', currentVirtualBackground === 'close' ? 'active' : '']"
15
- @click="closeVirtualBackground"
17
+ :class="[
18
+ 'setting-item', selectedBackground === 'close' ? 'active' : ''
19
+ ]"
20
+ @click="applyVirtualBackground('close')"
16
21
  >
17
22
  <i class="setting-item-icon">
18
23
  <img :src="CloseVirtualBackground" alt="close" style="width: 32px;" />
@@ -20,8 +25,10 @@
20
25
  <span>{{ t('Close') }}</span>
21
26
  </div>
22
27
  <div
23
- :class="['setting-item', currentVirtualBackground === 'blur' ? 'active' : '']"
24
- @click="openBlurredBackground"
28
+ :class="[
29
+ 'setting-item', selectedBackground === 'blur' ? 'active' : ''
30
+ ]"
31
+ @click="applyVirtualBackground('blur')"
25
32
  >
26
33
  <i class="setting-item-icon">
27
34
  <img :src="BlurredBackground" alt="blurred" />
@@ -29,12 +36,20 @@
29
36
  <span>{{ t('BlurredBackground') }}</span>
30
37
  </div>
31
38
  </div>
39
+ <div class="footer">
40
+ <TuiButton
41
+ class="button" :disabled="!isAllowed" @click="confirmVirtualBackground"
42
+ >
43
+ {{ t('Save') }}
44
+ </TuiButton>
45
+ <TuiButton class="button" type="primary" @click="closeSettingPanel">{{ t('Cancel') }}</TuiButton>
46
+ </div>
32
47
  </Dialog>
33
48
  </div>
34
49
  </template>
35
50
 
36
51
  <script setup lang="ts">
37
- import { nextTick, ref } from 'vue';
52
+ import { computed, nextTick, ref } from 'vue';
38
53
  import IconButton from '../common/base/IconButton.vue';
39
54
  import VirtualBackgroundIcon from '../common/icons/VirtualBackgroundIcon.vue';
40
55
  import { useI18n } from '../../locales';
@@ -42,41 +57,65 @@ import { roomService } from '../../services';
42
57
  import Dialog from '../common/base/Dialog/index.vue';
43
58
  import CloseVirtualBackground from '../../assets/imgs/close-virtual-background.png';
44
59
  import BlurredBackground from '../../assets/imgs/blurred-background.png';
60
+ import TuiButton from '../common/base/Button.vue';
45
61
 
46
62
  const { t } = useI18n();
47
63
  const componentConfig = roomService.componentManager.getComponentConfig('VirtualBackground');
48
-
49
- const currentVirtualBackground = ref<'close' | 'blur'>('close');
64
+ const isAllowed = computed(() => roomService.roomStore.localStream.hasVideoStream);
65
+ const appliedBackground = ref<'close' | 'blur'>('close');
66
+ const selectedBackground = ref<'close' | 'blur'>('close');
50
67
  const isDialogVisible = ref(false);
68
+ const isLoading = ref(false);
51
69
  const openSettingPanel = async () => {
52
70
  roomService.virtualBackground.initVirtualBackground();
53
71
  isDialogVisible.value = true;
72
+ isLoading.value = true;
54
73
  await nextTick();
55
- roomService.roomEngine.instance?.startCameraDeviceTest({ view: 'stream-preview' });
74
+ await roomService.roomEngine.instance?.startCameraDeviceTest({ view: 'stream-preview' });
75
+ await applyVirtualBackground(appliedBackground.value);
76
+ isLoading.value = false;
56
77
  };
57
- const closeSettingPanel = () => {
78
+
79
+ const closeSettingPanel = async () => {
58
80
  isDialogVisible.value = false;
59
81
  roomService.roomEngine.instance?.stopCameraDeviceTest();
82
+ selectedBackground.value = appliedBackground.value;
60
83
  };
61
84
 
62
- const openBlurredBackground = () => {
63
- currentVirtualBackground.value = 'blur';
64
- roomService.virtualBackground.toggleVirtualBackground(true);
85
+ const confirmVirtualBackground = async () => {
86
+ if (!isAllowed.value) return;
87
+ appliedBackground.value = selectedBackground.value;
88
+ closeSettingPanel();
89
+ if (selectedBackground.value === 'blur') {
90
+ await roomService.virtualBackground.toggleVirtualBackground(true);
91
+ }
92
+ if (selectedBackground.value === 'close') {
93
+ await roomService.virtualBackground.toggleVirtualBackground(false);
94
+ }
65
95
  };
66
- const closeVirtualBackground = () => {
67
- currentVirtualBackground.value = 'close';
68
- roomService.virtualBackground.toggleVirtualBackground(false);
96
+
97
+ const applyVirtualBackground = async (type: 'close' | 'blur') => {
98
+ isLoading.value = true;
99
+ try {
100
+ selectedBackground.value = type;
101
+ await roomService.virtualBackground.toggleTestVirtualBackground(type === 'blur');
102
+ } finally {
103
+ isLoading.value = false;
104
+ }
69
105
  };
70
106
  </script>
71
107
 
72
108
  <style lang="scss" scoped>
73
109
  .stream-preview {
74
110
  display: flex;
111
+ align-items: center;
112
+ justify-content: center;
75
113
  box-sizing: border-box;
76
114
  border-radius: 8px;
77
115
  overflow: hidden;
78
116
  min-height: 310px;
79
117
  background-color: #000;
118
+ position: relative;
80
119
  }
81
120
 
82
121
  .setting {
@@ -97,6 +136,7 @@ const closeVirtualBackground = () => {
97
136
  color: #4F586B;
98
137
  font-size: 12px;
99
138
  border: 1px solid transparent;
139
+ cursor: pointer;
100
140
 
101
141
  &-icon {
102
142
  display: flex;
@@ -116,4 +156,48 @@ const closeVirtualBackground = () => {
116
156
  color: #fff;
117
157
  }
118
158
  }
159
+
160
+ .spinner {
161
+ z-index: 3;
162
+ position: absolute;
163
+ top: 50%;
164
+ left: 50%;
165
+ transform: translate(-50%, -50%);
166
+ width: 40px;
167
+ height: 40px;
168
+ border: 4px solid #f3f3f3;
169
+ border-top: 4px solid #1C66E5;
170
+ border-radius: 50%;
171
+ animation: spin 1s linear infinite;
172
+ }
173
+ .mask {
174
+ position: absolute;
175
+ width: 100%;
176
+ height: 100%;
177
+ background-color: #000;
178
+ z-index: 2;
179
+ }
180
+
181
+ @keyframes spin {
182
+ 0% {
183
+ transform: translate(-50%, -50%) rotate(0deg);
184
+ }
185
+ 100% {
186
+ transform: translate(-50%, -50%) rotate(360deg);
187
+ }
188
+ }
189
+
190
+ .footer {
191
+ display: flex;
192
+ align-items: center;
193
+ justify-content: center;
194
+ gap: 1rem;
195
+ margin-top: 10px;
196
+ padding: 1rem;
197
+ border-radius: 8px;
198
+ .button {
199
+ width: 84px;
200
+ height: 32px;
201
+ }
202
+ }
119
203
  </style>
@@ -77,8 +77,6 @@ import SettingControl from '../SettingControl.vue';
77
77
  import VirtualBackground from '../VirtualBackground.vue';
78
78
  import bus from '../../../hooks/useMitt';
79
79
 
80
- import TUIRoomAegis from '../../../utils/aegis';
81
-
82
80
  import useRoomFooter from './useRoomFooterHooks';
83
81
 
84
82
  const {
@@ -89,7 +87,6 @@ const {
89
87
  } = useRoomFooter();
90
88
 
91
89
  function handleControlClick(name: string) {
92
- TUIRoomAegis.reportEvent({ name, ext1: name });
93
90
  bus.emit('experience-communication', name);
94
91
  }
95
92
  </script>
@@ -14,7 +14,7 @@ export default function useRoomInfo() {
14
14
  const basicStore = useBasicStore();
15
15
  const roomStore = useRoomStore();
16
16
  const { roomId, isRoomLinkVisible } = storeToRefs(basicStore);
17
- const { masterUserId } = storeToRefs(roomStore);
17
+ const { masterUserId, roomName } = storeToRefs(roomStore);
18
18
  const { t } = useI18n();
19
19
  const isShowRoomInfo = ref(false);
20
20
  const roomType = computed(() => (roomStore.isFreeSpeakMode ? t('Free Speech Room') : t('On-stage Speaking Room')));
@@ -25,7 +25,7 @@ export default function useRoomInfo() {
25
25
 
26
26
  const isShowRoomInfoTitle = computed(() => masterUserName.value);
27
27
 
28
- const conferenceTitle = computed(() => `${masterUserName.value}${t('Quick Meeting')}`);
28
+ const conferenceTitle = computed(() => `${roomName.value}`);
29
29
 
30
30
  const roomInfoTabList = computed(() => [
31
31
  { id: 1, title: 'Host', content: masterUserName.value, copyLink: '', isShowCopyIcon: false, visible: true },
@@ -85,7 +85,6 @@ import { LAYOUT } from '../../../constants/render';
85
85
  import { useBasicStore } from '../../../stores/basic';
86
86
  import { useRoomStore } from '../../../stores/room';
87
87
  import { storeToRefs } from 'pinia';
88
- import TUIRoomAegis from '../../../utils/aegis';
89
88
  import { useI18n } from '../../../locales';
90
89
  import { IconButtonLayout } from '../../../constants/room';
91
90
  import IconButton from '../../common/base/IconButton.vue';
@@ -107,7 +106,6 @@ const layoutControlConfig = roomService.getComponentConfig('LayoutControl');
107
106
 
108
107
  function handleClick(layout: any) {
109
108
  basicStore.setLayout(layout);
110
- TUIRoomAegis.reportEvent({ name: 'layout', ext1: layout });
111
109
  }
112
110
 
113
111
  function handleClickLayoutIcon() {
@@ -40,7 +40,6 @@
40
40
  import { ref, Ref, onUnmounted, watchEffect, reactive, shallowRef } from 'vue';
41
41
  import { useBasicStore } from '../../../stores/basic';
42
42
  import { storeToRefs } from 'pinia';
43
- import TUIRoomAegis from '../../../utils/aegis';
44
43
  import { useI18n } from '../../../locales';
45
44
  import TUIRoomEngine, { TUIRoomEvents, TUINetwork, TUINetworkQuality } from '@tencentcloud/tuiroom-engine-electron';
46
45
  import useRoomEngine from '../../../hooks/useRoomEngine';
@@ -108,7 +107,6 @@ watchEffect(() => {
108
107
 
109
108
  function handleClickNetworkIcon() {
110
109
  showNetworkInfo.value = !showNetworkInfo.value;
111
- TUIRoomAegis.reportEvent({ name: 'networkInfo', ext1: 'networkInfo' });
112
110
  }
113
111
 
114
112
  function handleClickOutSide() {
@@ -10,7 +10,8 @@ export type MessageProps = {
10
10
  }
11
11
  const MessageBox = ({ title, message, callback, confirmButtonText }: MessageProps) => {
12
12
  const container = document.createElement('div');
13
- const fullscreenElement = document.fullscreenElement || document.getElementById('roomContainer') || document.body;
13
+ const fullscreenElement = document.fullscreenElement || document.getElementById('roomContainer') || document.getElementById('pre-conference-container');
14
+ if (!fullscreenElement) return;
14
15
  fullscreenElement.appendChild(container);
15
16
 
16
17
  const onRemove = () => {
@@ -30,7 +30,6 @@ import { isMobile, isWeChat } from './utils/environment';
30
30
  import vTap from './directives/vTap';
31
31
  import { TUIKickedOutOfRoomReason } from '@tencentcloud/tuiroom-engine-electron';
32
32
 
33
- import TUIRoomAegis from './utils/aegis';
34
33
  import { MESSAGE_DURATION } from './constants/message';
35
34
 
36
35
  import TUIMessageBox from './components/common/base/MessageBox/index';
@@ -134,18 +133,6 @@ onUnmounted(() => {
134
133
  });
135
134
 
136
135
  const { sdkAppId, showHeaderTool } = roomService.basicStore;
137
- watch(
138
- () => sdkAppId,
139
- (val: number) => {
140
- if (val) {
141
- TUIRoomAegis.setSdkAppId(val);
142
- TUIRoomAegis.reportEvent({
143
- name: 'loaded',
144
- ext1: 'loaded-success',
145
- });
146
- }
147
- },
148
- );
149
136
  const tuiRoomClass = computed(() => {
150
137
  const roomClassList = ['tui-room', `tui-theme-${roomService.basicStore.defaultTheme}`];
151
138
  if (isMobile) {
@@ -310,6 +297,7 @@ const onKickedOffLine = (eventInfo: { message: string }) => {
310
297
  .tui-room {
311
298
  width: 100%;
312
299
  height: 100%;
300
+ min-width: 850px;
313
301
  position: relative;
314
302
  color: var(--font-color-1);
315
303
  background-color: var(--background-color-1);
@@ -339,6 +327,7 @@ const onKickedOffLine = (eventInfo: { message: string }) => {
339
327
  &.tui-room-h5 {
340
328
  width: 100%;
341
329
  height: 100%;
330
+ min-width: initial;
342
331
  }
343
332
  }
344
333
 
@@ -355,5 +344,9 @@ const onKickedOffLine = (eventInfo: { message: string }) => {
355
344
  width: 80%;
356
345
  border-radius: 10px;
357
346
  }
347
+ &.tui-room-h5,.chat-room {
348
+ width: 100%;
349
+ height: 100%;
350
+ }
358
351
  }
359
352
  </style>
@@ -12,7 +12,7 @@
12
12
  </div>
13
13
  <div class="content-desc">
14
14
  <div class="title">
15
- {{ `${roomCardData.ownerName || roomCardData.owner}${t('Quick Meeting')}` }}
15
+ {{ `${roomCardData.ownerName || roomCardData.owner}${t('Quick Conference')}` }}
16
16
  </div>
17
17
  <ul class="users">
18
18
  <template
@@ -233,7 +233,7 @@ export class ChatExtension {
233
233
  const chatType: ChatType = params?.chatType;
234
234
  const extension: ExtensionInfo = {
235
235
  weight: -1,
236
- text: this.service?.t('quick meeting') || '快速会议',
236
+ text: this.service?.t('quick conference') || '快速会议',
237
237
  icon: 'https://qcloudimg.tencent-cloud.cn/raw/148ab10dfe654076b41f0d0945bb82e8.png',
238
238
  data: {
239
239
  name: 'quickRoom',
@@ -64,7 +64,7 @@ export default function () {
64
64
  }
65
65
  } catch (error: any) {
66
66
  if (error.code === TUIErrorCode.ERR_ALL_SEAT_OCCUPIED) {
67
- TUIMessage({ type: 'warning', message: t('The current number of people on stage has reached the limit') });
67
+ TUIMessage({ type: 'warning', message: t('The stage is full') });
68
68
  } else {
69
69
  logger.error('Failure to process a user request', error);
70
70
  }
@@ -83,7 +83,7 @@ export default function () {
83
83
  }
84
84
  } catch (error: any) {
85
85
  if (error.code === TUIErrorCode.ERR_ALL_SEAT_OCCUPIED) {
86
- TUIMessage({ type: 'warning', message: t('The current number of people on stage has reached the limit') });
86
+ TUIMessage({ type: 'warning', message: t('The stage is full') });
87
87
  } else {
88
88
  logger.error('Failed application for consent to go on stage', error);
89
89
  }
@@ -106,12 +106,13 @@ export default function () {
106
106
 
107
107
  // Process all users’ requests to access the microphone
108
108
  async function handleAllUserApply(isAgreeOrRejectAllUserApply: boolean) {
109
+ let hasErrorOccurred = false;
109
110
  const applyUserList = applyToAnchorList.value.map(item => ({
110
111
  userId: item.userId,
111
112
  userName: item.userName,
112
113
  applyToAnchorRequestId: item.applyToAnchorRequestId,
113
114
  }));
114
- for (const { userId, userName, applyToAnchorRequestId } of applyUserList) {
115
+ for (const { applyToAnchorRequestId } of applyUserList) {
115
116
  const action = isAgreeOrRejectAllUserApply ? 'Agree' : 'Reject';
116
117
  const actionFailedMessage = `${action} sb on stage failed, please retry`;
117
118
  try {
@@ -123,12 +124,15 @@ export default function () {
123
124
  roomStore.removeApplyToAnchorUser(applyToAnchorRequestId);
124
125
  }
125
126
  } catch (error) {
126
- logger.error(actionFailedMessage);
127
- TUIMessage({
128
- type: 'warning',
129
- message: t(`${action} sb on stage failed, please retry`, { name: userName || userId }),
130
- duration: MESSAGE_DURATION.NORMAL,
131
- });
127
+ if (!hasErrorOccurred) {
128
+ logger.error(actionFailedMessage);
129
+ TUIMessage({
130
+ type: 'warning',
131
+ message: t('The stage is full'),
132
+ duration: MESSAGE_DURATION.NORMAL,
133
+ });
134
+ hasErrorOccurred = true;
135
+ }
132
136
  }
133
137
  }
134
138
  }
@@ -253,7 +257,8 @@ export default function () {
253
257
  }
254
258
  const onlyOneUserTakeStage = newVal.length === 1;
255
259
  const firstUser = applyToAnchorList.value[0];
256
- const userName = firstUser?.userName || firstUser?.userId;
260
+ const lastIndex = applyToAnchorList.value.length - 1;
261
+ const userName = applyToAnchorList.value[lastIndex]?.userName || applyToAnchorList.value[lastIndex]?.userId;
257
262
  const message = onlyOneUserTakeStage
258
263
  ? `${userName} ${t('Applying for the stage')}`
259
264
  : `${userName} ${t('and so on number people applying to stage', { number: applyToAnchorList.value.length })}`;
@@ -3,9 +3,10 @@ import PreConferenceView from './preConference.vue';
3
3
  import TUIRoomEngine from '@tencentcloud/tuiroom-engine-electron';
4
4
  import { conference, RoomEvent } from './conference';
5
5
  import RoomMessageCard from './extension/RoomMessageCard/RoomMessageCard.vue';
6
+ import { roomService } from './services';
6
7
  export * from './components/common/base/index';
7
8
 
8
- export { ConferenceMainView, PreConferenceView, TUIRoomEngine, conference, RoomEvent, RoomMessageCard };
9
+ export { ConferenceMainView, PreConferenceView, TUIRoomEngine, roomService, conference, RoomEvent, RoomMessageCard };
9
10
 
10
11
  ConferenceMainView.install = (app) => {
11
12
  app.component('ConferenceView', ConferenceMainView);
@@ -38,7 +38,7 @@ export default {
38
38
  'Join Room': 'Join Room',
39
39
  'Enter room ID': 'Enter room ID',
40
40
  'video conferencing': ' \'s video conferencing',
41
- 'Quick Meeting': ' \'s Quick Meeting',
41
+ 'Quick Conference': ' \'s Quick Conference',
42
42
  'Room ID': 'Room ID',
43
43
  'Low Definition': 'Low Definition',
44
44
  'Standard Definition': 'Standard Definition',
@@ -71,9 +71,9 @@ export default {
71
71
  'Full screen': 'Full screen',
72
72
  Members: 'Members',
73
73
  'Search Member': 'Search Member',
74
- 'Transfer owner': 'Transfer owner',
74
+ 'Make host': 'Make host',
75
75
  'Set as administrator': 'Set as administrator',
76
- 'Revoke administrator': 'Revoke administrator',
76
+ 'Remove administrator': 'Remove administrator',
77
77
  // @ts-ignore
78
78
  'The administrator status of sb has been withdrawn': ({ named }) => `The administrator status of ${named('name')} has been withdrawn`,
79
79
  // @ts-ignore
@@ -252,7 +252,7 @@ export default {
252
252
  'An invitation to open the microphone has been sent to sb.': ({ named }) => `An invitation to open the microphone has been sent to ${named('name')}`,
253
253
  // @ts-ignore
254
254
  'An invitation to open the camera has been sent to sb.': ({ named }) => `An invitation to open the camera has been sent to ${named('name')}`,
255
- 'Transfer owner failed, please try again.': 'Transfer owner failed, please try again.',
255
+ 'Make host failed, please try again.': 'Make host failed, please try again.',
256
256
  // @ts-ignore
257
257
  'Sb has been set as an administrator': ({ named }) => `${named('name')} has been set as an administrator.`,
258
258
  'Succeed on stage': 'Succeed on stage',
@@ -273,8 +273,7 @@ export default {
273
273
  'You are now an administrator': 'You are now an administrator',
274
274
  'The RoomOwner has withdrawn your administrator privileges': 'The RoomOwner has withdrawn your administrator privileges',
275
275
  'This member has already received the same request, please try again later': 'This member has already received the same request, please try again later',
276
- 'Failed to go on stage, invitation has timed out': 'Failed to go on stage, invitation has timed out',
277
- 'The current number of people on stage has reached the limit': 'The current number of people on stage has reached the limit',
276
+ 'The request to go on stage has timed out': 'The request to go on stage has timed out',
278
277
  // @ts-ignore
279
278
  'The invitation to sb to go on stage has timed out': ({ named }) => `The invitation to ${named('name')} to go on stage has timed out`,
280
279
  'Currently no member has applied to go on stage': 'Currently no member has applied to go on stage',
@@ -291,8 +290,10 @@ export default {
291
290
  'people applying to stage': 'people applying to stage',
292
291
  // @ts-ignore
293
292
  'and so on number people applying to stage': ({ named }) => `and so on ${named('number')} people applying to stage`,
293
+ 'The stage is full, please contact the host': 'The stage is full, please contact the host',
294
+ 'The stage is full': 'The stage is full',
294
295
  // Room Chat Fusion Card Translation
295
- 'quick meeting': 'quick meeting',
296
+ 'quick conference': 'quick conference',
296
297
  Meeting: 'Meeting',
297
298
  'Meeting in progress': 'Meeting in progress',
298
299
  Initiating: 'Initiating',
@@ -35,7 +35,7 @@ export default {
35
35
  'Join Room': '进入房间',
36
36
  'Enter room ID': '输入房间号',
37
37
  'video conferencing': ' 的视频会议',
38
- 'Quick Meeting': '的快速会议',
38
+ 'Quick Conference': '的快速会议',
39
39
  'Room ID': '房间号',
40
40
  'Low Definition': '流畅',
41
41
  'Standard Definition': '标清',
@@ -68,9 +68,9 @@ export default {
68
68
  'Full screen': '全屏',
69
69
  Members: '成员',
70
70
  'Search Member': '搜索成员',
71
- 'Transfer owner': '转交房主',
71
+ 'Make host': '转交房主',
72
72
  'Set as administrator': '设为管理员',
73
- 'Revoke administrator': '撤销管理员',
73
+ 'Remove administrator': '撤销管理员',
74
74
  // @ts-ignore
75
75
  'The administrator status of sb has been withdrawn': ({ named }) => `已将 ${named('name')} 的管理员身份撤回`,
76
76
  // @ts-ignore
@@ -222,9 +222,9 @@ export default {
222
222
  'kicked out of the room by other device': '相同账号在其他客户端进入房间',
223
223
  'kicked out of the room by serve': '被服务端踢出房间',
224
224
  // @ts-ignore
225
- 'Reject sb stage failed, please retry': ({ named }) => `拒绝 ${named('name')} 上台失败, 请重试`,
225
+ 'Reject sb on stage failed, please retry': ({ named }) => `拒绝 ${named('name')} 上台失败, 请重试`,
226
226
  // @ts-ignore
227
- 'Agree sb stage failed, please retry': ({ named }) => `同意 ${named('name')} 上台失败, 请重试`,
227
+ 'Agree sb on stage failed, please retry': ({ named }) => `同意 ${named('name')} 上台失败, 请重试`,
228
228
  'Has been fully muted and cannot open the microphone': '已被全员静音,无法打开麦克风',
229
229
  'Has been muted by the host and cannot open the microphone': '已被主持人静音,无法打开麦克风',
230
230
  'To apply to speak in the room, please raise your hand first to apply for the microphone': '申请发言房间,请先举手申请上麦',
@@ -252,7 +252,7 @@ export default {
252
252
  'An invitation to open the microphone has been sent to sb.': ({ named }) => `已向 ${named('name')} 发出开启麦克风邀请`,
253
253
  // @ts-ignore
254
254
  'An invitation to open the camera has been sent to sb.': ({ named }) => `已向 ${named('name')} 发出开启摄像头邀请`,
255
- 'Transfer owner failed, please try again.': '转交房主失败,请重试',
255
+ 'Make host failed, please try again.': '转交房主失败,请重试',
256
256
  // @ts-ignore
257
257
  'Sb has been set as an administrator': ({ named }) => `已将 ${named('name')} 设为管理员`,
258
258
  'Succeed on stage': '上台成功',
@@ -273,8 +273,7 @@ export default {
273
273
  'You are now an administrator': '您已成为管理员',
274
274
  'The RoomOwner has withdrawn your administrator privileges': '房主已收回您的管理员权限',
275
275
  'This member has already received the same request, please try again later': '该成员已收到相同请求,请稍后再试',
276
- 'Failed to go on stage, invitation has timed out': '上台失败,邀请已超时',
277
- 'The current number of people on stage has reached the limit': '当前上台人数已达上限',
276
+ 'The request to go on stage has timed out': '上台请求已超时',
278
277
  // @ts-ignore
279
278
  'The invitation to sb to go on stage has timed out': ({ named }) => `对${named('name')}的上台邀请已超时`,
280
279
  'Currently no member has applied to go on stage': '暂无成员申请上台',
@@ -291,8 +290,10 @@ export default {
291
290
  'people applying to stage': '人正在申请上台',
292
291
  // @ts-ignore
293
292
  'and so on number people applying to stage': ({ named }) => `等 ${named('number')} 人正在申请上台`,
293
+ 'The stage is full, please contact the host': '台上人数已满,请联系主持人',
294
+ 'The stage is full': '台上人数已满',
294
295
  // Room Chat Fusion Card Translation
295
- 'quick meeting': '快速会议',
296
+ 'quick conference': '快速会议',
296
297
  Meeting: '会议',
297
298
  'Meeting in progress': '会议 进行中',
298
299
  Initiating: '正在发起',
@@ -5,6 +5,7 @@ interface IVirtualBackground {
5
5
  dispose(): void;
6
6
  initVirtualBackground(): Promise<void>;
7
7
  toggleVirtualBackground(enabled: boolean): Promise<void>;
8
+ toggleTestVirtualBackground(enabled: boolean): Promise<void>;
8
9
  }
9
10
 
10
11
  export class VirtualBackground implements IVirtualBackground {
@@ -27,6 +28,7 @@ export class VirtualBackground implements IVirtualBackground {
27
28
 
28
29
  private handleUnmount = async () => {
29
30
  await this.toggleVirtualBackground(false);
31
+ await this.toggleTestVirtualBackground(false);
30
32
  };
31
33
 
32
34
  public dispose() {
@@ -43,14 +45,24 @@ export class VirtualBackground implements IVirtualBackground {
43
45
  public async toggleVirtualBackground(enabled: boolean): Promise<void> {
44
46
  await this.initVirtualBackground();
45
47
  const { sdkAppId, userId, userSig } = this.service.basicStore;
46
- await this.trtcCloud.callExperimentalAPI(JSON.stringify({
47
- api: 'enableVirtualBackground',
48
- params: {
49
- sdkAppId,
50
- userId,
51
- userSig,
52
- enable: enabled,
53
- },
54
- }));
48
+ const params = {
49
+ sdkAppId,
50
+ userId,
51
+ userSig,
52
+ enable: enabled,
53
+ };
54
+ await this.trtcCloud.callExperimentalAPI(JSON.stringify({ api: 'enableVirtualBackground', params }));
55
+ }
56
+
57
+ public async toggleTestVirtualBackground(enabled: boolean): Promise<void> {
58
+ await this.initVirtualBackground();
59
+ const { sdkAppId, userId, userSig } = this.service.basicStore;
60
+ const params = {
61
+ sdkAppId,
62
+ userId,
63
+ userSig,
64
+ enable: enabled,
65
+ };
66
+ await this.trtcCloud.callExperimentalAPI(JSON.stringify({ api: 'enableTestVirtualBackground', params }));
55
67
  }
56
68
  }
@@ -88,6 +88,9 @@ export class WaterMark implements IWaterMark {
88
88
  targetElement.appendChild(watermarkContainer);
89
89
 
90
90
  const addWatermarkElements = () => {
91
+ // clear old watermark elements
92
+ watermarkContainer.innerHTML = '';
93
+
91
94
  // Calculate watermark spacing based on max width
92
95
  const maxWidth = 200;
93
96
  const watermarkSpacing = maxWidth + 25;
@@ -106,6 +109,9 @@ export class WaterMark implements IWaterMark {
106
109
 
107
110
  addWatermarkElements();
108
111
 
112
+ const resizeObserver = new ResizeObserver(addWatermarkElements);
113
+ resizeObserver.observe(watermarkContainer);
114
+
109
115
  const observerCallback = (mutations: MutationRecord[], observer: MutationObserver) => {
110
116
  mutations.forEach((mutation) => {
111
117
  if (mutation.removedNodes.length > 0) {
@@ -47,7 +47,7 @@ const defaultConfig = {
47
47
  ManageMemberControl: { visible: true },
48
48
  InviteControl: { visible: true },
49
49
  ChatControl: { visible: true },
50
- MoreControl: { visible: true },
50
+ MoreControl: { visible: false },
51
51
  VirtualBackground: { visible: false },
52
52
  };
53
53
 
@@ -132,7 +132,7 @@ export class RoomActionManager {
132
132
 
133
133
  const roomParams = {
134
134
  roomId,
135
- name: roomName,
135
+ roomName,
136
136
  roomType: TUIRoomType.kConference,
137
137
  isSeatEnabled: roomMode !== 'FreeToSpeak',
138
138
  seatMode: