@ndscnj/roomkit-web-vue3 25.11.1917 → 25.12.2316

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 (54) hide show
  1. package/.vscode/settings.json +2 -0
  2. package/es/components/RoomFooter/index/indexPC.vue.mjs +1 -1
  3. package/es/components/RoomFooter/index/indexPC.vue2.mjs +8 -3
  4. package/es/components/RoomFooter/voteControl.vue.d.ts +15 -0
  5. package/es/components/RoomFooter/voteControl.vue.mjs +7 -0
  6. package/es/components/RoomFooter/voteControl.vue2.mjs +60 -0
  7. package/es/components/RoomInvite/useRoomInviteHooks.d.ts +1 -1
  8. package/es/components/RoomSidebar/indexPC.vue.mjs +6 -4
  9. package/es/components/RoomSidebar/useSideBarHooks.d.ts +1 -1
  10. package/es/components/RoomSidebar/useSideBarHooks.mjs +3 -0
  11. package/es/components/RoomVote/index.d.ts +6 -0
  12. package/es/components/RoomVote/useRoomMoreHooks.d.ts +13 -0
  13. package/es/conference.vue.d.ts +2 -0
  14. package/es/conference.vue.mjs +1 -1
  15. package/es/conference.vue2.mjs +7 -2
  16. package/es/index.mjs +31 -13
  17. package/es/locales/en-US.d.ts +1 -0
  18. package/es/locales/en-US.mjs +1 -0
  19. package/es/locales/zh-CN.d.ts +1 -0
  20. package/es/locales/zh-CN.mjs +1 -0
  21. package/es/stores/basic.d.ts +1 -1
  22. package/lib/components/RoomFooter/index/indexPC.vue.js +1 -1
  23. package/lib/components/RoomFooter/index/indexPC.vue2.js +8 -3
  24. package/lib/components/RoomFooter/voteControl.vue.d.ts +15 -0
  25. package/lib/components/RoomFooter/voteControl.vue.js +7 -0
  26. package/lib/components/RoomFooter/voteControl.vue2.js +60 -0
  27. package/lib/components/RoomInvite/useRoomInviteHooks.d.ts +1 -1
  28. package/lib/components/RoomSidebar/indexPC.vue.js +5 -3
  29. package/lib/components/RoomSidebar/useSideBarHooks.d.ts +1 -1
  30. package/lib/components/RoomSidebar/useSideBarHooks.js +3 -0
  31. package/lib/components/RoomVote/index.d.ts +6 -0
  32. package/lib/components/RoomVote/useRoomMoreHooks.d.ts +13 -0
  33. package/lib/conference.vue.d.ts +2 -0
  34. package/lib/conference.vue.js +1 -1
  35. package/lib/conference.vue2.js +7 -2
  36. package/lib/index.js +31 -13
  37. package/lib/locales/en-US.d.ts +1 -0
  38. package/lib/locales/en-US.js +1 -0
  39. package/lib/locales/zh-CN.d.ts +1 -0
  40. package/lib/locales/zh-CN.js +1 -0
  41. package/lib/stores/basic.d.ts +1 -1
  42. package/package.json +1 -1
  43. package/src/TUIRoom/components/RoomFooter/index/indexPC.vue +5 -1
  44. package/src/TUIRoom/components/RoomFooter/voteControl.vue +65 -0
  45. package/src/TUIRoom/components/RoomSidebar/indexPC.vue +1 -0
  46. package/src/TUIRoom/components/RoomSidebar/useSideBarHooks.ts +3 -0
  47. package/src/TUIRoom/components/RoomVote/index.ts +7 -0
  48. package/src/TUIRoom/components/RoomVote/indexH5.vue +141 -0
  49. package/src/TUIRoom/components/RoomVote/indexPC.vue +106 -0
  50. package/src/TUIRoom/components/RoomVote/useRoomMoreHooks.ts +47 -0
  51. package/src/TUIRoom/conference.vue +5 -0
  52. package/src/TUIRoom/locales/en-US.ts +1 -0
  53. package/src/TUIRoom/locales/zh-CN.ts +1 -0
  54. package/src/TUIRoom/stores/basic.ts +1 -0
@@ -27,6 +27,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
27
27
  resetStore: typeof resetStore;
28
28
  t: any;
29
29
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
30
+ "on-vote": (...args: any[]) => void;
30
31
  "on-log-out": (...args: any[]) => void;
31
32
  "on-create-room": (...args: any[]) => void;
32
33
  "on-enter-room": (...args: any[]) => void;
@@ -40,6 +41,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
40
41
  }>, {
41
42
  displayMode: string;
42
43
  }>>> & Readonly<{
44
+ "onOn-vote"?: ((...args: any[]) => any) | undefined;
43
45
  "onOn-log-out"?: ((...args: any[]) => any) | undefined;
44
46
  "onOn-create-room"?: ((...args: any[]) => any) | undefined;
45
47
  "onOn-enter-room"?: ((...args: any[]) => any) | undefined;
@@ -4,5 +4,5 @@ const conference_vue_vue_type_script_setup_true_lang = require("./conference.vue
4
4
  ;/* empty css */
5
5
  ;/* empty css */
6
6
  const _pluginVue_exportHelper = require("./_virtual/_plugin-vue_export-helper.js");
7
- const ConferenceMainView = /* @__PURE__ */ _pluginVue_exportHelper.default(conference_vue_vue_type_script_setup_true_lang.default, [["__scopeId", "data-v-c5f5a591"]]);
7
+ const ConferenceMainView = /* @__PURE__ */ _pluginVue_exportHelper.default(conference_vue_vue_type_script_setup_true_lang.default, [["__scopeId", "data-v-dc8a7460"]]);
8
8
  exports.default = ConferenceMainView;
@@ -40,7 +40,8 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
40
40
  "on-destroy-room",
41
41
  "on-kicked-out-of-room",
42
42
  "on-kicked-off-line",
43
- "on-userSig-expired"
43
+ "on-userSig-expired",
44
+ "on-vote"
44
45
  ],
45
46
  setup(__props, { expose: __expose, emit: __emit }) {
46
47
  const { theme } = uikitBaseComponentVue3.useUIKit();
@@ -217,6 +218,9 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
217
218
  function resetStore() {
218
219
  roomService.roomService.resetStore();
219
220
  }
221
+ const onVote = (data) => {
222
+ emit("on-vote", { code: data.visible, message: "vote" });
223
+ };
220
224
  const onStartRoom = () => {
221
225
  isShowLoading.value = false;
222
226
  emit("on-create-room", { code: 0, message: "create room" });
@@ -269,7 +273,8 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
269
273
  ]),
270
274
  Vue.withDirectives(Vue.createVNode(Vue.unref(index$2.default), {
271
275
  class: "footer",
272
- onShowOverlay: handleShowOverlay
276
+ onShowOverlay: handleShowOverlay,
277
+ onOnVote: onVote
273
278
  }, null, 512), [
274
279
  [Vue.vShow, Vue.unref(showRoomTool)]
275
280
  ]),
package/lib/index.js CHANGED
@@ -3928,7 +3928,25 @@ to {
3928
3928
  }
3929
3929
  .footer .mirror-container .mirror-text[data-v-21a63691] {
3930
3930
  margin-left: 4px;
3931
- }.footer-container[data-v-203d11fc] {
3931
+ }.more-container[data-v-7493ac70] {
3932
+ padding: 20px;
3933
+ }
3934
+ .more-container .more-title[data-v-7493ac70] {
3935
+ display: flex;
3936
+ align-items: center;
3937
+ }
3938
+ .more-container .more-title .email-icon[data-v-7493ac70] {
3939
+ color: var(--uikit-color-gray-7);
3940
+ }
3941
+ .more-container .more-title .more-notice[data-v-7493ac70] {
3942
+ width: 100%;
3943
+ height: 22px;
3944
+ padding-left: 8px;
3945
+ font-size: 14px;
3946
+ font-weight: 400;
3947
+ line-height: 22px;
3948
+ color: var(--text-color-primary);
3949
+ }.footer-container[data-v-28ae2921] {
3932
3950
  position: absolute;
3933
3951
  bottom: 0;
3934
3952
  display: flex;
@@ -3942,25 +3960,25 @@ to {
3942
3960
  background-color: var(--bg-color-topbar);
3943
3961
  box-shadow: 0 -8px 30px var(--uikit-color-black-8);
3944
3962
  }
3945
- .footer-container .left-container[data-v-203d11fc] {
3963
+ .footer-container .left-container[data-v-28ae2921] {
3946
3964
  display: flex;
3947
3965
  align-items: center;
3948
3966
  height: 100%;
3949
3967
  }
3950
- .footer-container .left-container .left-container-item[data-v-203d11fc]:not(:first-child) {
3968
+ .footer-container .left-container .left-container-item[data-v-28ae2921]:not(:first-child) {
3951
3969
  margin-left: 1rem;
3952
3970
  }
3953
- .footer-container .center-container[data-v-203d11fc] {
3971
+ .footer-container .center-container[data-v-28ae2921] {
3954
3972
  position: relative;
3955
3973
  display: flex;
3956
3974
  align-items: center;
3957
3975
  height: 100%;
3958
3976
  margin: 0 auto;
3959
3977
  }
3960
- .footer-container .center-container .center-container-item[data-v-203d11fc]:not(:first-child) {
3978
+ .footer-container .center-container .center-container-item[data-v-28ae2921]:not(:first-child) {
3961
3979
  margin-left: 16px;
3962
3980
  }
3963
- .footer-container .right-container[data-v-203d11fc] {
3981
+ .footer-container .right-container[data-v-28ae2921] {
3964
3982
  display: flex;
3965
3983
  align-items: center;
3966
3984
  height: 100%;
@@ -8977,7 +8995,7 @@ body, html {
8977
8995
  }
8978
8996
  .tui-room :not([class|=el]) {
8979
8997
  transition: background-color 0.3s, color 0.3s, box-shadow 0.3s;
8980
- }.tui-room[data-v-c5f5a591] {
8998
+ }.tui-room[data-v-dc8a7460] {
8981
8999
  position: relative;
8982
9000
  display: flex;
8983
9001
  flex-direction: column;
@@ -8989,7 +9007,7 @@ body, html {
8989
9007
  text-align: left;
8990
9008
  background-color: var(--bg-color-topbar);
8991
9009
  }
8992
- .tui-room .header[data-v-c5f5a591] {
9010
+ .tui-room .header[data-v-dc8a7460] {
8993
9011
  position: absolute;
8994
9012
  top: 0;
8995
9013
  left: 0;
@@ -9000,20 +9018,20 @@ body, html {
9000
9018
  border-bottom: 1px solid var(--stroke-color-primary);
9001
9019
  box-shadow: 0 1px 0 var(--uikit-color-black-8);
9002
9020
  }
9003
- .tui-room .content[data-v-c5f5a591] {
9021
+ .tui-room .content[data-v-dc8a7460] {
9004
9022
  position: absolute;
9005
9023
  top: 0;
9006
9024
  width: 100%;
9007
9025
  height: 100%;
9008
9026
  background-color: var(--bg-color-topbar);
9009
9027
  }
9010
- .tui-room.tui-room-h5[data-v-c5f5a591] {
9028
+ .tui-room.tui-room-h5[data-v-dc8a7460] {
9011
9029
  width: 100%;
9012
9030
  min-width: 350px;
9013
9031
  height: 100%;
9014
9032
  min-height: 525px;
9015
9033
  }
9016
- #roomContainer.chat-room[data-v-c5f5a591] {
9034
+ #roomContainer.chat-room[data-v-dc8a7460] {
9017
9035
  position: absolute;
9018
9036
  top: 0;
9019
9037
  right: 0;
@@ -9025,8 +9043,8 @@ body, html {
9025
9043
  margin: auto;
9026
9044
  border-radius: 10px;
9027
9045
  }
9028
- #roomContainer.tui-room-h5[data-v-c5f5a591],
9029
- #roomContainer .chat-room[data-v-c5f5a591] {
9046
+ #roomContainer.tui-room-h5[data-v-dc8a7460],
9047
+ #roomContainer .chat-room[data-v-dc8a7460] {
9030
9048
  width: 100%;
9031
9049
  height: 100%;
9032
9050
  }.user-info-container[data-v-9e9aff53] {
@@ -63,6 +63,7 @@ declare const _default: {
63
63
  RoomOwner: string;
64
64
  Me: string;
65
65
  me: string;
66
+ Vote: string;
66
67
  More: string;
67
68
  'AI Assistant': string;
68
69
  'AI real-time conference content': string;
@@ -65,6 +65,7 @@ const EN = {
65
65
  RoomOwner: "RoomOwner",
66
66
  Me: "Me",
67
67
  me: "me",
68
+ "Vote": "Vote",
68
69
  More: "More",
69
70
  "AI Assistant": "AI Assistant",
70
71
  "AI real-time conference content": "AI real-time conference content",
@@ -60,6 +60,7 @@ declare const _default: {
60
60
  me: string;
61
61
  Admin: string;
62
62
  RoomOwner: string;
63
+ Vote: string;
63
64
  More: string;
64
65
  'AI Assistant': string;
65
66
  'AI real-time conference content': string;
@@ -62,6 +62,7 @@ const ZH = {
62
62
  me: "我",
63
63
  Admin: "管理员",
64
64
  RoomOwner: "主持人",
65
+ Vote: "表决",
65
66
  More: "更多",
66
67
  "AI Assistant": "AI 助手",
67
68
  "AI real-time conference content": "AI 实时会议内容",
@@ -1,7 +1,7 @@
1
1
  import { LAYOUT } from '../constants/render';
2
2
  import { TUINetwork } from '../../../node_modules/@tencentcloud/tuiroom-engine-js';
3
3
 
4
- type SideBarType = 'chat' | 'invite' | 'manage-member' | 'more' | 'transfer-leave' | 'apply' | 'aiTranscription' | '';
4
+ type SideBarType = 'chat' | 'invite' | 'manage-member' | 'more' | 'transfer-leave' | 'apply' | 'aiTranscription' | 'vote' | '';
5
5
  type SceneType = 'chat' | 'default';
6
6
  interface BasicState {
7
7
  sdkAppId: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ndscnj/roomkit-web-vue3",
3
- "version": "25.11.1917",
3
+ "version": "25.12.2316",
4
4
  "main": "./lib/index.js",
5
5
  "module": "./es/index.mjs",
6
6
  "types": "./es/index.d.ts",
@@ -51,6 +51,10 @@
51
51
  class="center-container-item"
52
52
  @click="handleControlClick('MasterApplyControl')"
53
53
  />
54
+ <voteControl
55
+ class="center-container-item"
56
+ @click="handleControlClick('voteControl')"
57
+ />
54
58
  <more-control
55
59
  class="center-container-item"
56
60
  @click="handleControlClick('moreControl')"
@@ -93,7 +97,7 @@ import VirtualBackground from '../VirtualBackground.vue';
93
97
  import AIControl from '../AIControl.vue';
94
98
  import BasicBeauty from '../BasicBeauty.vue';
95
99
  import bus from '../../../hooks/useMitt';
96
-
100
+ import voteControl from '../voteControl.vue';
97
101
  import useRoomFooter from './useRoomFooterHooks';
98
102
  import { isElectron } from '../../../utils/environment';
99
103
  const { roomStore, isMaster, isAdmin, isAudience } = useRoomFooter();
@@ -0,0 +1,65 @@
1
+ <template>
2
+ <div class="more-container">
3
+ <icon-button
4
+ :is-active="sidebarName === 'vote'"
5
+ :title="t('Vote')"
6
+ @click-icon="toggleToolBox"
7
+ >
8
+ <IconAIIcon size="24" />
9
+ </icon-button>
10
+ 测试
11
+ <div class="tool-box" v-if="!isSidebarOpen && showToolBox">
12
+ 123
13
+ <slot></slot>
14
+ </div>
15
+ </div>
16
+ </template>
17
+
18
+ <script setup lang="ts">
19
+ import { roomService } from '../../services';
20
+ import { defineEmits, ref,computed,watch } from 'vue';
21
+ import { useI18n } from '../../locales';
22
+ const { basicStore } = roomService;
23
+ const isSidebarOpen = computed(() => basicStore.isSidebarOpen);
24
+ const sidebarName = computed(() => basicStore.sidebarName);
25
+ const { t } = useI18n();
26
+ const showToolBox = ref(false);
27
+ watch(isSidebarOpen, newValue => {
28
+ showToolBox.value = newValue && false;
29
+ });
30
+ const emit = defineEmits(['on-vote']);
31
+ function toggleToolBox() {
32
+ showToolBox.value = !showToolBox.value;
33
+ emit('on-vote', {
34
+ name: 'onVote',
35
+ visible: showToolBox.value,
36
+ });
37
+ }
38
+
39
+ </script>
40
+
41
+ <style lang="scss" scoped>
42
+ .more-container {
43
+ padding: 20px;
44
+
45
+ .more-title {
46
+ display: flex;
47
+ align-items: center;
48
+
49
+ .email-icon {
50
+ color: var(--uikit-color-gray-7);
51
+ }
52
+
53
+ .more-notice {
54
+ width: 100%;
55
+ height: 22px;
56
+ padding-left: 8px;
57
+ font-size: 14px;
58
+ font-weight: 400;
59
+ line-height: 22px;
60
+ color: var(--text-color-primary);
61
+ }
62
+ }
63
+
64
+ }
65
+ </style>
@@ -8,6 +8,7 @@
8
8
  :size="400"
9
9
  >
10
10
  <chat v-if="sidebarName == 'chat'" />
11
+ <room-vote v-if="sidebarName == 'vote'" />
11
12
  <room-more v-if="sidebarName == 'more'" />
12
13
  <manage-member v-if="sidebarName == 'manage-member'" />
13
14
  <AITranscription v-if="sidebarName == 'aiTranscription'" />
@@ -31,6 +31,9 @@ export default function useSideBar() {
31
31
  case 'invite':
32
32
  sidebarTitle = t('Invite');
33
33
  break;
34
+ case 'vote':
35
+ sidebarTitle = `${t('Vote')}`;
36
+ break;
34
37
  case 'more':
35
38
  sidebarTitle = t('More');
36
39
  break;
@@ -0,0 +1,7 @@
1
+ import indexH5 from './indexH5.vue';
2
+ import indexPC from './indexPC.vue';
3
+ import { isMobile } from '../../utils/environment';
4
+
5
+ const Index = isMobile ? indexH5 : indexPC;
6
+
7
+ export default Index;
@@ -0,0 +1,141 @@
1
+ <template>
2
+ <div class="contact-container-main">
3
+ <div class="contact-title-main">
4
+ <div>{{ t('Contact us') }}</div>
5
+ <span v-tap="handleCloseContact" class="cancel">{{ t('Cancel') }}</span>
6
+ </div>
7
+ <div
8
+ v-for="item in contactContentList"
9
+ :key="item.id"
10
+ class="contact-content-main"
11
+ >
12
+ <span class="contact-title">{{ t(item.title) }}</span>
13
+ <span class="contact-content">{{ item.content }}</span>
14
+ <IconCopy v-tap="() => onCopy(item.copyLink)" class="copy" />
15
+ </div>
16
+ <span class="contact-bottom">
17
+ {{
18
+ t(
19
+ 'If you have any questions, please feel free to join our QQ group or send an email'
20
+ )
21
+ }}
22
+ </span>
23
+ </div>
24
+ </template>
25
+
26
+ <script setup lang="ts">
27
+ import useRoomMoreControl from './useRoomMoreHooks';
28
+ import { IconCopy } from '@tencentcloud/uikit-base-component-vue3';
29
+ import vTap from '../../directives/vTap';
30
+
31
+ const { t, onCopy, contactContentList } = useRoomMoreControl();
32
+
33
+ const emit = defineEmits(['on-close-contact']);
34
+
35
+ function handleCloseContact() {
36
+ emit('on-close-contact');
37
+ }
38
+ </script>
39
+
40
+ <style lang="scss" scoped>
41
+ span {
42
+ padding-right: 5px;
43
+ font-size: 12px;
44
+ font-weight: 500;
45
+ line-height: 17px;
46
+ }
47
+
48
+ .contact-container-main {
49
+ position: fixed;
50
+ bottom: 0;
51
+ display: flex;
52
+ flex-direction: column;
53
+ width: 100%;
54
+ padding-bottom: 4vh;
55
+ border-radius: 15px 15px 0 0;
56
+ animation-name: popup;
57
+ animation-duration: 200ms;
58
+ background-color: var(--bg-color-operate);
59
+
60
+ @keyframes popup {
61
+ from {
62
+ transform: scaleY(0);
63
+ transform-origin: bottom;
64
+ }
65
+
66
+ to {
67
+ transform: scaleY(1);
68
+ transform-origin: bottom;
69
+ }
70
+ }
71
+
72
+ .contact-title-main {
73
+ display: flex;
74
+ flex-direction: row;
75
+ align-items: center;
76
+ padding: 30px 0 20px 25px;
77
+ font-family: 'PingFang SC';
78
+ font-size: 20px;
79
+ font-style: normal;
80
+ font-weight: 500;
81
+ line-height: 24px;
82
+ color: var(--text-color-primary);
83
+ }
84
+
85
+ .contact-content-main {
86
+ display: flex;
87
+ flex-direction: row;
88
+ align-items: center;
89
+ width: 90%;
90
+ height: 15%;
91
+ padding: 0 0 0 25px;
92
+ margin-bottom: 10px;
93
+ }
94
+
95
+ .contact-title,
96
+ .contact-content {
97
+ width: 28%;
98
+ font-family: 'PingFang SC';
99
+ font-size: 14px;
100
+ font-style: normal;
101
+ font-weight: 400;
102
+ line-height: 20px;
103
+ white-space: nowrap;
104
+ color: var(--text-color-primary);
105
+ }
106
+
107
+ .contact-content {
108
+ width: 62%;
109
+ overflow: hidden;
110
+ font-size: 14px;
111
+ text-overflow: ellipsis;
112
+ white-space: nowrap;
113
+ color: var(--text-color-secondary);
114
+ }
115
+
116
+ .contact-bottom {
117
+ width: 90%;
118
+ padding-left: 40px;
119
+ font-family: 'PingFang SC';
120
+ font-size: 12px;
121
+ font-style: normal;
122
+ font-weight: 400;
123
+ line-height: 17px;
124
+ text-align: center;
125
+ color: var(--text-color-secondary);
126
+ }
127
+
128
+ .copy {
129
+ margin-left: 30px;
130
+ color: var(--text-color-link);
131
+ }
132
+ }
133
+
134
+ .cancel {
135
+ flex: 1;
136
+ padding-right: 30px;
137
+ font-size: 16px;
138
+ font-weight: 400;
139
+ text-align: end;
140
+ }
141
+ </style>
@@ -0,0 +1,106 @@
1
+ <template>
2
+ <div class="more-container">
3
+ <div class="more-title">
4
+ <IconEmail class="email-icon" />
5
+ <div class="more-notice">
6
+ {{ t('If you have any questions, please email us.') }}
7
+ </div>
8
+ </div>
9
+ <div v-if="isZH" class="more-item">
10
+ <div class="item-title">{{ t('Join our product discussion group') }}</div>
11
+ <TUIButton @click="handleClick">{{ t('Join now') }}</TUIButton>
12
+ </div>
13
+ <div class="more-item">
14
+ <div class="item-title">{{ t('Our email address') }}</div>
15
+ <div class="more-content">{{ email }}</div>
16
+ <IconCopy class="copy-icon" @click="onCopy(email)" />
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script setup lang="ts">
22
+ import {
23
+ TUIButton,
24
+ IconCopy,
25
+ IconEmail,
26
+ } from '@tencentcloud/uikit-base-component-vue3';
27
+ import useRoomMoreControl from './useRoomMoreHooks';
28
+
29
+ const { t, onCopy, handleClick, email, isZH } = useRoomMoreControl();
30
+ </script>
31
+
32
+ <style lang="scss" scoped>
33
+ .more-container {
34
+ padding: 20px;
35
+
36
+ .more-title {
37
+ display: flex;
38
+ align-items: center;
39
+
40
+ .email-icon {
41
+ color: var(--uikit-color-gray-7);
42
+ }
43
+
44
+ .more-notice {
45
+ width: 100%;
46
+ height: 22px;
47
+ padding-left: 8px;
48
+ font-size: 14px;
49
+ font-weight: 400;
50
+ line-height: 22px;
51
+ color: var(--text-color-primary);
52
+ }
53
+ }
54
+
55
+ .more-item {
56
+ position: relative;
57
+ display: flex;
58
+ flex-direction: column;
59
+
60
+ &:not(:first-child) {
61
+ margin-top: 20px;
62
+
63
+ .item-title {
64
+ width: 100%;
65
+ padding-bottom: 8px;
66
+ font-size: 14px;
67
+ font-weight: 400;
68
+ line-height: 22px;
69
+ color: var(--text-color-primary);
70
+ }
71
+
72
+ .more-content {
73
+ position: relative;
74
+ box-sizing: border-box;
75
+ display: inline-block;
76
+ flex: 1;
77
+ height: 42px;
78
+ padding: 10px 30px 10px 16px;
79
+ overflow: hidden;
80
+ font-size: 14px;
81
+ font-weight: 500;
82
+ line-height: 22px;
83
+ text-overflow: ellipsis;
84
+ white-space: nowrap;
85
+ border-radius: 8px;
86
+ outline: none;
87
+ transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
88
+ color: var(--text-color-primary);
89
+ background-color: var(--bg-color-input);
90
+ border: 1px solid var(--stroke-color-module);
91
+ }
92
+
93
+ .copy-icon {
94
+ position: absolute;
95
+ top: 45px;
96
+ right: 10px;
97
+ display: flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ cursor: pointer;
101
+ color: var(--text-color-link);
102
+ }
103
+ }
104
+ }
105
+ }
106
+ </style>
@@ -0,0 +1,47 @@
1
+ import { computed } from 'vue';
2
+ import { TUIToast, TOAST_TYPE } from '@tencentcloud/uikit-base-component-vue3';
3
+ import { useI18n } from '../../locales';
4
+ import { clipBoard } from '../../utils/utils';
5
+ import i18n from '../../locales/index';
6
+
7
+ export default function useRoomMoreHooks() {
8
+ const { t } = useI18n();
9
+
10
+ const groupNumber = '770645461';
11
+ const email = 'chaooliang@tencent.com';
12
+
13
+ async function onCopy(value: string | number) {
14
+ try {
15
+ await clipBoard(value);
16
+ TUIToast({
17
+ message: t('Copied successfully'),
18
+ type: TOAST_TYPE.SUCCESS,
19
+ });
20
+ } catch (error) {
21
+ TUIToast({
22
+ message: t('Copied failure'),
23
+ type: TOAST_TYPE.ERROR,
24
+ });
25
+ }
26
+ }
27
+
28
+ const isZH = computed(() => i18n.global.locale.value === 'zh-CN');
29
+
30
+ const contactContentList = [
31
+ { id: 1, title: 'group chat', content: groupNumber, copyLink: groupNumber },
32
+ { id: 2, title: 'Email', content: email, copyLink: email },
33
+ ];
34
+
35
+ const handleClick = () => {
36
+ window.open('https://zhiliao.qq.com/s/c5GY7HIM62CK', '_blank');
37
+ };
38
+
39
+ return {
40
+ t,
41
+ onCopy,
42
+ contactContentList,
43
+ email,
44
+ handleClick,
45
+ isZH,
46
+ };
47
+ }
@@ -16,6 +16,7 @@
16
16
  v-show="showRoomTool"
17
17
  class="footer"
18
18
  @show-overlay="handleShowOverlay"
19
+ @on-vote="onVote"
19
20
  />
20
21
  <room-sidebar />
21
22
  <room-setting />
@@ -127,6 +128,7 @@ const emit = defineEmits([
127
128
  'on-kicked-out-of-room',
128
129
  'on-kicked-off-line',
129
130
  'on-userSig-expired',
131
+ 'on-vote',
130
132
  ]);
131
133
 
132
134
  const basicStore = useBasicStore();
@@ -315,6 +317,9 @@ function resetStore() {
315
317
  roomService.resetStore();
316
318
  }
317
319
 
320
+ const onVote = (data: { name: string; visible: boolean }) => {
321
+ emit('on-vote', { code: data.visible, message: 'vote' });
322
+ };
318
323
  const onStartRoom = () => {
319
324
  isShowLoading.value = false;
320
325
  emit('on-create-room', { code: 0, message: 'create room' });
@@ -72,6 +72,7 @@ export default {
72
72
  RoomOwner: 'RoomOwner',
73
73
  Me: 'Me',
74
74
  me: 'me',
75
+ 'Vote': 'Vote',
75
76
  More: 'More',
76
77
  'AI Assistant': 'AI Assistant',
77
78
  'AI real-time conference content': 'AI real-time conference content',
@@ -66,6 +66,7 @@ export default {
66
66
  me: '我',
67
67
  Admin: '管理员',
68
68
  RoomOwner: '主持人',
69
+ Vote: '表决',
69
70
  More: '更多',
70
71
  'AI Assistant': 'AI 助手',
71
72
  'AI real-time conference content': 'AI 实时会议内容',
@@ -13,6 +13,7 @@ type SideBarType =
13
13
  | 'transfer-leave'
14
14
  | 'apply'
15
15
  | 'aiTranscription'
16
+ | 'vote'
16
17
  | '';
17
18
  type SceneType = 'chat' | 'default';
18
19