index.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <script setup>
  2. import HeaderGroup from './components/HeaderGroup';
  3. import Sidebar from './components/Sidebar'
  4. import TelNoticeBar from './components/TelNoticeBar'
  5. import TelNoticeBox from './components/TelNoticeBox'
  6. import NoticeBar from './components/NoticeBar'
  7. import { AppMain } from './components'
  8. import useVoiceStore from "@/store/modules/voice";
  9. import useUserStore from "@/store/modules/user";
  10. import { workbenchApi } from '@/api/voice/workbench';
  11. import Cookies from 'js-cookie'
  12. const useVoice = useVoiceStore();
  13. const useUser = useUserStore();
  14. const audioRef = ref(null);
  15. const intervalTimer = ref(null);
  16. let worker = null;
  17. const isInitInProgress = ref(false); // 防止 `init()` 被多次调用
  18. const init = async () => {
  19. if (isInitInProgress.value) return; // 防止重复初始化
  20. isInitInProgress.value = true;
  21. try {
  22. const { data } = await workbenchApi.getSeatsByUser({ userId: useUser.id });
  23. if (data) {
  24. await useVoice.HS_CTI_INSTANCE(data.outId);
  25. const voiceStatus = sessionStorage.getItem('VOICE_STATUS');
  26. setTimeout(async () => {
  27. if ( [100001, 100002].includes( Number(useVoice.HSCTIERRORCODE) ) ) {
  28. useVoice.systemState = false;
  29. } else {
  30. await useVoice.getAgentStatus();
  31. if ( voiceStatus && [1, 2].includes( Number(useVoice.AGENTSTATUS) )) {
  32. voiceStatus == 'busy' ? useVoice.setBusy() : useVoice.setIdle();
  33. } else {
  34. useVoice.setIdle();
  35. }
  36. }
  37. }, 2000);
  38. }
  39. } catch (error) {
  40. console.error("Error in init:", error);
  41. } finally {
  42. isInitInProgress.value = false;
  43. console.log("init complete");
  44. }
  45. };
  46. const handleWorkerMessage = async (event) => {
  47. if (event.data === "check" && useVoice.isAuthPane) {
  48. const sdkRegister = Cookies.get("sdkRegister");
  49. if (!sdkRegister && !useVoice.noiceBarVisibleState && useVoice.AGENTSTATUS !== 0) {
  50. console.log("Reinitializing...");
  51. await useVoice.unInit();
  52. await init();
  53. }
  54. }
  55. };
  56. onMounted(async() => {
  57. if(useVoice.isAuthPane){
  58. await init();
  59. if (!worker) {
  60. worker = new Worker(new URL("@/workers/worker.js", import.meta.url), { type: "module" });
  61. worker.onmessage = handleWorkerMessage;
  62. worker.postMessage("start");
  63. }
  64. }
  65. })
  66. onUnmounted(() => {
  67. if(worker && useVoice.isAuthPane){
  68. worker.postMessage("stop");
  69. worker.terminate();
  70. worker = null;
  71. }
  72. });
  73. </script>
  74. <template>
  75. <div class="app-wrapper">
  76. <HeaderGroup></HeaderGroup>
  77. <div class="main-wrapper">
  78. <Sidebar class="sidebar-container" />
  79. <AppMain class="main-container"/>
  80. </div>
  81. <TelNoticeBar></TelNoticeBar>
  82. <TelNoticeBox></TelNoticeBox>
  83. <NoticeBar></NoticeBar>
  84. </div>
  85. </template>
  86. <style lang="scss" scoped>
  87. @import "@/assets/styles/mixin.scss";
  88. @import "@/assets/styles/variables.module.scss";
  89. .app-wrapper {
  90. @include clearfix;
  91. position: relative;
  92. height: 100vh;
  93. width: 100vw;
  94. background: #EFF1F8;
  95. overflow: hidden;
  96. .main-wrapper {
  97. display: flex;
  98. height: calc(100% - 92px);
  99. padding: 0 20px 20px 0;
  100. .sidebar-container {
  101. height: 100%;
  102. flex-shrink: 0;
  103. }
  104. }
  105. }
  106. </style>