index.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <template>
  2. <!-- 主区域 start -->
  3. <div id="PageRtcLive">
  4. <chat
  5. v-show="chatShow"
  6. :chatList="chatList"
  7. :currentUser="currentUser"
  8. ></chat>
  9. <!-- 控制条 start -->
  10. <div class="controlBar" v-if="!showInput">
  11. <div class="saySomething" @click="onFocus">
  12. <!-- <i class="speakIcon"
  13. :class="{'dis':!user_info.IsWords}"></i> -->
  14. <span>说点什么~</span>
  15. <!-- <span>已被禁言</span> -->
  16. <div
  17. class="disSpeakBtn"
  18. @click.stop="chatShow = !chatShow"
  19. :class="{ dis: !chatShow }"
  20. ></div>
  21. </div>
  22. <!-- <div style="text-align: right; width: 100%">连接中...</div> -->
  23. <div class="control_btn">
  24. <div
  25. class="brushesBack"
  26. @click="onDrawUndo"
  27. :class="{ disabled: !canUndo }"
  28. v-if="unref(isBrushes) && isNativeLeader"
  29. ></div>
  30. <div
  31. class="brushes"
  32. v-if="isNativeLeader"
  33. :class="{ brushed: isBrushes }"
  34. @click="onDraw(!isBrushes)"
  35. ></div>
  36. <div class="invitation"></div>
  37. <!-- @click="openMember" -->
  38. <div v-if="isNativeLeader" class="members" @click="openMember"></div>
  39. <template v-if="isNativeLeader">
  40. <div class="mic_on" v-if="unref(disableMic)"></div>
  41. <div class="mic_no" v-if="!unref(disableMic)"></div>
  42. </template>
  43. <div style="font-size: 0.65rem">
  44. <ImageIcon type="scene" />
  45. </div>
  46. <div class="exit"></div>
  47. </div>
  48. </div>
  49. <!-- 控制条 start -->
  50. <!-- 主区域 end -->
  51. <!-- 输入框 start-->
  52. <div class="layer" v-if="showInput" @click.stop="closeText">
  53. <div class="inputBox" @click.stop>
  54. <div class="msgBox">
  55. <input
  56. id="input_msg"
  57. type="text"
  58. maxlength="50"
  59. v-model.trim="text"
  60. :placeholder="`说点什么~`"
  61. />
  62. <span
  63. class="iconsend_icon"
  64. :class="{ disable: text == '' }"
  65. @click.stop="sendText"
  66. >发送</span
  67. >
  68. </div>
  69. </div>
  70. </div>
  71. <!-- 输入框 end-->
  72. <!-- 用户列表 start -->
  73. <memberList
  74. :data="[]"
  75. :show="showMember"
  76. :animateActive="animateActive"
  77. @close-member="closeMember"
  78. />
  79. <!-- 用户列表 end -->
  80. </div>
  81. </template>
  82. <script lang="ts" setup>
  83. import { computed, nextTick, onMounted, onUnmounted, ref, unref } from "vue";
  84. import { getApp, useApp } from "/@/hooks/userApp";
  85. import { initSocketEvent } from "./roomControl";
  86. import { createSocket } from "/@/hooks/userSocket";
  87. import { useRtcSdk } from "/@/hooks/useTRTC";
  88. import { useDraw } from "/@/hooks/useDraw";
  89. import browser from "/@/utils/browser";
  90. import ImageIcon from "/@/components/basic/icon/index.vue";
  91. import { useRtcStore } from "/@/store/modules/rtc";
  92. import type { SocketParams, RoleType } from "/@/store/modules/rtc";
  93. import chat from "./chat.vue";
  94. import memberList from "./memberList.vue";
  95. import consola from "consola";
  96. const { isDrawing, setDraw, setCloseDraw } = useDraw();
  97. const rtcStore = useRtcStore();
  98. const isNativeLeader = computed(() => rtcStore.role == "leader");
  99. const showInput = ref(false);
  100. const chatShow = ref(true);
  101. const isBrushes = isDrawing;
  102. const canUndo = ref(false);
  103. const animateActive = ref(false);
  104. const showMember = ref(false);
  105. const disableMic = ref(false);
  106. const isJoined = computed(() => rtcStore.isJoined);
  107. const role = computed(() => rtcStore.role);
  108. const text = ref<string>("");
  109. const chatList = computed(() => rtcStore.chatList);
  110. const currentUser = computed(() => rtcStore.userId);
  111. //设置socket 参数
  112. const initParams: SocketParams = {
  113. userId:
  114. browser.getURLParam("vruserId") ||
  115. `user_${browser.getURLParam("role")}${Math.floor(
  116. Math.random() * 100000000
  117. )}`,
  118. roomId:
  119. browser.getURLParam("roomId") ||
  120. `room_${Math.floor(Math.random() * 100000000)}`,
  121. role: (browser.getURLParam("role") as RoleType) || "leader",
  122. avatar: browser.getURLParam("avatar"),
  123. nickname: browser.getURLParam("name"),
  124. mode: browser.getURLParam("mode"),
  125. };
  126. consola.info({
  127. message: initParams,
  128. tag: "socket参数",
  129. });
  130. rtcStore.setSocketParams(initParams);
  131. const socket = createSocket();
  132. initSocketEvent(socket);
  133. const { createRTCSocket } = useRtcSdk();
  134. (async () => {
  135. await createRTCSocket();
  136. })();
  137. onMounted(async () => {
  138. const app = await useApp();
  139. app.Connect.follow.start({ follow: !unref(isNativeLeader) });
  140. app.Connect.follow.on("data", leaderSync);
  141. app.Connect.paint.on("data", leaderPaint);
  142. });
  143. onUnmounted(async () => {
  144. const app = await useApp();
  145. app.Connect.follow.off("data", leaderSync);
  146. app.Connect.paint.off("data", leaderPaint);
  147. });
  148. /* method */
  149. const leaderSync = (data) => {
  150. if (unref(isNativeLeader) && unref(isJoined)) {
  151. socket.emit("sync", data);
  152. }
  153. };
  154. const leaderPaint = (data) => {
  155. if (unref(isNativeLeader) && unref(isJoined)) {
  156. const records = getApp().Connect.paint.records;
  157. canUndo.value = records?.length;
  158. socket.emit("paint", data);
  159. }
  160. };
  161. const onDrawUndo = async () => {
  162. let app = getApp();
  163. app.Connect.paint.undo();
  164. canUndo.value = app.Connect.paint.records.length > 0;
  165. console.log(app.Connect.paint.records, "app.Connect.paint.records");
  166. };
  167. const onDraw = async (status: boolean) => {
  168. // isBrushes.value = status;
  169. status && setDraw();
  170. !status && setCloseDraw();
  171. if (unref(isBrushes)) {
  172. const app = await useApp();
  173. console.log("app", app.Connect.paint);
  174. app.Connect.paint.show({
  175. role: unref(role),
  176. paint: isNativeLeader ? true : false,
  177. });
  178. if (unref(role) == "leader") {
  179. socket.emit("action", { type: "user-paint", open: true });
  180. }
  181. } else {
  182. const app = await useApp();
  183. app.Connect.paint.hide();
  184. if (unref(role) == "leader") {
  185. socket.emit("action", { type: "user-paint", open: false });
  186. }
  187. }
  188. };
  189. function closeText(): void {
  190. showInput.value = false;
  191. text.value = "";
  192. }
  193. function sendText(): void {
  194. if (text.value == "") {
  195. return;
  196. }
  197. let data = {
  198. role: rtcStore.role,
  199. mode: rtcStore.mode,
  200. Nickname: rtcStore.nickname,
  201. UserId: rtcStore.userId,
  202. text: text.value,
  203. };
  204. consola.info({
  205. message: data,
  206. tag: "发送信息",
  207. });
  208. socket.emit("action", {
  209. type: "danmumsg",
  210. data,
  211. });
  212. rtcStore.addToChatList(data);
  213. document.getElementById("input_msg")?.blur();
  214. closeText();
  215. }
  216. function onFocus(): void {
  217. showInput.value = true;
  218. nextTick(() => {
  219. document.getElementById("input_msg")?.focus();
  220. });
  221. }
  222. const openMember = () => {
  223. showMember.value = true;
  224. animateActive.value = true;
  225. };
  226. const closeMember = () => {
  227. animateActive.value = false;
  228. let t = setTimeout(() => {
  229. clearTimeout(t);
  230. showMember.value = false;
  231. }, 200);
  232. };
  233. </script>
  234. <style scoped lang="scss">
  235. @import "./chatroom.scss";
  236. </style>