@tencentcloud/roomkit-electron-vue3 2.7.0 → 2.7.2

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 (134) hide show
  1. package/es/components/AITools/AISubtitles.vue.mjs +1 -1
  2. package/es/components/AITools/AISubtitles.vue2.mjs +18 -19
  3. package/es/components/AITools/AITranscription.vue.mjs +1 -1
  4. package/es/components/AITools/AITranscription.vue2.mjs +65 -76
  5. package/es/components/Chat/ChatEditor/index.vue2.mjs +1 -1
  6. package/es/components/Chat/ChatKit/components/TUIChat/chat-header/index.vue2.mjs +1 -1
  7. package/es/components/Chat/ChatKit/components/TUIChat/emoji-config/default-emoji.mjs +4 -4
  8. package/es/components/Chat/ChatKit/components/TUIChat/emoji-config/index.mjs +1 -1
  9. package/es/components/Chat/ChatKit/components/TUIChat/index.vue2.mjs +1 -1
  10. package/es/components/Chat/ChatKit/components/TUIChat/message-input/message-input-quote/index.vue2.mjs +1 -1
  11. package/es/components/Chat/ChatKit/components/TUIChat/message-input-toolbar/emoji-picker/emoji-picker-dialog.vue2.mjs +1 -1
  12. package/es/components/Chat/ChatKit/components/TUIChat/message-input-toolbar/image-upload/index.vue2.mjs +1 -1
  13. package/es/components/Chat/ChatKit/components/TUIChat/message-input-toolbar/video-upload/index.vue2.mjs +1 -1
  14. package/es/components/Chat/ChatKit/components/TUIChat/message-list/index.vue2.mjs +2 -2
  15. package/es/components/Chat/ChatKit/components/TUIChat/message-list/message-elements/message-audio.vue2.mjs +1 -1
  16. package/es/components/Chat/ChatKit/components/TUIChat/message-list/message-elements/message-record/index.vue2.mjs +1 -1
  17. package/es/components/Chat/ChatKit/components/TUIChat/message-list/message-group-application/index.vue2.mjs +2 -2
  18. package/es/components/Chat/ChatKit/components/TUIChat/offlinePushInfoManager/offlinePushInfoManager.mjs +1 -1
  19. package/es/components/Chat/ChatKit/components/TUIChat/utils/sendMessage.mjs +1 -1
  20. package/es/components/Chat/ChatKit/components/common/BottomPopup/index.vue2.mjs +1 -1
  21. package/es/components/Chat/ChatKit/components/common/Dialog/index.vue2.mjs +1 -1
  22. package/es/components/Chat/ChatKit/components/common/Drawer/index.vue2.mjs +1 -1
  23. package/es/components/Chat/ChatKit/components/common/Icon.vue2.mjs +1 -1
  24. package/es/components/Chat/ChatKit/components/common/Overlay/index.vue2.mjs +1 -1
  25. package/es/components/Chat/ChatKit/components/common/Toast/index.mjs +1 -1
  26. package/es/components/Chat/ChatKit/components/common/Toast/index.vue2.mjs +1 -1
  27. package/es/components/Chat/ChatKit/components/common/Transfer/index.vue2.mjs +1 -1
  28. package/es/components/Chat/ChatKit/locales/index.mjs +4 -4
  29. package/es/components/Chat/ChatKit/plugins/plugin-components/message-plugin.vue2.mjs +1 -1
  30. package/es/components/ManageMember/MemberControl/index.vue.mjs +1 -1
  31. package/es/components/ManageMember/MemberControl/index.vue2.mjs +6 -4
  32. package/es/components/ManageMember/MemberControl/useMemberControlHooks.mjs +1 -1
  33. package/es/components/ManageMember/MemberItemCommon/MemberInfo.vue.mjs +1 -1
  34. package/es/components/ManageMember/index.vue2.mjs +1 -1
  35. package/es/components/PreRoom/PasswordDialog.vue2.mjs +1 -1
  36. package/es/components/RoomContent/StreamRegion/StreamPlay/index.vue2.mjs +1 -1
  37. package/es/components/RoomFooter/ApplyControl/MasterApplyControl/index.vue2.mjs +1 -1
  38. package/es/components/RoomFooter/ApplyControl/MemberApplyControl.vue2.mjs +1 -1
  39. package/es/components/RoomFooter/AudioControl.vue2.mjs +1 -1
  40. package/es/components/RoomFooter/BasicBeauty.vue.mjs +1 -1
  41. package/es/components/RoomFooter/BasicBeauty.vue2.mjs +5 -3
  42. package/es/components/RoomFooter/ChatControl.vue.mjs +2 -0
  43. package/es/components/RoomFooter/EndControl/index.vue2.mjs +1 -1
  44. package/es/components/RoomFooter/ScreenShareControl/Index.vue2.mjs +1 -1
  45. package/es/components/RoomFooter/ScreenShareControl/ScreenWindowSelectDialog.vue2.mjs +1 -1
  46. package/es/components/RoomFooter/VideoControl.vue2.mjs +2 -2
  47. package/es/components/RoomFooter/VirtualBackground.vue2.mjs +1 -1
  48. package/es/components/RoomFooter/WhiteboardControl.vue.mjs +1 -1
  49. package/es/components/RoomHeader/UserInfo/index.vue.mjs +1 -1
  50. package/es/components/RoomHeader/UserInfo/index.vue2.mjs +2 -1
  51. package/es/components/RoomHeader/index/LayoutControl.vue2.mjs +1 -1
  52. package/es/components/RoomHome/RoomControl/index.vue2.mjs +2 -2
  53. package/es/components/RoomInvite/InvitationNotification.vue2.mjs +1 -1
  54. package/es/components/RoomInvite/index.vue2.mjs +1 -1
  55. package/es/components/RoomSetting/index.vue2.mjs +1 -1
  56. package/es/components/ScheduleConference/Contacts.vue2.mjs +1 -1
  57. package/es/components/ScheduleConference/ScheduleConferencePanel/index.vue2.mjs +2 -2
  58. package/es/components/ScheduleConference/ScheduleRoomControl.vue2.mjs +2 -2
  59. package/es/components/ScheduleConference/ScheduleRoomList.vue2.mjs +1 -1
  60. package/es/components/ScheduleConference/ShareLink.vue2.mjs +1 -1
  61. package/es/components/common/VideoProfile.vue2.mjs +1 -1
  62. package/es/components/common/VideoSettingTab.vue2.mjs +2 -2
  63. package/es/components/common/base/Button.vue2.mjs +1 -1
  64. package/es/components/common/base/Dialog/index.vue2.mjs +1 -1
  65. package/es/components/common/base/Input/index.vue2.mjs +1 -1
  66. package/es/components/common/base/Message/Message.vue2.mjs +1 -1
  67. package/es/components/common/base/MessageBox/index.vue2.mjs +1 -1
  68. package/es/components/common/base/SvgIcon.vue2.mjs +1 -1
  69. package/es/constants/room.mjs +1 -3
  70. package/es/extension/RoomMessageCard/RoomMessageCard.vue2.mjs +1 -1
  71. package/es/extension/chatExtension.mjs +3 -6
  72. package/es/hooks/useDeviceManager.mjs +1 -1
  73. package/es/index.mjs +134 -126
  74. package/es/services/function/aiTask.d.ts +13 -17
  75. package/es/services/function/aiTask.mjs +63 -100
  76. package/es/services/manager/MediaManager.mjs +1 -1
  77. package/es/services/manager/dataReportManager.d.ts +4 -1
  78. package/es/services/manager/dataReportManager.mjs +3 -0
  79. package/es/services/manager/roomActionManager.mjs +1 -1
  80. package/es/services/roomService.mjs +1 -1
  81. package/es/stores/basic.mjs +1 -1
  82. package/es/stores/room.mjs +1 -4
  83. package/es/utils/common/logger/index.mjs +1 -1
  84. package/es/utils/utils.d.ts +2 -0
  85. package/es/utils/utils.mjs +33 -0
  86. package/lib/components/AITools/AISubtitles.vue.js +1 -1
  87. package/lib/components/AITools/AISubtitles.vue2.js +17 -18
  88. package/lib/components/AITools/AITranscription.vue.js +1 -1
  89. package/lib/components/AITools/AITranscription.vue2.js +64 -75
  90. package/lib/components/Chat/ChatKit/components/TUIChat/message-input/index.vue2.js +6 -6
  91. package/lib/components/Chat/ChatKit/components/TUIChat/message-list/index.vue2.js +8 -8
  92. package/lib/components/Chat/ChatKit/components/TUIChat/message-list/message-elements/message-quote/index.vue2.js +4 -4
  93. package/lib/components/Chat/ChatKit/components/TUIChat/message-list/message-tool/index.vue2.js +10 -10
  94. package/lib/components/Chat/ChatKit/locales/index.js +4 -4
  95. package/lib/components/ManageMember/MemberControl/index.vue.js +1 -1
  96. package/lib/components/ManageMember/MemberControl/index.vue2.js +5 -3
  97. package/lib/components/ManageMember/MemberItemCommon/MemberInfo.vue.js +1 -1
  98. package/lib/components/RoomContent/StreamContainer/index.vue2.js +6 -6
  99. package/lib/components/RoomFooter/AudioControl.vue2.js +4 -4
  100. package/lib/components/RoomFooter/BasicBeauty.vue.js +1 -1
  101. package/lib/components/RoomFooter/BasicBeauty.vue2.js +3 -1
  102. package/lib/components/RoomFooter/ChatControl.vue.js +2 -0
  103. package/lib/components/RoomFooter/ScreenShareControl/Index.vue2.js +5 -5
  104. package/lib/components/RoomFooter/VideoControl.vue2.js +4 -4
  105. package/lib/components/RoomHeader/UserInfo/index.vue.js +1 -1
  106. package/lib/components/RoomHeader/UserInfo/index.vue2.js +2 -1
  107. package/lib/components/ScheduleConference/ScheduleConferencePanel/index.vue2.js +1 -1
  108. package/lib/components/ScheduleConference/ScheduleRoomControl.vue2.js +1 -1
  109. package/lib/components/ScheduleConference/ScheduleRoomList.vue2.js +1 -1
  110. package/lib/conference.vue2.js +12 -12
  111. package/lib/constants/room.js +1 -3
  112. package/lib/extension/chatExtension.js +1 -4
  113. package/lib/hooks/useMasterApplyControl.js +9 -9
  114. package/lib/index.js +134 -126
  115. package/lib/preConference.vue2.js +7 -7
  116. package/lib/services/function/aiTask.d.ts +13 -17
  117. package/lib/services/function/aiTask.js +63 -100
  118. package/lib/services/manager/dataReportManager.d.ts +4 -1
  119. package/lib/services/manager/dataReportManager.js +3 -0
  120. package/lib/stores/room.js +0 -3
  121. package/lib/utils/utils.d.ts +2 -0
  122. package/lib/utils/utils.js +33 -0
  123. package/package.json +2 -2
  124. package/src/TUIRoom/components/AITools/AISubtitles.vue +26 -23
  125. package/src/TUIRoom/components/AITools/AITranscription.vue +106 -101
  126. package/src/TUIRoom/components/ManageMember/MemberControl/index.vue +8 -3
  127. package/src/TUIRoom/components/ManageMember/MemberItemCommon/MemberInfo.vue +1 -1
  128. package/src/TUIRoom/components/RoomFooter/BasicBeauty.vue +2 -1
  129. package/src/TUIRoom/components/RoomFooter/ChatControl.vue +2 -1
  130. package/src/TUIRoom/components/RoomHeader/UserInfo/index.vue +2 -5
  131. package/src/TUIRoom/services/function/aiTask.ts +79 -113
  132. package/src/TUIRoom/services/manager/dataReportManager.ts +3 -0
  133. package/src/TUIRoom/stores/room.ts +0 -3
  134. package/src/TUIRoom/utils/utils.ts +47 -0
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const Vue = require("vue");
4
- const index = require("./components/RoomHeader/UserInfo/index.vue.js");
5
- const index$1 = require("./components/RoomHome/RoomControl/index.vue.js");
4
+ const index$1 = require("./components/RoomHeader/UserInfo/index.vue.js");
5
+ const index$2 = require("./components/RoomHome/RoomControl/index.vue.js");
6
6
  const Language_vue_vue_type_script_setup_true_lang = require("./components/common/Language.vue.js");
7
7
  const SwitchTheme_vue_vue_type_script_setup_true_lang = require("./components/common/SwitchTheme.vue.js");
8
8
  require("./services/main.js");
@@ -16,7 +16,7 @@ require("@tencentcloud/tui-core");
16
16
  const environment = require("./utils/environment.js");
17
17
  const ScheduleRoomList = require("./components/ScheduleConference/ScheduleRoomList.vue.js");
18
18
  const Logo = require("./components/common/Logo.vue.js");
19
- const index$2 = require("./components/common/base/MessageBox/index.js");
19
+ const index = require("./components/common/base/MessageBox/index.js");
20
20
  const Message = require("./components/common/base/Message/Message.js");
21
21
  const InvitationNotification = require("./components/RoomInvite/InvitationNotification.vue.js");
22
22
  const _hoisted_1 = { class: "header" };
@@ -75,7 +75,7 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
75
75
  callback = () => {
76
76
  }
77
77
  } = data;
78
- index$2.default({
78
+ index.default({
79
79
  title,
80
80
  message,
81
81
  duration,
@@ -111,7 +111,7 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
111
111
  ]),
112
112
  Vue.createElementVNode("div", _hoisted_3, [
113
113
  Vue.createVNode(Language_vue_vue_type_script_setup_true_lang.default, { class: "header-item language" }),
114
- Vue.createVNode(index.default, {
114
+ Vue.createVNode(index$1.default, {
115
115
  class: "header-item user-info",
116
116
  "user-id": props.userInfo.userId,
117
117
  "user-name": props.userInfo.userName,
@@ -122,7 +122,7 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
122
122
  }, null, 8, ["user-id", "user-name", "avatar-url", "is-show-edit-name"])
123
123
  ])
124
124
  ]),
125
- Vue.unref(environment.isMobile) ? (Vue.openBlock(), Vue.createBlock(index$1.default, {
125
+ Vue.unref(environment.isMobile) ? (Vue.openBlock(), Vue.createBlock(index$2.default, {
126
126
  key: 0,
127
127
  ref_key: "roomControlRef",
128
128
  ref: roomControlRef,
@@ -136,7 +136,7 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
136
136
  [Vue.vShow, props.isShowLogo]
137
137
  ]),
138
138
  Vue.createElementVNode("div", _hoisted_5, [
139
- Vue.createVNode(index$1.default, {
139
+ Vue.createVNode(index$2.default, {
140
140
  ref_key: "roomControlRef",
141
141
  ref: roomControlRef,
142
142
  "given-room-id": props.roomId,
@@ -1,22 +1,21 @@
1
1
  import { IRoomService } from '../';
2
2
 
3
- interface SubtitleMessage {
4
- userid: string;
3
+ export interface SubtitleMessage {
4
+ sender: string;
5
5
  text: string;
6
- translation_text: string;
6
+ translationText: string;
7
+ end?: boolean;
8
+ startMsTs: number;
7
9
  }
8
10
  export declare enum AI_TASK {
9
11
  TRANSCRIPTION_TASK = "transcription"
10
12
  }
11
13
  export interface AITaskEvent {
12
14
  [AI_TASK.TRANSCRIPTION_TASK]: {
13
- subtitleMsg: SubtitleMessage[];
14
- subtitleText: {
15
- value: string;
16
- };
17
- transcriptionText: {
18
- value: string;
15
+ subtitleMessages: {
16
+ [key: string]: SubtitleMessage;
19
17
  };
18
+ transcribedMessageList: SubtitleMessage[];
20
19
  };
21
20
  [key: string]: unknown;
22
21
  [key: symbol]: unknown;
@@ -25,13 +24,11 @@ export declare class AITask {
25
24
  private emitter;
26
25
  private trtc;
27
26
  private service;
28
- subtitleMsg: SubtitleMessage[];
29
- subtitleText: {
30
- value: string;
31
- };
32
- transcriptionText: {
33
- value: string;
27
+ subtitleMessages: {
28
+ [key: string]: SubtitleMessage;
34
29
  };
30
+ transcribedMessageList: SubtitleMessage[];
31
+ private subtitleTimeout;
35
32
  constructor(service: IRoomService);
36
33
  private bindCtx;
37
34
  on<T extends keyof AITaskEvent>(eventType: T, callback: (data?: AITaskEvent[T]) => void): void;
@@ -41,8 +38,7 @@ export declare class AITask {
41
38
  private handleMount;
42
39
  private handleUnmount;
43
40
  private bindEvent;
41
+ private resetSubtitleTimeout;
44
42
  private handleAIMessage;
45
43
  private handleMessage;
46
- StartAITranscription(): void;
47
44
  }
48
- export {};
@@ -5,18 +5,20 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
5
5
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
6
  const mitt = require("mitt");
7
7
  const environment = require("../../utils/environment.js");
8
+ const utils = require("../../utils/utils.js");
8
9
  var AI_TASK = /* @__PURE__ */ ((AI_TASK2) => {
9
10
  AI_TASK2["TRANSCRIPTION_TASK"] = "transcription";
10
11
  return AI_TASK2;
11
12
  })(AI_TASK || {});
13
+ const ASR_EVENT_CODE = 1e4;
12
14
  class AITask {
13
15
  constructor(service) {
14
16
  __publicField(this, "emitter", mitt());
15
17
  __publicField(this, "trtc");
16
18
  __publicField(this, "service");
17
- __publicField(this, "subtitleMsg", []);
18
- __publicField(this, "subtitleText", { value: "" });
19
- __publicField(this, "transcriptionText", { value: "" });
19
+ __publicField(this, "subtitleMessages", {});
20
+ __publicField(this, "transcribedMessageList", []);
21
+ __publicField(this, "subtitleTimeout", {});
20
22
  this.service = service;
21
23
  if (environment.isElectron || environment.isMobile) return;
22
24
  this.bindCtx();
@@ -45,126 +47,87 @@ class AITask {
45
47
  if (typeof ((_a = this.service.roomEngine.instance) == null ? void 0 : _a.getTRTCCloud) === "undefined" || typeof ((_c = (_b = this.service.roomEngine.instance) == null ? void 0 : _b.getTRTCCloud()) == null ? void 0 : _c._trtc) === "undefined") {
46
48
  return;
47
49
  }
48
- const trtc = (_d = this.service.roomEngine.instance) == null ? void 0 : _d.getTRTCCloud()._trtc;
49
- this.trtc = trtc;
50
- trtc.on("custom-message", this.handleAIMessage);
50
+ this.trtc = (_d = this.service.roomEngine.instance) == null ? void 0 : _d.getTRTCCloud()._trtc;
51
+ this.trtc.on("custom-message", this.handleAIMessage);
51
52
  }
52
53
  handleUnmount() {
53
54
  var _a;
54
- this.subtitleMsg = [];
55
- this.subtitleText.value = "";
56
- this.transcriptionText.value = "";
55
+ this.subtitleMessages = {};
56
+ this.transcribedMessageList = [];
57
57
  (_a = this.trtc) == null ? void 0 : _a.off("custom-message", this.handleAIMessage);
58
58
  }
59
59
  bindEvent() {
60
60
  this.service.lifeCycleManager.on("mount", this.handleMount);
61
61
  this.service.lifeCycleManager.on("unmount", this.handleUnmount);
62
62
  }
63
- // todo trtc defines this type as any
63
+ resetSubtitleTimeout(id, fn) {
64
+ if (this.subtitleTimeout[id]) {
65
+ clearTimeout(this.subtitleTimeout[id]);
66
+ }
67
+ this.subtitleTimeout[id] = setTimeout(fn, 3e3);
68
+ }
64
69
  handleAIMessage(event) {
65
70
  if (event.cmdId !== 1) return;
66
71
  const data = new TextDecoder().decode(event.data);
67
72
  const jsonData = JSON.parse(data);
68
73
  this.handleMessage(jsonData);
69
74
  this.emit("transcription", {
70
- subtitleText: this.subtitleText,
71
- transcriptionText: this.transcriptionText,
72
- subtitleMsg: this.subtitleMsg
75
+ subtitleMessages: this.subtitleMessages,
76
+ transcribedMessageList: this.transcribedMessageList
73
77
  });
74
78
  }
75
79
  handleMessage(data) {
76
- const refreshSubtitle = () => {
77
- let displayText = "";
78
- for (let i = 0; i < this.subtitleMsg.length; i++) {
79
- displayText += `${this.service.roomStore.getDisplayName(this.subtitleMsg[i].userid)}: ${this.subtitleMsg[i].text}
80
- `;
81
- if (this.subtitleMsg[i].translation_text !== "") {
82
- displayText += `${this.service.roomStore.getDisplayName(this.subtitleMsg[i].userid)}: ${this.subtitleMsg[i].translation_text}
83
- `;
84
- }
85
- }
86
- this.subtitleText.value = displayText;
80
+ if (data.type !== ASR_EVENT_CODE) return;
81
+ const { sender, payload } = data;
82
+ const { end } = payload;
83
+ const createSubtitleMsg = () => {
84
+ return {
85
+ sender,
86
+ text: payload.text,
87
+ translationText: payload.translation_text,
88
+ startMsTs: data.start_ms_ts,
89
+ end
90
+ };
87
91
  };
88
- if (data.type === 1e4 && data.payload.end === false) {
89
- let exist = false;
90
- for (let i = 0; i < this.subtitleMsg.length; i++) {
91
- if (data.sender === this.subtitleMsg[i].userid) {
92
- this.subtitleMsg[i].text = data.payload.text;
93
- this.subtitleMsg[i].translation_text = data.payload.translation_text;
94
- exist = true;
95
- break;
96
- }
97
- }
98
- if (!exist) {
99
- this.subtitleMsg.push({
100
- userid: data.sender,
101
- text: data.payload.text,
102
- translation_text: data.payload.translation_text
103
- });
104
- }
105
- refreshSubtitle();
106
- } else if (data.type === 1e4 && data.payload.end === true) {
107
- for (let i = 0; i < this.subtitleMsg.length; i++) {
108
- if (data.sender === this.subtitleMsg[i].userid) {
109
- this.subtitleMsg[i].text = data.payload.text;
110
- this.subtitleMsg[i].translation_text = data.payload.translation_text;
111
- break;
112
- }
113
- }
114
- refreshSubtitle();
115
- let content = `${data.payload.start_time}->${data.payload.end_time} ${data.sender}: ${data.payload.text}
116
- `;
117
- if (data.payload.translation_text !== "") {
118
- content += `${data.payload.start_time}->${data.payload.end_time} ${data.sender}: ${data.payload.translation_text}
119
- `;
92
+ const updateMsg = (msg) => {
93
+ msg.text = payload.text;
94
+ msg.translationText = payload.translation_text;
95
+ msg.end = end;
96
+ };
97
+ const appendMsg = (msg, target) => {
98
+ if (Array.isArray(target)) {
99
+ target.push(msg);
100
+ } else if (typeof target === "object") {
101
+ const recordTarget = target;
102
+ recordTarget[msg.sender] = msg;
103
+ } else {
104
+ throw new Error("Invalid target type");
120
105
  }
121
- this.transcriptionText.value += content;
106
+ };
107
+ const existingSubtitle = this.subtitleMessages[sender];
108
+ if (existingSubtitle) {
109
+ updateMsg(existingSubtitle);
110
+ } else {
111
+ appendMsg(createSubtitleMsg(), this.subtitleMessages);
122
112
  }
123
- if (data.type === "subtitle") {
124
- let exist = false;
125
- for (let i = 0; i < this.subtitleMsg.length; i++) {
126
- if (data.userid === this.subtitleMsg[i].userid) {
127
- this.subtitleMsg[i].text = data.text;
128
- this.subtitleMsg[i].translation_text = data.translation_text;
129
- exist = true;
130
- break;
131
- }
132
- }
133
- if (!exist) {
134
- this.subtitleMsg.push({
135
- userid: data.userid,
136
- text: data.text,
137
- translation_text: data.translation_text
138
- });
139
- }
140
- refreshSubtitle();
141
- } else if (data.type === "transcription") {
142
- for (let i = 0; i < this.subtitleMsg.length; i++) {
143
- if (data.userid === this.subtitleMsg[i].userid) {
144
- this.subtitleMsg[i].text = data.text;
145
- this.subtitleMsg[i].translation_text = data.translation_text;
146
- break;
147
- }
148
- }
149
- refreshSubtitle();
150
- let content = `${formatTimestampToTime(data.start_ms_ts)}->${formatTimestampToTime(data.end_ms_ts)} ${this.service.roomStore.getDisplayName(data.userid)}: ${data.text}
151
- `;
152
- if (data.translation_text !== "") {
153
- content += `${formatTimestampToTime(data.start_ms_ts)}->${formatTimestampToTime(data.end_ms_ts)} ${this.service.roomStore.getDisplayName(data.userid)}: ${data.translation_text}
154
- `;
155
- }
156
- this.transcriptionText.value += content;
113
+ const transcriptionIndex = utils.findLastIndex(
114
+ this.transcribedMessageList,
115
+ (msg) => msg.sender === sender && !msg.end
116
+ );
117
+ if (transcriptionIndex !== -1) {
118
+ updateMsg(this.transcribedMessageList[transcriptionIndex]);
119
+ } else {
120
+ appendMsg(createSubtitleMsg(), this.transcribedMessageList);
157
121
  }
122
+ this.resetSubtitleTimeout(sender, () => {
123
+ if (!end) return;
124
+ delete this.subtitleMessages[sender];
125
+ this.emit("transcription", {
126
+ subtitleMessages: this.subtitleMessages,
127
+ transcribedMessageList: this.transcribedMessageList
128
+ });
129
+ });
158
130
  }
159
- StartAITranscription() {
160
- }
161
- }
162
- function formatTimestampToTime(timestamp) {
163
- const date = new Date(timestamp);
164
- const hours = date.getHours().toString().padStart(2, "0");
165
- const minutes = date.getMinutes().toString().padStart(2, "0");
166
- const seconds = date.getSeconds().toString().padStart(2, "0");
167
- return `${hours}:${minutes}:${seconds}`;
168
131
  }
169
132
  exports.AITask = AITask;
170
133
  exports.AI_TASK = AI_TASK;
@@ -10,7 +10,10 @@ export declare enum MetricsKey {
10
10
  disableScreenSharing = 106053,
11
11
  enableWatermark = 106054,
12
12
  enableVirtualBackground = 106055,
13
- hideFeatureButton = 106056
13
+ hideFeatureButton = 106056,
14
+ openChat = 106057,
15
+ setBasicBeauty = 106058,
16
+ aiTask = 106059
14
17
  }
15
18
  export declare class DataReportManager {
16
19
  private taskQueue;
@@ -18,6 +18,9 @@ var MetricsKey = /* @__PURE__ */ ((MetricsKey2) => {
18
18
  MetricsKey2[MetricsKey2["enableWatermark"] = 106054] = "enableWatermark";
19
19
  MetricsKey2[MetricsKey2["enableVirtualBackground"] = 106055] = "enableVirtualBackground";
20
20
  MetricsKey2[MetricsKey2["hideFeatureButton"] = 106056] = "hideFeatureButton";
21
+ MetricsKey2[MetricsKey2["openChat"] = 106057] = "openChat";
22
+ MetricsKey2[MetricsKey2["setBasicBeauty"] = 106058] = "setBasicBeauty";
23
+ MetricsKey2[MetricsKey2["aiTask"] = 106059] = "aiTask";
21
24
  return MetricsKey2;
22
25
  })(MetricsKey || {});
23
26
  class DataReportManager {
@@ -412,9 +412,6 @@ const useRoomStore = pinia.defineStore("room", {
412
412
  updateVideoQuality(quality) {
413
413
  this.localVideoQuality = quality;
414
414
  },
415
- setLocalUser(obj) {
416
- Object.assign(this.localUser, obj);
417
- },
418
415
  setDeviceList(type, deviceList) {
419
416
  switch (type) {
420
417
  case TUIRoomEngine.TUIMediaDeviceType.kMediaDeviceTypeVideoCamera:
@@ -60,3 +60,5 @@ export declare function convertSecondsToHMS(seconds: number): {
60
60
  seconds: number;
61
61
  };
62
62
  export declare function getNanoId(size?: number): string;
63
+ export declare function findLastIndex<T>(array: T[], predicate: (value: T, index: number, obj: T[]) => boolean, thisArg?: any): number;
64
+ export declare function formatTimestampToTime(timestamp: number, format?: string): string;
@@ -147,12 +147,45 @@ function getNanoId(size = 21) {
147
147
  }
148
148
  return id;
149
149
  }
150
+ function findLastIndex(array, predicate, thisArg) {
151
+ const len = array.length >>> 0;
152
+ let k = len - 1;
153
+ while (k >= 0) {
154
+ const kValue = array[k];
155
+ if (predicate.call(thisArg, kValue, k, array)) {
156
+ return k;
157
+ }
158
+ k = k - 1;
159
+ }
160
+ return -1;
161
+ }
162
+ function formatTimestampToTime(timestamp, format = "MM-DD HH:mm") {
163
+ const date = new Date(timestamp);
164
+ const padStart = (value, length = 2) => value.toString().padStart(length, "0");
165
+ const replacements = {
166
+ YYYY: date.getFullYear().toString(),
167
+ YY: (date.getFullYear() % 100).toString().padStart(2, "0"),
168
+ MM: padStart(date.getMonth() + 1),
169
+ DD: padStart(date.getDate()),
170
+ HH: padStart(date.getHours()),
171
+ hh: padStart(date.getHours() % 12),
172
+ mm: padStart(date.getMinutes()),
173
+ ss: padStart(date.getSeconds()),
174
+ A: date.getHours() >= 12 ? "PM" : "AM"
175
+ };
176
+ return format.replace(
177
+ /YYYY|YY|MM|DD|HH|hh|mm|ss|A/g,
178
+ (match) => replacements[match]
179
+ );
180
+ }
150
181
  exports.addSuffix = addSuffix;
151
182
  exports.calculateByteLength = calculateByteLength;
152
183
  exports.convertSecondsToHMS = convertSecondsToHMS;
153
184
  exports.debounce = debounce;
154
185
  exports.deepClone = deepClone;
155
186
  exports.exitFullScreen = exitFullScreen;
187
+ exports.findLastIndex = findLastIndex;
188
+ exports.formatTimestampToTime = formatTimestampToTime;
156
189
  exports.getNanoId = getNanoId;
157
190
  exports.getUrlParam = getUrlParam;
158
191
  exports.getUrlWithRoomId = getUrlWithRoomId;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tencentcloud/roomkit-electron-vue3",
3
- "version": "2.7.0",
3
+ "version": "2.7.2",
4
4
  "main": "./lib/index.js",
5
5
  "module": "./es/index.mjs",
6
6
  "types": "./es/index.d.ts",
@@ -20,7 +20,7 @@
20
20
  "dependencies": {
21
21
  "@tencentcloud/chat": "latest",
22
22
  "@tencentcloud/tui-core": "latest",
23
- "@tencentcloud/tuiroom-engine-electron": "^2.7.0",
23
+ "@tencentcloud/tuiroom-engine-electron": "^2.7.2",
24
24
  "@tencentcloud/chat-uikit-engine": "2.2.7",
25
25
  "@tencentcloud/chat-uikit-vue": "2.2.7",
26
26
  "@tencentcloud/universal-api": "^2.0.9",
@@ -1,37 +1,40 @@
1
1
  <template>
2
2
  <div v-if="subtitleLines.length" class="ai-subtitles">
3
- <div v-for="(line, index) in subtitleLines" :key="index">{{ line }}</div>
3
+ <div v-for="line in subtitleLines" :key="line.sender">
4
+ {{
5
+ `${roomService.roomStore.getDisplayName(line.sender)}: ${line?.text}`
6
+ }}
7
+ </div>
4
8
  </div>
5
9
  </template>
6
10
 
7
11
  <script setup lang="ts">
8
- import { ref, computed, onUnmounted } from 'vue';
9
- import { roomService, AI_TASK, AITaskEvent } from '../../services';
10
-
11
- const rawSubtitleText = ref('');
12
- const subtitleLines = computed(() =>
13
- rawSubtitleText.value.split('\n').filter(item => item)
14
- );
15
-
16
- let subtitleTimeout: ReturnType<typeof setTimeout> | null = null;
17
-
18
- const resetSubtitleTimeout = () => {
19
- if (subtitleTimeout) {
20
- clearTimeout(subtitleTimeout);
21
- }
22
-
23
- subtitleTimeout = setTimeout(() => {
24
- rawSubtitleText.value = '';
25
- }, 3000);
26
- };
12
+ import { computed, onMounted, onUnmounted, ref } from 'vue';
13
+ import {
14
+ AI_TASK,
15
+ AITaskEvent,
16
+ MetricsKey,
17
+ roomService,
18
+ SubtitleMessage,
19
+ } from '../../services';
20
+
21
+ const subtitleMessages = ref<Record<string, SubtitleMessage>>({});
22
+ const subtitleLines = computed(() => {
23
+ const arr = Object.keys(subtitleMessages.value).map(userId => {
24
+ return subtitleMessages.value[userId];
25
+ });
26
+ return arr.sort((a, b) => a.startMsTs - b.startMsTs);
27
+ });
27
28
 
28
29
  const handleAISubtitles = (data?: AITaskEvent[AI_TASK.TRANSCRIPTION_TASK]) => {
29
30
  if (!data) return;
30
- rawSubtitleText.value = data.subtitleText.value;
31
- resetSubtitleTimeout();
31
+ subtitleMessages.value = Object.assign({}, data.subtitleMessages);
32
32
  };
33
33
 
34
- roomService.aiTask.on(AI_TASK.TRANSCRIPTION_TASK, handleAISubtitles);
34
+ onMounted(() => {
35
+ roomService.dataReportManager.reportCount(MetricsKey.aiTask);
36
+ roomService.aiTask.on(AI_TASK.TRANSCRIPTION_TASK, handleAISubtitles);
37
+ });
35
38
 
36
39
  onUnmounted(() => {
37
40
  roomService.aiTask.off(AI_TASK.TRANSCRIPTION_TASK, handleAISubtitles);