@trtc/calls-uikit-vue 4.1.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 (483) hide show
  1. package/README-zh_CN.md +83 -0
  2. package/README.md +89 -0
  3. package/debug/GenerateTestUserSig-es.js +26 -0
  4. package/debug/lib-generate-test-usersig-es.min.js +2 -0
  5. package/package.json +42 -0
  6. package/src/Components/TUICallKit.vue +334 -0
  7. package/src/Components/assets/MicrophoneVolume/desktop/mic-off.svg +5 -0
  8. package/src/Components/assets/MicrophoneVolume/desktop/mic-on.svg +5 -0
  9. package/src/Components/assets/base/close.svg +1 -0
  10. package/src/Components/assets/base/error.svg +1 -0
  11. package/src/Components/assets/base/info.svg +1 -0
  12. package/src/Components/assets/base/loading-circle.svg +1 -0
  13. package/src/Components/assets/base/success.svg +1 -0
  14. package/src/Components/assets/base/waring.svg +1 -0
  15. package/src/Components/assets/button/accept.svg +1 -0
  16. package/src/Components/assets/button/background-blur-close.svg +1 -0
  17. package/src/Components/assets/button/background-blur-open.svg +1 -0
  18. package/src/Components/assets/button/camera-close.svg +1 -0
  19. package/src/Components/assets/button/camera-open.svg +1 -0
  20. package/src/Components/assets/button/desktop/arrow.png +0 -0
  21. package/src/Components/assets/button/desktop/fullScreen.svg +4 -0
  22. package/src/Components/assets/button/desktop/inviteUser.svg +1 -0
  23. package/src/Components/assets/button/desktop/minimize.svg +6 -0
  24. package/src/Components/assets/button/hangup.svg +1 -0
  25. package/src/Components/assets/button/microphone-close.svg +1 -0
  26. package/src/Components/assets/button/microphone-open.svg +1 -0
  27. package/src/Components/assets/button/mobile/down.svg +1 -0
  28. package/src/Components/assets/button/mobile/inviteUser.svg +1 -0
  29. package/src/Components/assets/button/mobile/minimize.svg +1 -0
  30. package/src/Components/assets/button/mobile/switch-camera.svg +1 -0
  31. package/src/Components/assets/button/mobile/up.svg +1 -0
  32. package/src/Components/assets/button/speaker-close.svg +1 -0
  33. package/src/Components/assets/button/speaker-open.svg +1 -0
  34. package/src/Components/assets/button/switch-audio.svg +1 -0
  35. package/src/Components/assets/common/arrows.svg +1 -0
  36. package/src/Components/assets/common/call.svg +1 -0
  37. package/src/Components/assets/common/close.svg +1 -0
  38. package/src/Components/assets/common/defaultAvatar.svg +1 -0
  39. package/src/Components/assets/common/loading-audio.svg +1 -0
  40. package/src/Components/assets/common/loading-video.png +0 -0
  41. package/src/Components/assets/common/microphone-volumn-close.svg +1 -0
  42. package/src/Components/assets/desktop/acceptAudio.svg +4 -0
  43. package/src/Components/assets/desktop/acceptVideo.svg +8 -0
  44. package/src/Components/assets/desktop/arrow.png +0 -0
  45. package/src/Components/assets/desktop/camera-false.svg +5 -0
  46. package/src/Components/assets/desktop/camera.svg +6 -0
  47. package/src/Components/assets/desktop/floatCallEnd.svg +3 -0
  48. package/src/Components/assets/desktop/floatFullScreen.svg +3 -0
  49. package/src/Components/assets/desktop/floatMicrophone.svg +4 -0
  50. package/src/Components/assets/desktop/floatMicrophoneClosed.svg +3 -0
  51. package/src/Components/assets/desktop/fullScreen.svg +4 -0
  52. package/src/Components/assets/desktop/hangup.svg +4 -0
  53. package/src/Components/assets/desktop/invite_user.svg +5 -0
  54. package/src/Components/assets/desktop/microphone-false.svg +8 -0
  55. package/src/Components/assets/desktop/microphone.svg +9 -0
  56. package/src/Components/assets/desktop/minimize.svg +6 -0
  57. package/src/Components/assets/desktop/permission/index.ts +11 -0
  58. package/src/Components/assets/desktop/permission/mac/permit-en.jpg +0 -0
  59. package/src/Components/assets/desktop/permission/mac/permit-zh.jpg +0 -0
  60. package/src/Components/assets/desktop/permission/win/permit-en.png +0 -0
  61. package/src/Components/assets/desktop/permission/win/permit-zh.png +0 -0
  62. package/src/Components/assets/desktop/switchScreen.svg +5 -0
  63. package/src/Components/assets/desktop/trans.svg +6 -0
  64. package/src/Components/assets/floatingWindow/desktop/floatCallEnd.svg +3 -0
  65. package/src/Components/assets/floatingWindow/desktop/floatFullScreen.svg +3 -0
  66. package/src/Components/assets/floatingWindow/desktop/floatMicrophone.svg +4 -0
  67. package/src/Components/assets/floatingWindow/desktop/floatMicrophoneClosed.svg +3 -0
  68. package/src/Components/assets/floatingWindow/mobile/camera-close.svg +1 -0
  69. package/src/Components/assets/floatingWindow/mobile/camera-open.svg +1 -0
  70. package/src/Components/assets/floatingWindow/mobile/earphone.svg +1 -0
  71. package/src/Components/assets/floatingWindow/mobile/microphone-close.svg +1 -0
  72. package/src/Components/assets/floatingWindow/mobile/microphone-open.svg +1 -0
  73. package/src/Components/assets/permission/desktop/index.ts +11 -0
  74. package/src/Components/assets/permission/desktop/mac/permit-en.jpg +0 -0
  75. package/src/Components/assets/permission/desktop/mac/permit-zh.jpg +0 -0
  76. package/src/Components/assets/permission/desktop/win/permit-en.png +0 -0
  77. package/src/Components/assets/permission/desktop/win/permit-zh.png +0 -0
  78. package/src/Components/assets/streamInfo/mobile/mic-off-h5.svg +1 -0
  79. package/src/Components/assets/streamInfo/mobile/mic-on-h5.svg +1 -0
  80. package/src/Components/assets/streamInfo/mobile/microphone-close-group.svg +1 -0
  81. package/src/Components/assets/streamInfo/mobile/microphone-close-single.svg +1 -0
  82. package/src/Components/assets/streamInfo/mobile/volumn.svg +1 -0
  83. package/src/Components/assets/streamInfo/networkStatus.png +0 -0
  84. package/src/Components/components/GroupCall/BackGround/BackGround.vue +20 -0
  85. package/src/Components/components/GroupCall/GroupCall.vue +129 -0
  86. package/src/Components/components/GroupCall/MediaContainer/MediaContainer.vue +267 -0
  87. package/src/Components/components/GroupCall/MediaContainer/StreamLoading/StreamLoading.vue +22 -0
  88. package/src/Components/components/SingleCall/MediaContainer/MediaContainer.vue +165 -0
  89. package/src/Components/components/SingleCall/SingleCall.vue +28 -0
  90. package/src/Components/components/SingleCall/hooks/useGetLargeViewName.ts +32 -0
  91. package/src/Components/components/base/Avatar/Avatar.ts +38 -0
  92. package/src/Components/components/base/Avatar/Avatar.vue +53 -0
  93. package/src/Components/components/base/Avatar/style/Avatar.scss +40 -0
  94. package/src/Components/components/base/Button/Button.ts +60 -0
  95. package/src/Components/components/base/Button/Button.vue +61 -0
  96. package/src/Components/components/base/Button/style/Button.scss +42 -0
  97. package/src/Components/components/base/Grid/Grid.ts +26 -0
  98. package/src/Components/components/base/Grid/Grid.vue +40 -0
  99. package/src/Components/components/base/Grid/GridItem/GridItem.vue +81 -0
  100. package/src/Components/components/base/Grid/GridItem/style/GridItem.scss +13 -0
  101. package/src/Components/components/base/Icon/Icon.ts +9 -0
  102. package/src/Components/components/base/Icon/Icon.vue +21 -0
  103. package/src/Components/components/base/Layout/Col/Col.ts +23 -0
  104. package/src/Components/components/base/Layout/Col/Col.vue +46 -0
  105. package/src/Components/components/base/Layout/Col/style/Col.scss +9 -0
  106. package/src/Components/components/base/Layout/Row/Row.ts +23 -0
  107. package/src/Components/components/base/Layout/Row/Row.vue +38 -0
  108. package/src/Components/components/base/Layout/Row/style/Row.scss +10 -0
  109. package/src/Components/components/base/Layout/constant.ts +1 -0
  110. package/src/Components/components/base/Loading/Circle/Circle.ts +13 -0
  111. package/src/Components/components/base/Loading/Circle/Circle.vue +36 -0
  112. package/src/Components/components/base/Loading/Circle/style/Circle.scss +26 -0
  113. package/src/Components/components/base/Loading/Dot/Dot.ts +13 -0
  114. package/src/Components/components/base/Loading/Dot/Dot.vue +44 -0
  115. package/src/Components/components/base/Loading/Dot/style/Dot.scss +61 -0
  116. package/src/Components/components/base/Loading/Loading.ts +29 -0
  117. package/src/Components/components/base/Loading/Loading.vue +36 -0
  118. package/src/Components/components/base/Loading/style/Loading.scss +18 -0
  119. package/src/Components/components/base/Message/Message.ts +117 -0
  120. package/src/Components/components/base/Message/Message.vue +60 -0
  121. package/src/Components/components/base/Message/style/Message.scss +49 -0
  122. package/src/Components/components/base/MessageGroup/MessageGroup.vue +37 -0
  123. package/src/Components/components/base/Overlay/Overlay.ts +46 -0
  124. package/src/Components/components/base/Overlay/Overlay.vue +75 -0
  125. package/src/Components/components/base/Overlay/style/Overlay.scss +40 -0
  126. package/src/Components/components/base/Popover/Popover.ts +36 -0
  127. package/src/Components/components/base/Popover/Popover.vue +40 -0
  128. package/src/Components/components/base/Popover/PopoverWeb/PopoverWeb.vue +110 -0
  129. package/src/Components/components/base/Popover/PopoverWx/PopoverWx.vue +15 -0
  130. package/src/Components/components/base/Popover/style/Popover.scss +30 -0
  131. package/src/Components/components/base/Popover/utils/calculatePosition.ts +50 -0
  132. package/src/Components/components/base/Portal/Portal.ts +14 -0
  133. package/src/Components/components/base/Portal/Portal.vue +22 -0
  134. package/src/Components/components/base/Portal/miniprogram/Portal.vue +20 -0
  135. package/src/Components/components/base/Portal/vue2/Portal.vue +53 -0
  136. package/src/Components/components/base/Portal/vue3/Portal.vue +19 -0
  137. package/src/Components/components/base/TKImage/TKImage.ts +34 -0
  138. package/src/Components/components/base/TKImage/TKImage.vue +77 -0
  139. package/src/Components/components/base/TKImage/style/TKImage.scss +20 -0
  140. package/src/Components/components/base/TKText/TKText.ts +24 -0
  141. package/src/Components/components/base/TKText/TKText.vue +43 -0
  142. package/src/Components/components/base/TKText/style/TKText.scss +19 -0
  143. package/src/Components/components/base/ToggleWindow/ToggleWindow.ts +19 -0
  144. package/src/Components/components/base/ToggleWindow/ToggleWindow.vue +46 -0
  145. package/src/Components/components/base/ToggleWindow/ToggleWindowItem/ToggleWindowItem.ts +5 -0
  146. package/src/Components/components/base/ToggleWindow/ToggleWindowItem/ToggleWindowItem.vue +62 -0
  147. package/src/Components/components/base/ToggleWindow/ToggleWindowItem/style/ToggleWindowItem.scss +38 -0
  148. package/src/Components/components/base/ToggleWindow/constant.ts +1 -0
  149. package/src/Components/components/base/ToggleWindow/style/ToggleWindow.scss +7 -0
  150. package/src/Components/components/base/assets/message/close.svg +5 -0
  151. package/src/Components/components/base/assets/message/error.svg +1 -0
  152. package/src/Components/components/base/assets/message/info.svg +1 -0
  153. package/src/Components/components/base/assets/message/success.svg +1 -0
  154. package/src/Components/components/base/assets/message/warning.svg +1 -0
  155. package/src/Components/components/base/constants/index.ts +8 -0
  156. package/src/Components/components/base/hooks/useListenerEvent.ts +36 -0
  157. package/src/Components/components/base/hooks/useOnClickOutSide.ts +27 -0
  158. package/src/Components/components/base/styles/common.scss +43 -0
  159. package/src/Components/components/base/styles/var.scss +132 -0
  160. package/src/Components/components/base/util/checkEnv.ts +51 -0
  161. package/src/Components/components/base/util/checkVueVersion.ts +11 -0
  162. package/src/Components/components/base/util/classNames.ts +34 -0
  163. package/src/Components/components/base/util/filterObject.ts +11 -0
  164. package/src/Components/components/base/util/index.ts +10 -0
  165. package/src/Components/components/common/AudioStream/AudioStream.ts +29 -0
  166. package/src/Components/components/common/AudioStream/AudioStream.vue +65 -0
  167. package/src/Components/components/common/Button/Accept.vue +66 -0
  168. package/src/Components/components/common/Button/Camera.vue +115 -0
  169. package/src/Components/components/common/Button/FullScreen.vue +32 -0
  170. package/src/Components/components/common/Button/Hangup.vue +57 -0
  171. package/src/Components/components/common/Button/InviteUser.vue +52 -0
  172. package/src/Components/components/common/Button/Microphone.vue +109 -0
  173. package/src/Components/components/common/Button/Minimize.vue +39 -0
  174. package/src/Components/components/common/Button/Reject.vue +52 -0
  175. package/src/Components/components/common/Button/Speaker.vue +98 -0
  176. package/src/Components/components/common/Button/SwitchCamera.vue +58 -0
  177. package/src/Components/components/common/Button/ToggleButtonPanel.vue +44 -0
  178. package/src/Components/components/common/Button/VirtualBackground.vue +76 -0
  179. package/src/Components/components/common/Button/hooks/useConfig.ts +33 -0
  180. package/src/Components/components/common/Button/props/Button.ts +15 -0
  181. package/src/Components/components/common/Button/style/common.scss +5 -0
  182. package/src/Components/components/common/Button/style/desktop.scss +49 -0
  183. package/src/Components/components/common/Button/style/index.scss +2 -0
  184. package/src/Components/components/common/Button/style/mobile.scss +63 -0
  185. package/src/Components/components/common/ButtonPanel/ButtonPanel.vue +238 -0
  186. package/src/Components/components/common/ButtonPanel/config/InitConfig.ts +248 -0
  187. package/src/Components/components/common/ButtonPanel/config/VirtualBackgroundMobileConfig.ts +29 -0
  188. package/src/Components/components/common/ButtonPanel/hooks/useButtonPanelLayout.ts +63 -0
  189. package/src/Components/components/common/DeviceSelect/DeviceSelect.ts +11 -0
  190. package/src/Components/components/common/DeviceSelect/DeviceSelect.vue +158 -0
  191. package/src/Components/components/common/FloatWindow/FloatWindow.vue +64 -0
  192. package/src/Components/components/common/FloatWindow/desktop/FloatWindow.vue +106 -0
  193. package/src/Components/components/common/FloatWindow/mobile/FloatWindow.vue +28 -0
  194. package/src/Components/components/common/FloatWindow/mobile/FloatWindowGroupCall.vue +141 -0
  195. package/src/Components/components/common/FloatWindow/mobile/FloatWindowSingleCall.vue +109 -0
  196. package/src/Components/components/common/JoinGroupCard/JoinGroupCard.vue +51 -0
  197. package/src/Components/components/common/JoinGroupCard/desktop/JoinGroupCard.scss +80 -0
  198. package/src/Components/components/common/JoinGroupCard/desktop/JoinGroupCard.vue +57 -0
  199. package/src/Components/components/common/JoinGroupCard/mobile/JoinGroupCard.scss +60 -0
  200. package/src/Components/components/common/JoinGroupCard/mobile/JoinGroupCard.vue +65 -0
  201. package/src/Components/components/common/MicVolume/MicVolume.vue +37 -0
  202. package/src/Components/components/common/MicVolume/MicVolumeClosed.vue +11 -0
  203. package/src/Components/components/common/MicrophoneVolume/MicrophoneVolume.ts +10 -0
  204. package/src/Components/components/common/MicrophoneVolume/MicrophoneVolume.vue +61 -0
  205. package/src/Components/components/common/OverlayStream/OverlayStream.ts +102 -0
  206. package/src/Components/components/common/OverlayStream/OverlayStream.vue +104 -0
  207. package/src/Components/components/common/OverlayStream/style/OverlayStream.scss +12 -0
  208. package/src/Components/components/common/OverlayStream/style/mobile.scss +32 -0
  209. package/src/Components/components/common/OverlayStream/style/pc.scss +21 -0
  210. package/src/Components/components/common/PermitTip/CloseIcon.vue +3 -0
  211. package/src/Components/components/common/PermitTip/PermitTip.ts +33 -0
  212. package/src/Components/components/common/PermitTip/PermitTip.vue +62 -0
  213. package/src/Components/components/common/PermitTip/SystemPermitTip.vue +160 -0
  214. package/src/Components/components/common/Player/Player.ts +18 -0
  215. package/src/Components/components/common/Player/Player.vue +59 -0
  216. package/src/Components/components/common/Player/WeChatPlayer/WeChatPlayer.vue +101 -0
  217. package/src/Components/components/common/Player/WeChatPlayer/style/index.scss +38 -0
  218. package/src/Components/components/common/Popover/Popover.vue +85 -0
  219. package/src/Components/components/common/Pusher/Pusher.ts +18 -0
  220. package/src/Components/components/common/Pusher/Pusher.vue +78 -0
  221. package/src/Components/components/common/Pusher/WeChatPusher/WeChatPusher.vue +70 -0
  222. package/src/Components/components/common/Pusher/WeChatPusher/style/index.scss +37 -0
  223. package/src/Components/components/common/SelectUser/SelectUser.vue +74 -0
  224. package/src/Components/components/common/SelectUser/components/Dialog/TDialog.vue +94 -0
  225. package/src/Components/components/common/SelectUser/components/Dialog/style/color.css +43 -0
  226. package/src/Components/components/common/SelectUser/components/Dialog/style/dialog.css +3 -0
  227. package/src/Components/components/common/SelectUser/components/Dialog/style/h5.css +49 -0
  228. package/src/Components/components/common/SelectUser/components/Dialog/style/web.css +55 -0
  229. package/src/Components/components/common/SelectUser/components/Icon/TIcon.vue +44 -0
  230. package/src/Components/components/common/SelectUser/components/Icon/style/icon.css +6 -0
  231. package/src/Components/components/common/SelectUser/components/Transfer/TTransfer.vue +304 -0
  232. package/src/Components/components/common/SelectUser/components/Transfer/icon/back.svg +16 -0
  233. package/src/Components/components/common/SelectUser/components/Transfer/icon/cancel.svg +23 -0
  234. package/src/Components/components/common/SelectUser/components/Transfer/icon/selected.svg +27 -0
  235. package/src/Components/components/common/SelectUser/components/Transfer/style/color.css +64 -0
  236. package/src/Components/components/common/SelectUser/components/Transfer/style/h5.css +86 -0
  237. package/src/Components/components/common/SelectUser/components/Transfer/style/transfer.css +17 -0
  238. package/src/Components/components/common/SelectUser/components/Transfer/style/web.css +146 -0
  239. package/src/Components/components/common/SelectUser/index.ts +12 -0
  240. package/src/Components/components/common/Swiper/Swiper.vue +145 -0
  241. package/src/Components/components/common/Swiper/SwiperSlider.vue +55 -0
  242. package/src/Components/components/common/Swiper/index.ts +10 -0
  243. package/src/Components/components/common/Swiper/useSlide.ts +56 -0
  244. package/src/Components/components/common/Swiper/useSwiperSliders.ts +34 -0
  245. package/src/Components/components/common/SwiperWx/Swiper.vue +123 -0
  246. package/src/Components/components/common/SwiperWx/SwiperSlider.vue +87 -0
  247. package/src/Components/components/common/SwiperWx/index.ts +5 -0
  248. package/src/Components/components/common/TKStreamInfo/StreamInfo.ts +34 -0
  249. package/src/Components/components/common/TKStreamInfo/StreamInfoMobile.vue +82 -0
  250. package/src/Components/components/common/TKStreamInfo/StreamInfoPC.vue +58 -0
  251. package/src/Components/components/common/TKStreamInfo/TKStreamInfo.vue +43 -0
  252. package/src/Components/components/common/Timer/Timer.ts +14 -0
  253. package/src/Components/components/common/Timer/Timer.vue +24 -0
  254. package/src/Components/components/common/Tip/Tip.ts +5 -0
  255. package/src/Components/components/common/Tip/Tip.vue +67 -0
  256. package/src/Components/components/common/Toast/Toast.ts +84 -0
  257. package/src/Components/components/common/Toast/Toast.vue +133 -0
  258. package/src/Components/components/common/Toast/index.ts +6 -0
  259. package/src/Components/components/common/Toast/type.ts +16 -0
  260. package/src/Components/components/common/TopBar/TopBar.ts +8 -0
  261. package/src/Components/components/common/TopBar/TopBar.vue +116 -0
  262. package/src/Components/components/common/Waiting/Waiting.vue +126 -0
  263. package/src/Components/components/config/button/ClosedPanelUI.ts +109 -0
  264. package/src/Components/components/config/button/DefaultUI.ts +544 -0
  265. package/src/Components/components/config/button/index.ts +2 -0
  266. package/src/Components/context/ButtonPanelContext.ts +6 -0
  267. package/src/Components/context/CallInfoContext.ts +15 -0
  268. package/src/Components/context/CallerUserInfoContext.ts +9 -0
  269. package/src/Components/context/CustomUIConfigContext.ts +1 -0
  270. package/src/Components/context/FloatWindowContext.ts +5 -0
  271. package/src/Components/context/FocusItemContext.ts +1 -0
  272. package/src/Components/context/IsClickableContext.ts +1 -0
  273. package/src/Components/context/PopoverContext.ts +1 -0
  274. package/src/Components/context/TranslateContext.ts +1 -0
  275. package/src/Components/context/UserInfoContextExcludeVolume.ts +8 -0
  276. package/src/Components/context/index.ts +10 -0
  277. package/src/Components/hooks/index.ts +20 -0
  278. package/src/Components/hooks/useButtonPanelStatus.ts +6 -0
  279. package/src/Components/hooks/useCallDuration.ts +32 -0
  280. package/src/Components/hooks/useCallInfoContext.ts +6 -0
  281. package/src/Components/hooks/useCallerUserInfoContext.ts +6 -0
  282. package/src/Components/hooks/useCustomUI.ts +7 -0
  283. package/src/Components/hooks/useCustomUIButtonConfig.ts +96 -0
  284. package/src/Components/hooks/useDeviceList.ts +51 -0
  285. package/src/Components/hooks/useFloatWindowContext.ts +6 -0
  286. package/src/Components/hooks/useFocusContext.ts +6 -0
  287. package/src/Components/hooks/useGetVolumeMap.ts +59 -0
  288. package/src/Components/hooks/useGroupCallLayout.ts +142 -0
  289. package/src/Components/hooks/useIsClickableContext.ts +6 -0
  290. package/src/Components/hooks/useJoinGroupCall.ts +69 -0
  291. package/src/Components/hooks/useNetWorkStatus.ts +30 -0
  292. package/src/Components/hooks/usePlayer.ts +32 -0
  293. package/src/Components/hooks/usePopover.ts +6 -0
  294. package/src/Components/hooks/useTip.ts +42 -0
  295. package/src/Components/hooks/useTranslate.ts +7 -0
  296. package/src/Components/hooks/useUserInfoContextExcludeVolume.ts +6 -0
  297. package/src/Components/hooks/useViewBackgroundConfig.ts +12 -0
  298. package/src/Components/util/deepClone.ts +15 -0
  299. package/src/Components/util/findValues.ts +21 -0
  300. package/src/Components/util/index.ts +6 -0
  301. package/src/Components/util/isEmpty.ts +15 -0
  302. package/src/Components/util/isEqual.ts +40 -0
  303. package/src/Components/util/isObject.ts +3 -0
  304. package/src/Components/util/stringToPath.ts +78 -0
  305. package/src/Components/util/toggleScreen.ts +10 -0
  306. package/src/Components/util/uiConfig.ts +74 -0
  307. package/src/TUICallService/CallService/UIDesign.ts +174 -0
  308. package/src/TUICallService/CallService/bellContext.ts +88 -0
  309. package/src/TUICallService/CallService/chatCombine.ts +313 -0
  310. package/src/TUICallService/CallService/engineEventHandler.ts +404 -0
  311. package/src/TUICallService/CallService/index.ts +799 -0
  312. package/src/TUICallService/CallService/miniProgram.ts +65 -0
  313. package/src/TUICallService/CallService/utils.ts +281 -0
  314. package/src/TUICallService/TUIGlobal/tuiGlobal.ts +43 -0
  315. package/src/TUICallService/TUIStore/callStore.ts +93 -0
  316. package/src/TUICallService/TUIStore/tuiStore.ts +167 -0
  317. package/src/TUICallService/assets/phone_dialing.mp3 +0 -0
  318. package/src/TUICallService/assets/phone_ringing.mp3 +0 -0
  319. package/src/TUICallService/const/call.ts +157 -0
  320. package/src/TUICallService/const/error.ts +20 -0
  321. package/src/TUICallService/const/index.ts +103 -0
  322. package/src/TUICallService/const/log.ts +9 -0
  323. package/src/TUICallService/index.ts +37 -0
  324. package/src/TUICallService/interface/ICallService.ts +70 -0
  325. package/src/TUICallService/interface/ICallStore.ts +55 -0
  326. package/src/TUICallService/interface/ITUIGlobal.ts +36 -0
  327. package/src/TUICallService/interface/ITUIStore.ts +87 -0
  328. package/src/TUICallService/interface/index.ts +4 -0
  329. package/src/TUICallService/locales/en.ts +135 -0
  330. package/src/TUICallService/locales/index.ts +57 -0
  331. package/src/TUICallService/locales/ja_JP.ts +134 -0
  332. package/src/TUICallService/locales/zh-cn.ts +130 -0
  333. package/src/TUICallService/serve/callManager.ts +109 -0
  334. package/src/TUICallService/utils/common-utils.ts +269 -0
  335. package/src/TUICallService/utils/decorators/promise-retry.ts +51 -0
  336. package/src/TUICallService/utils/env.ts +51 -0
  337. package/src/TUICallService/utils/index.ts +32 -0
  338. package/src/TUICallService/utils/is-empty.ts +31 -0
  339. package/src/TUICallService/utils/retry.ts +88 -0
  340. package/src/TUICallService/utils/timer.ts +162 -0
  341. package/src/TUICallService/utils/validate/avoidRepeatedCall.ts +39 -0
  342. package/src/TUICallService/utils/validate/index.ts +7 -0
  343. package/src/adapter-vue.ts +4 -0
  344. package/src/index.ts +65 -0
  345. package/stats.html +4949 -0
  346. package/tuicall-uikit-vue.es.js +8568 -0
  347. package/tuicall-uikit-vue.umd.js +2 -0
  348. package/types/Components/assets/desktop/permission/index.d.ts +5 -0
  349. package/types/Components/assets/permission/desktop/index.d.ts +5 -0
  350. package/types/Components/components/SingleCall/hooks/useGetLargeViewName.d.ts +2 -0
  351. package/types/Components/components/base/Avatar/Avatar.d.ts +34 -0
  352. package/types/Components/components/base/Button/Button.d.ts +56 -0
  353. package/types/Components/components/base/Grid/Grid.d.ts +23 -0
  354. package/types/Components/components/base/Icon/Icon.d.ts +9 -0
  355. package/types/Components/components/base/Layout/Col/Col.d.ts +20 -0
  356. package/types/Components/components/base/Layout/Row/Row.d.ts +20 -0
  357. package/types/Components/components/base/Layout/constant.d.ts +1 -0
  358. package/types/Components/components/base/Loading/Circle/Circle.d.ts +13 -0
  359. package/types/Components/components/base/Loading/Dot/Dot.d.ts +13 -0
  360. package/types/Components/components/base/Loading/Loading.d.ts +26 -0
  361. package/types/Components/components/base/Message/Message.d.ts +50 -0
  362. package/types/Components/components/base/Overlay/Overlay.d.ts +45 -0
  363. package/types/Components/components/base/Popover/Popover.d.ts +34 -0
  364. package/types/Components/components/base/Popover/utils/calculatePosition.d.ts +4 -0
  365. package/types/Components/components/base/Portal/Portal.d.ts +14 -0
  366. package/types/Components/components/base/TKImage/TKImage.d.ts +33 -0
  367. package/types/Components/components/base/TKText/TKText.d.ts +24 -0
  368. package/types/Components/components/base/ToggleWindow/ToggleWindow.d.ts +18 -0
  369. package/types/Components/components/base/ToggleWindow/ToggleWindowItem/ToggleWindowItem.d.ts +5 -0
  370. package/types/Components/components/base/ToggleWindow/constant.d.ts +1 -0
  371. package/types/Components/components/base/constants/index.d.ts +7 -0
  372. package/types/Components/components/base/hooks/useListenerEvent.d.ts +13 -0
  373. package/types/Components/components/base/hooks/useOnClickOutSide.d.ts +1 -0
  374. package/types/Components/components/base/util/checkEnv.d.ts +10 -0
  375. package/types/Components/components/base/util/checkVueVersion.d.ts +4 -0
  376. package/types/Components/components/base/util/classNames.d.ts +1 -0
  377. package/types/Components/components/base/util/filterObject.d.ts +1 -0
  378. package/types/Components/components/base/util/index.d.ts +5 -0
  379. package/types/Components/components/common/AudioStream/AudioStream.d.ts +29 -0
  380. package/types/Components/components/common/Button/hooks/useConfig.d.ts +2 -0
  381. package/types/Components/components/common/Button/props/Button.d.ts +15 -0
  382. package/types/Components/components/common/ButtonPanel/config/InitConfig.d.ts +89 -0
  383. package/types/Components/components/common/ButtonPanel/config/VirtualBackgroundMobileConfig.d.ts +66 -0
  384. package/types/Components/components/common/ButtonPanel/hooks/useButtonPanelLayout.d.ts +4 -0
  385. package/types/Components/components/common/DeviceSelect/DeviceSelect.d.ts +11 -0
  386. package/types/Components/components/common/MicrophoneVolume/MicrophoneVolume.d.ts +10 -0
  387. package/types/Components/components/common/OverlayStream/OverlayStream.d.ts +92 -0
  388. package/types/Components/components/common/PermitTip/PermitTip.d.ts +3 -0
  389. package/types/Components/components/common/Player/Player.d.ts +18 -0
  390. package/types/Components/components/common/Pusher/Pusher.d.ts +18 -0
  391. package/types/Components/components/common/SelectUser/index.d.ts +6 -0
  392. package/types/Components/components/common/Swiper/index.d.ts +7 -0
  393. package/types/Components/components/common/Swiper/useSlide.d.ts +7 -0
  394. package/types/Components/components/common/Swiper/useSwiperSliders.d.ts +1 -0
  395. package/types/Components/components/common/SwiperWx/index.d.ts +4 -0
  396. package/types/Components/components/common/TKStreamInfo/StreamInfo.d.ts +34 -0
  397. package/types/Components/components/common/Timer/Timer.d.ts +14 -0
  398. package/types/Components/components/common/Tip/Tip.d.ts +5 -0
  399. package/types/Components/components/common/Toast/Toast.d.ts +4 -0
  400. package/types/Components/components/common/Toast/index.d.ts +2 -0
  401. package/types/Components/components/common/Toast/type.d.ts +16 -0
  402. package/types/Components/components/common/TopBar/TopBar.d.ts +8 -0
  403. package/types/Components/components/config/button/ClosedPanelUI.d.ts +3380 -0
  404. package/types/Components/components/config/button/DefaultUI.d.ts +14751 -0
  405. package/types/Components/components/config/button/index.d.ts +2 -0
  406. package/types/Components/context/ButtonPanelContext.d.ts +4 -0
  407. package/types/Components/context/CallInfoContext.d.ts +13 -0
  408. package/types/Components/context/CallerUserInfoContext.d.ts +8 -0
  409. package/types/Components/context/CustomUIConfigContext.d.ts +1 -0
  410. package/types/Components/context/FloatWindowContext.d.ts +4 -0
  411. package/types/Components/context/FocusItemContext.d.ts +1 -0
  412. package/types/Components/context/IsClickableContext.d.ts +1 -0
  413. package/types/Components/context/PopoverContext.d.ts +1 -0
  414. package/types/Components/context/TranslateContext.d.ts +1 -0
  415. package/types/Components/context/UserInfoContextExcludeVolume.d.ts +6 -0
  416. package/types/Components/context/index.d.ts +10 -0
  417. package/types/Components/hooks/index.d.ts +20 -0
  418. package/types/Components/hooks/useButtonPanelStatus.d.ts +2 -0
  419. package/types/Components/hooks/useCallDuration.d.ts +3 -0
  420. package/types/Components/hooks/useCallInfoContext.d.ts +2 -0
  421. package/types/Components/hooks/useCallerUserInfoContext.d.ts +2 -0
  422. package/types/Components/hooks/useCustomUI.d.ts +3 -0
  423. package/types/Components/hooks/useCustomUIButtonConfig.d.ts +1 -0
  424. package/types/Components/hooks/useDeviceList.d.ts +7 -0
  425. package/types/Components/hooks/useFloatWindowContext.d.ts +2 -0
  426. package/types/Components/hooks/useFocusContext.d.ts +1 -0
  427. package/types/Components/hooks/useGetVolumeMap.d.ts +1 -0
  428. package/types/Components/hooks/useGroupCallLayout.d.ts +1 -0
  429. package/types/Components/hooks/useIsClickableContext.d.ts +2 -0
  430. package/types/Components/hooks/useJoinGroupCall.d.ts +9 -0
  431. package/types/Components/hooks/useNetWorkStatus.d.ts +3 -0
  432. package/types/Components/hooks/usePlayer.d.ts +1 -0
  433. package/types/Components/hooks/usePopover.d.ts +2 -0
  434. package/types/Components/hooks/useTip.d.ts +5 -0
  435. package/types/Components/hooks/useTranslate.d.ts +2 -0
  436. package/types/Components/hooks/useUserInfoContextExcludeVolume.d.ts +2 -0
  437. package/types/Components/hooks/useViewBackgroundConfig.d.ts +1 -0
  438. package/types/Components/util/deepClone.d.ts +1 -0
  439. package/types/Components/util/findValues.d.ts +1 -0
  440. package/types/Components/util/index.d.ts +6 -0
  441. package/types/Components/util/isEmpty.d.ts +1 -0
  442. package/types/Components/util/isEqual.d.ts +1 -0
  443. package/types/Components/util/isObject.d.ts +1 -0
  444. package/types/Components/util/stringToPath.d.ts +12 -0
  445. package/types/Components/util/toggleScreen.d.ts +1 -0
  446. package/types/Components/util/uiConfig.d.ts +3 -0
  447. package/types/TUICallService/CallService/UIDesign.d.ts +28 -0
  448. package/types/TUICallService/CallService/bellContext.d.ts +19 -0
  449. package/types/TUICallService/CallService/chatCombine.d.ts +50 -0
  450. package/types/TUICallService/CallService/engineEventHandler.d.ts +35 -0
  451. package/types/TUICallService/CallService/index.d.ts +98 -0
  452. package/types/TUICallService/CallService/miniProgram.d.ts +7 -0
  453. package/types/TUICallService/CallService/utils.d.ts +42 -0
  454. package/types/TUICallService/TUIGlobal/tuiGlobal.d.ts +21 -0
  455. package/types/TUICallService/TUIStore/callStore.d.ts +10 -0
  456. package/types/TUICallService/TUIStore/tuiStore.d.ts +57 -0
  457. package/types/TUICallService/const/call.d.ts +141 -0
  458. package/types/TUICallService/const/error.d.ts +2 -0
  459. package/types/TUICallService/const/index.d.ts +27 -0
  460. package/types/TUICallService/const/log.d.ts +7 -0
  461. package/types/TUICallService/index.d.ts +5 -0
  462. package/types/TUICallService/interface/ICallService.d.ts +69 -0
  463. package/types/TUICallService/interface/ICallStore.d.ts +47 -0
  464. package/types/TUICallService/interface/ITUIGlobal.d.ts +36 -0
  465. package/types/TUICallService/interface/ITUIStore.d.ts +83 -0
  466. package/types/TUICallService/interface/index.d.ts +4 -0
  467. package/types/TUICallService/locales/en.d.ts +128 -0
  468. package/types/TUICallService/locales/index.d.ts +10 -0
  469. package/types/TUICallService/locales/ja_JP.d.ts +127 -0
  470. package/types/TUICallService/locales/zh-cn.d.ts +123 -0
  471. package/types/TUICallService/serve/callManager.d.ts +11 -0
  472. package/types/TUICallService/utils/common-utils.d.ts +62 -0
  473. package/types/TUICallService/utils/decorators/promise-retry.d.ts +32 -0
  474. package/types/TUICallService/utils/env.d.ts +10 -0
  475. package/types/TUICallService/utils/index.d.ts +2 -0
  476. package/types/TUICallService/utils/is-empty.d.ts +2 -0
  477. package/types/TUICallService/utils/retry.d.ts +36 -0
  478. package/types/TUICallService/utils/timer.d.ts +64 -0
  479. package/types/TUICallService/utils/validate/avoidRepeatedCall.d.ts +10 -0
  480. package/types/TUICallService/utils/validate/index.d.ts +2 -0
  481. package/types/adapter-vue.d.ts +4 -0
  482. package/types/index.d.ts +11 -0
  483. package/types/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,799 @@
1
+ import {
2
+ IUserInfo, ICallbackParam, ISelfInfoParams, IBellParams, IInviteUserParams, IInitParams, ICallsParams,
3
+ } from '../interface/ICallService';
4
+ import {
5
+ StoreName, CallStatus, CallMediaType, NAME, CALL_DATA_KEY, LanguageType, CallRole, LOG_LEVEL, VideoDisplayMode,
6
+ VideoResolution, StatusChange, AudioPlayBackDevice, CameraPosition, COMPONENT, FeatureButton, ButtonState,
7
+ LayoutMode, DEFAULT_BLUR_LEVEL,
8
+ } from '../const/index';
9
+ // @ts-ignore
10
+ import { TUICallEngine } from '@trtc/call-engine-lite-js';
11
+ import { checkLocalMP3FileExists } from '../utils/index';
12
+ import { CallTips, t } from '../locales/index';
13
+ import { BellContext } from './bellContext';
14
+ import { avoidRepeatedCall } from '../utils/validate/index';
15
+ import { handleRepeatedCallError, formatTime, performanceNow, initBrowserCloseDetection } from '../utils/common-utils';
16
+ import { getRemoteUserProfile, generateStatusChangeText, noDevicePermissionToast, setLocalUserInfoAudioVideoAvailable,
17
+ getGroupMemberList, getGroupProfile, updateRoomIdAndRoomIdType, updateDeviceList } from './utils';
18
+ import timer from '../utils/timer';
19
+ import { ITUIGlobal, ITUIStore } from '../interface/index';
20
+ import TuiGlobal from '../TUIGlobal/tuiGlobal';
21
+ import TuiStore from '../TUIStore/tuiStore';
22
+ import { UIDesign } from './UIDesign';
23
+ import ChatCombine from './chatCombine';
24
+ import EngineEventHandler from './engineEventHandler';
25
+ const TUIGlobal: ITUIGlobal = TuiGlobal.getInstance();
26
+ const TUIStore: ITUIStore = TuiStore.getInstance();
27
+ const uiDesign = UIDesign.getInstance();
28
+ uiDesign.setTUIStore(TUIStore);
29
+ const version = '4.1.0';
30
+ const frameWork = 'vue3';
31
+ export { TUIGlobal, TUIStore, uiDesign };
32
+
33
+ export default class TUICallService {
34
+ static instance: TUICallService;
35
+ public _tuiCallEngine: any;
36
+ private _tim: any = null;
37
+ private _TUICore: any = null;
38
+ private _timerId: number = -1;
39
+ private _startTimeStamp: number = performanceNow();
40
+ private _bellContext: any = null;
41
+ private _isFromChat: boolean = false;
42
+ private _currentGroupId: string = ''; // The currentGroupId of the group chat that the user is currently in
43
+ private _offlinePushInfo = null;
44
+ private _permissionCheckTimer: any = null;
45
+ private _chatCombine: any = null;
46
+ private _engineEventHandler: any = null;
47
+
48
+ constructor() {
49
+ console.log(`${NAME.PREFIX}version: ${version}`);
50
+ this._watchTUIStore();
51
+ this._engineEventHandler = EngineEventHandler.getInstance({ callService: this });
52
+
53
+ this._chatCombine = ChatCombine.getInstance({ callService: this });
54
+ initBrowserCloseDetection(this.handleExceptionExit.bind(this));
55
+ }
56
+ static getInstance() {
57
+ if (!TUICallService.instance) {
58
+ TUICallService.instance = new TUICallService();
59
+ }
60
+ return TUICallService.instance;
61
+ }
62
+ @avoidRepeatedCall()
63
+ public async init(params: IInitParams) {
64
+ try {
65
+ if (this._tuiCallEngine) return;
66
+ // @ts-ignore
67
+ let { userID, tim, userSig, sdkAppID, SDKAppID, isFromChat, component = COMPONENT.TUI_CALL_KIT } = params;
68
+ if (this._TUICore) {
69
+ sdkAppID = this._TUICore.SDKAppID;
70
+ tim = this._TUICore.tim;
71
+ }
72
+ this._tim = tim;
73
+ console.log(`${NAME.PREFIX}init sdkAppId: ${sdkAppID || SDKAppID}, userId: ${userID}`);
74
+
75
+ let scene = `web`;
76
+ scene = `${scene}-${frameWork}`;
77
+ // To distinguish whether the UniApp mini-program chooses Vue 2 or Vue 3
78
+
79
+ console.warn(`场景 scene: ${scene}`);
80
+
81
+ this._tuiCallEngine = TUICallEngine.createInstance({
82
+ tim,
83
+ SDKAppID: sdkAppID || SDKAppID, // 兼容传入 SDKAppID 的问题
84
+ frameWork,
85
+ // @ts-ignore
86
+ language: 6,
87
+ callkitVersion: version,
88
+ isFromChat: isFromChat || false,
89
+ component,
90
+ scene,
91
+ });
92
+ uiDesign.setEngineInstance(this._tuiCallEngine);
93
+ this._addListenTuiCallEngineEvent();
94
+ this._bellContext = new BellContext();
95
+ TUIStore.update(StoreName.CALL, NAME.LOCAL_USER_INFO, { userId: userID });
96
+ TUIStore.update(StoreName.CALL, NAME.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { userId: userID });
97
+ uiDesign.updateViewBackgroundUserId('local');
98
+ await this._tuiCallEngine.login({ userID, userSig, assetsPath: '' }); // web && mini
99
+ const uiConfig = TUIStore.getData(StoreName.CALL, NAME.CUSTOM_UI_CONFIG);
100
+ this._tuiCallEngine?.reportLog?.({
101
+ name: 'TUICallkit.init',
102
+ data: {
103
+ uiConfig,
104
+ }
105
+ });
106
+ } catch (error) {
107
+ console.error(`${NAME.PREFIX}init failed, error: ${error}.`);
108
+ throw error;
109
+ }
110
+ }
111
+ // component destroy
112
+ public async destroyed() {
113
+ try {
114
+ const currentCallStatus = TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS);
115
+ if (currentCallStatus !== CallStatus.IDLE) {
116
+ throw new Error(`please destroyed when status is idle, current status: ${currentCallStatus}`);
117
+ }
118
+ if (this._tuiCallEngine) {
119
+ this._removeListenTuiCallEngineEvent();
120
+ await this._tuiCallEngine.destroyInstance();
121
+ this._tuiCallEngine = null;
122
+ }
123
+ this._bellContext?.destroy();
124
+ this._bellContext = null;
125
+ } catch (error) {
126
+ console.error(`${NAME.PREFIX}destroyed failed, error: ${error}.`);
127
+ throw error;
128
+ }
129
+ }
130
+ // ===============================【通话操作】===============================
131
+ @avoidRepeatedCall()
132
+ public async inviteUser(params: IInviteUserParams) {
133
+ if (TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS) === CallStatus.IDLE) return; // avoid double click when application stuck
134
+ try {
135
+ const { userIDList } = params;
136
+ let inviteUserInfoList = await getRemoteUserProfile(userIDList, this.getTim());
137
+ const remoteUserInfoList = TUIStore.getData(StoreName.CALL, NAME.REMOTE_USER_INFO_LIST);
138
+ const userIDListNotInRemoteUserInfoList = userIDList.filter(userId => {
139
+ return !remoteUserInfoList.some(remoteUserInfo => remoteUserInfo.userId === userId);
140
+ });
141
+ if (userIDListNotInRemoteUserInfoList.length === 0) {
142
+ return;
143
+ }
144
+ TUIStore.update(StoreName.CALL, NAME.REMOTE_USER_INFO_LIST, [...remoteUserInfoList, ...inviteUserInfoList]);
145
+ TUIStore.update(StoreName.CALL, NAME.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, [...remoteUserInfoList, ...inviteUserInfoList]);
146
+ this._tuiCallEngine && await this._tuiCallEngine.inviteUser(params);
147
+ } catch (error: any) {
148
+ console.error(`${NAME.PREFIX}inviteUser failed, error: ${error}.`);
149
+ }
150
+ }
151
+ @avoidRepeatedCall()
152
+ public async calls(callsParams: ICallsParams) {
153
+ if (TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS) !== CallStatus.IDLE) return; // avoid double click when application stuck
154
+ try {
155
+ const { userIDList, type, chatGroupID, offlinePushInfo } = callsParams;
156
+ if (TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS) !== CallStatus.IDLE) return;
157
+ const remoteUserInfoList = userIDList.map(userId => ({ userId }));
158
+ await this._updateCallStoreBeforeCall(type, remoteUserInfoList, chatGroupID);
159
+ this.executeExternalBeforeCalling();
160
+ callsParams.offlinePushInfo = { ...this.getDefaultOfflinePushInfo(), ...offlinePushInfo };
161
+ const response = await this._tuiCallEngine.calls(callsParams);
162
+ await this._updateCallStoreAfterCall(userIDList, response);
163
+ } catch (error: any) {
164
+ this._handleCallError(error, 'calls');
165
+ }
166
+ }
167
+ @avoidRepeatedCall()
168
+ public async join(params) {
169
+ if (TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS) === CallStatus.CONNECTED) return; // avoid double click when application stuck
170
+ try {
171
+ const response = await this._tuiCallEngine.join(params);
172
+ TUIStore.update(StoreName.CALL, NAME.IS_CLICKABLE, true);
173
+ this.startTimer();
174
+
175
+ const updateStoreParams = {
176
+ [NAME.CALL_ROLE]: CallRole.CALLEE,
177
+ [NAME.IS_GROUP]: true,
178
+ [NAME.CALL_STATUS]: CallStatus.CONNECTED,
179
+ [NAME.CALL_MEDIA_TYPE]: TUIStore.getData(StoreName.CALL, NAME.CALL_MEDIA_TYPE) || CallMediaType.AUDIO, // default audio callMediaType
180
+ };
181
+ TUIStore.updateStore(updateStoreParams, StoreName.CALL);
182
+
183
+ updateDeviceList(this._tuiCallEngine);;
184
+ await this._tuiCallEngine.setVideoQuality(TUIStore.getData(StoreName.CALL, NAME.VIDEO_RESOLUTION));
185
+ const localUserInfo = TUIStore.getData(StoreName.CALL, NAME.LOCAL_USER_INFO);
186
+ TUIStore.update(StoreName.CALL, NAME.LOCAL_USER_INFO, { ...localUserInfo, isEnter: true });
187
+ TUIStore.update(StoreName.CALL, NAME.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...localUserInfo, isEnter: true });
188
+
189
+ await this.openMicrophone();
190
+ setLocalUserInfoAudioVideoAvailable(true, NAME.AUDIO);
191
+
192
+ // // Current policy: By default, the camera remains off when joining GroupCall
193
+ // if (TUIStore.getData(StoreName.CALL, NAME.CALL_MEDIA_TYPE) === CallMediaType.VIDEO) {
194
+ // await this.openCamera(NAME.LOCAL_VIDEO);
195
+ // setLocalUserInfoAudioVideoAvailable(true, NAME.VIDEO);
196
+ // }
197
+ } catch (error) {
198
+ this._handleCallError(error, 'join');
199
+ }
200
+ }
201
+ // ===============================【其它对外接口】===============================
202
+ public getTUICallEngineInstance(): any {
203
+ return this?._tuiCallEngine || null;
204
+ }
205
+ public setLogLevel(level: LOG_LEVEL) {
206
+ this?._tuiCallEngine?.setLogLevel(level);
207
+ }
208
+ public setLanguage(language: string) {
209
+ if (language && Object.values(LanguageType).includes(language as LanguageType)) {
210
+ TUIStore.update(StoreName.CALL, NAME.LANGUAGE, language);
211
+ TUIStore.update(StoreName.CALL, NAME.TRANSLATE, t.bind(null));
212
+ }
213
+ }
214
+ public enableFloatWindow(enable: boolean) {
215
+ TUIStore.update(StoreName.CALL, NAME.ENABLE_FLOAT_WINDOW, enable);
216
+ }
217
+ public async setSelfInfo(params: ISelfInfoParams) {
218
+ const { nickName, avatar } = params;
219
+ try {
220
+ await this._tuiCallEngine.setSelfInfo({ nickName, avatar });
221
+ } catch (error) {
222
+ console.error(`${NAME.PREFIX}setSelfInfo failed, error: ${error}.`);
223
+ }
224
+ }
225
+ public async enableVirtualBackground(enable: boolean) {
226
+ TUIStore.update(StoreName.CALL, NAME.IS_SHOW_ENABLE_VIRTUAL_BACKGROUND, enable);
227
+ }
228
+ public async enableAIVoice(enable: boolean) {
229
+ try {
230
+ await this._tuiCallEngine.enableAIVoice(enable);
231
+ console.log(`${NAME.PREFIX}enableAIVoice: ${enable}.`);
232
+ } catch (error: any) {
233
+ console.error(`${NAME.PREFIX}enableAIVoice failed, error: ${error}.`);
234
+ throw error;
235
+ }
236
+ }
237
+ // 修改默认铃声:只支持本地铃声文件,不支持在线铃声文件;修改铃声修改的是被叫的铃声
238
+ public async setCallingBell(filePath?: string) {
239
+ let isCheckFileExist: boolean = true;
240
+ isCheckFileExist = await checkLocalMP3FileExists(filePath);
241
+ if (!isCheckFileExist) {
242
+ console.warn(`${NAME.PREFIX}setCallingBell failed, filePath: ${filePath}.`);
243
+ return ;
244
+ }
245
+ const bellParams: IBellParams = { calleeBellFilePath: filePath };
246
+ this._bellContext.setBellProperties(bellParams);
247
+ }
248
+ public async enableMuteMode(enable: boolean) {
249
+ try {
250
+ const bellParams: IBellParams = { isMuteBell: enable };
251
+ this._bellContext.setBellProperties(bellParams);
252
+ await this._bellContext.setBellMute(enable);
253
+ } catch (error) {
254
+ console.warn(`${NAME.PREFIX}enableMuteMode failed, error: ${error}.`);
255
+ }
256
+ }
257
+ public hideFeatureButton(buttonName: FeatureButton) {
258
+ uiDesign.hideFeatureButton(buttonName);
259
+ }
260
+ public setLocalViewBackgroundImage(url: string) {
261
+ uiDesign.setLocalViewBackgroundImage(url);
262
+ }
263
+ public setRemoteViewBackgroundImage(userId: string, url: string) {
264
+ uiDesign.setRemoteViewBackgroundImage(userId, url);
265
+ }
266
+ public setLayoutMode(layoutMode: LayoutMode) {
267
+ uiDesign.setLayoutMode(layoutMode);
268
+ }
269
+ public setCameraDefaultState(isOpen: boolean) {
270
+ uiDesign.setCameraDefaultState(isOpen);
271
+ }
272
+ // =============================【实验性接口】=============================
273
+ public callExperimentalAPI(jsonStr: string) {
274
+ const jsonObj = JSON.parse(jsonStr);
275
+ if (jsonObj === jsonStr) return;
276
+
277
+ const { api, params } = jsonObj;
278
+ if (!api || !params) return;
279
+
280
+ try {
281
+ switch(api) {
282
+ case 'forceUseV2API':
283
+ const { enable } = params;
284
+ TUIStore.update(StoreName.CALL, NAME.IS_FORCE_USE_V2_API, !!enable);
285
+ break;
286
+ default:
287
+ break;
288
+ }
289
+ } catch (error) {
290
+ this._tuiCallEngine?.reportLog?.({ name: 'TUICallKit.callExperimentalAPI.fail', data: { error } });
291
+ }
292
+ }
293
+ // =============================【内部按钮操作方法】=============================
294
+ @avoidRepeatedCall()
295
+ public async accept() {
296
+ const callStatus = TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS);
297
+ this._tuiCallEngine?.reportLog?.({
298
+ name: 'TUICallKit.accept.start',
299
+ data: { callStatus },
300
+ });
301
+ if (callStatus === CallStatus.CONNECTED) return; // avoid double click when application stuck, especially for miniProgram
302
+ try {
303
+ TUIStore.update(StoreName.CALL, NAME.CALL_STATUS, CallStatus.CONNECTED);
304
+ updateDeviceList(this._tuiCallEngine);;
305
+ const response = await this._tuiCallEngine.accept();
306
+ if (response) {
307
+ this._chatCombine?.callTUIService({ message: response?.data?.message });
308
+ TUIStore.update(StoreName.CALL, NAME.IS_CLICKABLE, true);
309
+ this.startTimer();
310
+ const callMediaType = TUIStore.getData(StoreName.CALL, NAME.CALL_MEDIA_TYPE);
311
+ const isCameraDefaultStateClose = this._getFeatureButtonDefaultState(FeatureButton.Camera) === ButtonState.Close;
312
+ (callMediaType === CallMediaType.VIDEO) && !isCameraDefaultStateClose && await this.openCamera(NAME.LOCAL_VIDEO);
313
+ await this._tuiCallEngine.setVideoQuality(TUIStore.getData(StoreName.CALL, NAME.VIDEO_RESOLUTION));
314
+ const localUserInfo = TUIStore.getData(StoreName.CALL, NAME.LOCAL_USER_INFO);
315
+ TUIStore.update(StoreName.CALL, NAME.LOCAL_USER_INFO, { ...localUserInfo, isEnter: true });
316
+ TUIStore.update(StoreName.CALL, NAME.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...localUserInfo, isEnter: true });
317
+ setLocalUserInfoAudioVideoAvailable(true, NAME.AUDIO); // web && mini default open audio
318
+ }
319
+ } catch (error) {
320
+ this._tuiCallEngine?.reportLog?.({
321
+ name: 'TUICallKit.accept.fail',
322
+ level: 'error',
323
+ error,
324
+ });
325
+ if (handleRepeatedCallError(error)) return;
326
+ noDevicePermissionToast(error, CallMediaType.AUDIO, this._tuiCallEngine);
327
+ this._resetCallStore();
328
+ }
329
+ }
330
+ @avoidRepeatedCall()
331
+ public async hangup() {
332
+ if (TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS) === CallStatus.IDLE) return; // avoid double click when application stuck
333
+ try {
334
+ const response = await this._tuiCallEngine.hangup();
335
+ response?.forEach((item) => {
336
+ if (item?.code === 0) {
337
+ this._chatCombine?.callTUIService({ message: item?.data?.message });
338
+ }
339
+ });
340
+ } catch (error) {
341
+ console.debug(error);
342
+ }
343
+ this._resetCallStore();
344
+ }
345
+ @avoidRepeatedCall()
346
+ public async reject() {
347
+ if (TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS) === CallStatus.IDLE) return; // avoid double click when application stuck
348
+ try {
349
+ const response = await this._tuiCallEngine.reject();
350
+ if (response?.code === 0) {
351
+ this._chatCombine?.callTUIService({ message: response?.data?.message });
352
+ }
353
+ } catch (error) {
354
+ console.debug(error);
355
+ }
356
+ this._resetCallStore();
357
+ }
358
+ @avoidRepeatedCall()
359
+ public async openCamera(videoViewDomID: string) {
360
+ try {
361
+ if (TUIGlobal.isH5 || TUIGlobal.isWeChat) {
362
+ const currentPosition = TUIStore.getData(StoreName.CALL, NAME.CAMERA_POSITION);
363
+ const isFrontCamera = currentPosition === CameraPosition.FRONT ? true : false;
364
+ this._tuiCallEngine.openCamera(videoViewDomID, isFrontCamera);
365
+ } else {
366
+ await this._tuiCallEngine.openCamera(videoViewDomID);
367
+ }
368
+ setLocalUserInfoAudioVideoAvailable(true, NAME.VIDEO);
369
+ } catch (error: any) {
370
+ noDevicePermissionToast(error, CallMediaType.VIDEO, this._tuiCallEngine);
371
+ console.error(`${NAME.PREFIX}openCamera error: ${error}.`);
372
+ }
373
+ }
374
+ @avoidRepeatedCall()
375
+ public async closeCamera() {
376
+ try {
377
+ await this._tuiCallEngine.closeCamera();
378
+ setLocalUserInfoAudioVideoAvailable(false, NAME.VIDEO);
379
+ } catch (error: any) {
380
+ console.error(`${NAME.PREFIX}closeCamera error: ${error}.`);
381
+ }
382
+ }
383
+ @avoidRepeatedCall()
384
+ public async openMicrophone() {
385
+ try {
386
+ await this._tuiCallEngine.openMicrophone();
387
+ setLocalUserInfoAudioVideoAvailable(true, NAME.AUDIO);
388
+ } catch (error: any) {
389
+ console.error(`${NAME.PREFIX}openMicrophone failed, error: ${error}.`);
390
+ }
391
+ }
392
+ @avoidRepeatedCall()
393
+ public async closeMicrophone() {
394
+ try {
395
+ await this._tuiCallEngine.closeMicrophone();
396
+ setLocalUserInfoAudioVideoAvailable(false, NAME.AUDIO);
397
+ } catch (error: any) {
398
+ console.error(`${NAME.PREFIX}closeMicrophone failed, error: ${error}.`);
399
+ }
400
+ }
401
+ @avoidRepeatedCall()
402
+ public unMuteSpeaker() {
403
+ try {
404
+ const trtcCloudInstance = this._tuiCallEngine?.getTRTCCloudInstance?.();
405
+ if (trtcCloudInstance) {
406
+ trtcCloudInstance.muteAllRemoteAudio(false);
407
+ TUIStore.update(StoreName.CALL, NAME.IS_MUTE_SPEAKER, false);
408
+ }
409
+ } catch (error: any) {
410
+ console.error(`${NAME.PREFIX}unMuteSpeaker failed, error: ${error}.`);
411
+ }
412
+ }
413
+ @avoidRepeatedCall()
414
+ public muteSpeaker() {
415
+ try {
416
+ const trtcCloudInstance = this._tuiCallEngine?.getTRTCCloudInstance?.();
417
+ if (trtcCloudInstance) {
418
+ trtcCloudInstance.muteAllRemoteAudio(true);
419
+ TUIStore.update(StoreName.CALL, NAME.IS_MUTE_SPEAKER, true);
420
+ }
421
+ } catch (error: any) {
422
+ console.error(`${NAME.PREFIX}muteSpeaker failed, error: ${error}.`);
423
+ }
424
+ }
425
+ @avoidRepeatedCall()
426
+ public switchScreen(userId: string) {
427
+ if(!userId) return;
428
+ TUIStore.update(StoreName.CALL, NAME.BIG_SCREEN_USER_ID, userId);
429
+ }
430
+ // support video to audio; not support audio to video
431
+ @avoidRepeatedCall()
432
+ public async switchCallMediaType() {
433
+ try {
434
+ const callMediaType = TUIStore.getData(StoreName.CALL, NAME.CALL_MEDIA_TYPE);
435
+ if (callMediaType === CallMediaType.AUDIO) {
436
+ console.warn(`${NAME.PREFIX}switchCallMediaType failed, ${callMediaType} not support.`);
437
+ return;
438
+ }
439
+ const response = await this._tuiCallEngine.switchCallMediaType(CallMediaType.AUDIO);
440
+ if (response?.code === 0) {
441
+ this._chatCombine?.callTUIService({ message: response?.data?.message });
442
+ }
443
+ TUIStore.update(StoreName.CALL, NAME.CALL_MEDIA_TYPE, CallMediaType.AUDIO);
444
+ const isGroup = TUIStore.getData(StoreName.CALL, NAME.IS_GROUP);
445
+ const oldStatus = isGroup ? StatusChange.CALLING_GROUP_VIDEO : StatusChange.CALLING_C2C_VIDEO;
446
+ const newStatus = generateStatusChangeText();
447
+ this.statusChanged && this.statusChanged({ oldStatus, newStatus });
448
+ } catch (error: any) {
449
+ console.error(`${NAME.PREFIX}switchCallMediaType failed, error: ${error}.`);
450
+ }
451
+ }
452
+ @avoidRepeatedCall()
453
+ public async switchCamera() {
454
+ const currentPosition = TUIStore.getData(StoreName.CALL, NAME.CAMERA_POSITION);
455
+ const targetPosition = currentPosition === CameraPosition.BACK ? CameraPosition.FRONT : CameraPosition.BACK;
456
+ try {
457
+ await this._tuiCallEngine.switchCamera(targetPosition);
458
+ TUIStore.update(StoreName.CALL, NAME.CAMERA_POSITION, targetPosition);
459
+ } catch (error) {
460
+ console.error(`${NAME.PREFIX}_switchCamera failed, error: ${error}.`);
461
+ }
462
+ }
463
+ @avoidRepeatedCall()
464
+ public async setBlurBackground(enable: boolean) {
465
+ try {
466
+ await this._tuiCallEngine.setBlurBackground(enable ? DEFAULT_BLUR_LEVEL : 0); // 0 indicate close blurBackground
467
+ TUIStore.update(StoreName.CALL, NAME.ENABLE_VIRTUAL_BACKGROUND, enable);
468
+ } catch (error) {
469
+ console.error(`${NAME.PREFIX}_setBlurBackground failed, error: ${error}.`);
470
+ }
471
+ }
472
+ @avoidRepeatedCall()
473
+ public async switchDevice(params) {
474
+ try {
475
+ await this._tuiCallEngine.switchDevice(params);
476
+ } catch (error) {
477
+ console.error(`${NAME.PREFIX}_switchDevice failed, error: ${error}.`);
478
+ }
479
+ }
480
+ public async getDeviceList(deviceType: string) {
481
+ try {
482
+ const response = await this._tuiCallEngine.getDeviceList(deviceType);
483
+ return response;
484
+ } catch (error: any) {
485
+ this._handleCallError(error, 'call');
486
+ }
487
+ };
488
+ // ==========================【TUICallEngine 事件处理】==========================
489
+ private _addListenTuiCallEngineEvent() {
490
+ this._engineEventHandler.addListenTuiCallEngineEvent();
491
+ }
492
+ private _removeListenTuiCallEngineEvent() {
493
+ this._engineEventHandler.removeListenTuiCallEngineEvent();
494
+ }
495
+ // ========================【原 Web CallKit 提供的方法】========================
496
+ public beforeCalling: ((...args: any[]) => void) | undefined; // 原来
497
+ public afterCalling: ((...args: any[]) => void) | undefined;
498
+ public onMinimized: ((...args: any[]) => void) | undefined;
499
+ public onMessageSentByMe: ((...args: any[]) => void) | undefined;
500
+ public kickedOut: ((...args: any[]) => void) | undefined;
501
+ public statusChanged: ((...args: any[]) => void) | undefined;
502
+ public setCallback(params: ICallbackParam) {
503
+ const { beforeCalling, afterCalling, onMinimized, onMessageSentByMe, kickedOut, statusChanged } = params;
504
+ beforeCalling && (this.beforeCalling = beforeCalling);
505
+ afterCalling && (this.afterCalling = afterCalling);
506
+ onMinimized && (this.onMinimized = onMinimized);
507
+ onMessageSentByMe && (this.onMessageSentByMe = onMessageSentByMe);
508
+ kickedOut && (this.kickedOut = kickedOut);
509
+ statusChanged && (this.statusChanged = statusChanged);
510
+ }
511
+ public toggleMinimize() {
512
+ const isMinimized = TUIStore.getData(StoreName.CALL, NAME.IS_MINIMIZED);
513
+ TUIStore.update(StoreName.CALL, NAME.IS_MINIMIZED, !isMinimized);
514
+ console.log(`${NAME.PREFIX}toggleMinimize: ${isMinimized} -> ${!isMinimized}.`);
515
+ this.onMinimized && this.onMinimized(isMinimized, !isMinimized);
516
+ }
517
+ public executeExternalBeforeCalling(): void {
518
+ this.beforeCalling && this.beforeCalling();
519
+ }
520
+ public executeExternalAfterCalling(): void {
521
+ this.afterCalling && this.afterCalling();
522
+ }
523
+ // 处理用户异常退出的情况, 小程序 ”右滑“、"左上角退出"; web 页面关闭浏览器或关闭 tab 页面
524
+ public async handleExceptionExit(event?: any) {
525
+ try {
526
+ const callStatus = TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS);
527
+ const callRole = TUIStore.getData(StoreName.CALL, NAME.CALL_ROLE);
528
+ this._tuiCallEngine?.reportLog?.({ name: 'TUICallkit.handleExceptionExit', data: { callStatus, callRole } });
529
+
530
+ if (callStatus === CallStatus.IDLE) return;
531
+ // 在呼叫状态下,被叫调用 reject,主叫调用 hangup
532
+ if (callStatus === CallStatus.CALLING) {
533
+ if (callRole === CallRole.CALLER) {
534
+ await this?.hangup();
535
+ } else {
536
+ await this?.reject();
537
+ }
538
+ }
539
+ if (callStatus === CallStatus.CONNECTED) {
540
+ await this?.hangup();
541
+ }
542
+ this?._resetCallStore();
543
+ } catch (error) {
544
+ console.error(`${NAME.PREFIX} handleExceptionExit failed, error: ${error}.`);
545
+ }
546
+ if (event) {
547
+ event.returnValue = '';
548
+ }
549
+ }
550
+ // ========================【TUICallKit 组件属性设置方法】========================
551
+ public setVideoDisplayMode(displayMode: VideoDisplayMode) {
552
+ TUIStore.update(StoreName.CALL, NAME.DISPLAY_MODE, displayMode);
553
+ }
554
+ public async setVideoResolution(resolution: VideoResolution) {
555
+ try {
556
+ if (!resolution) return;
557
+ TUIStore.update(StoreName.CALL, NAME.VIDEO_RESOLUTION, resolution);
558
+ await this._tuiCallEngine?.setVideoQuality(resolution);
559
+ } catch (error) {
560
+ console.warn(`${NAME.PREFIX}setVideoResolution failed, error: ${error}.`);
561
+ }
562
+ }
563
+ // 通话时长更新
564
+ public startTimer(): void {
565
+ if (this._timerId === -1) {
566
+ this._startTimeStamp = performanceNow();
567
+ this._timerId = timer.run(NAME.TIMEOUT, this._updateCallDuration.bind(this), { delay: 1000 });
568
+ }
569
+ }
570
+ // =========================【private methods for service use】=========================
571
+ // 处理 “呼叫” 抛出的异常
572
+ private _handleCallError(error: any, methodName?: string) {
573
+ this._permissionCheckTimer && clearInterval(this._permissionCheckTimer);
574
+
575
+ if (handleRepeatedCallError(error)) return;
576
+ noDevicePermissionToast(error, CallMediaType.AUDIO, this._tuiCallEngine);
577
+ console.error(`${NAME.PREFIX}${methodName} failed, error: ${error}.`);
578
+ this._resetCallStore();
579
+ throw error;
580
+ }
581
+ private async _updateCallStoreBeforeCall(type: number, remoteUserInfoList: IUserInfo[], groupID?: string): Promise<void> {
582
+ let callTips = CallTips.CALLER_CALLING_MSG;
583
+ if (groupID || TUIStore.getData(StoreName.CALL, NAME.IS_MINIMIZED) || remoteUserInfoList.length > 1) {
584
+ callTips = CallTips.CALLER_GROUP_CALLING_MSG;
585
+ }
586
+
587
+ console.warn(`呼叫前更新 call status: ${(!!groupID || remoteUserInfoList.length > 1)}, ${groupID}, ${JSON.stringify(remoteUserInfoList)}`)
588
+
589
+ let updateStoreParams: any = {
590
+ [NAME.CALL_MEDIA_TYPE]: type,
591
+ [NAME.CALL_ROLE]: CallRole.CALLER,
592
+ [NAME.REMOTE_USER_INFO_LIST]: remoteUserInfoList,
593
+ [NAME.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST]: remoteUserInfoList,
594
+ [NAME.IS_GROUP]: (!!groupID || remoteUserInfoList.length > 1),
595
+ [NAME.CALL_TIPS]: callTips,
596
+ [NAME.GROUP_ID]: groupID
597
+ };
598
+ TUIStore.updateStore({ ...updateStoreParams, [NAME.CALL_STATUS]: CallStatus.CALLING }, StoreName.CALL);
599
+ this.statusChanged && this.statusChanged({
600
+ oldStatus: StatusChange.IDLE,
601
+ newStatus: (groupID || remoteUserInfoList.length > 1) ? StatusChange.DIALING_GROUP : StatusChange.DIALING_C2C,
602
+ });
603
+ updateDeviceList(this._tuiCallEngine);;
604
+ const remoteUserInfoLists = await getRemoteUserProfile(remoteUserInfoList.map(obj => obj.userId), this.getTim());
605
+
606
+ if (remoteUserInfoLists.length > 0) {
607
+ TUIStore.update(StoreName.CALL, NAME.REMOTE_USER_INFO_LIST, remoteUserInfoLists);
608
+ TUIStore.update(StoreName.CALL, NAME.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, remoteUserInfoLists);
609
+ }
610
+
611
+ }
612
+ private async _updateCallStoreAfterCall(userIdList: string[], response: any) {
613
+ if (response) {
614
+ TUIStore.update(StoreName.CALL, NAME.IS_CLICKABLE, true);
615
+ updateRoomIdAndRoomIdType(response?.roomID, response?.strRoomID);
616
+ const callMediaType = TUIStore.getData(StoreName.CALL, NAME.CALL_MEDIA_TYPE);
617
+ if (response.code === 0) {
618
+ this._chatCombine?.callTUIService({ message: response?.data?.message });
619
+ try {
620
+ await this._tuiCallEngine.setVideoQuality(TUIStore.getData(StoreName.CALL, NAME.VIDEO_RESOLUTION));
621
+ } catch (error) {
622
+ console.warn(`${NAME.PREFIX}setVideoQuality failed, error: ${error}.`);
623
+ }
624
+ } else {
625
+ this._resetCallStore();
626
+ return;
627
+ }
628
+ const isCameraDefaultStateClose = this._getFeatureButtonDefaultState(FeatureButton.Camera) === ButtonState.Close;
629
+ (callMediaType === CallMediaType.VIDEO) && !isCameraDefaultStateClose && await this.openCamera(NAME.LOCAL_VIDEO);
630
+ const localUserInfo = TUIStore.getData(StoreName.CALL, NAME.LOCAL_USER_INFO);
631
+ TUIStore.update(StoreName.CALL, NAME.LOCAL_USER_INFO, { ...localUserInfo, isEnter: true });
632
+ TUIStore.update(StoreName.CALL, NAME.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...localUserInfo, isEnter: true });
633
+ setLocalUserInfoAudioVideoAvailable(true, NAME.AUDIO); // web && mini, default open audio
634
+ } else {
635
+ this._permissionCheckTimer && clearInterval(this._permissionCheckTimer);
636
+ this._permissionCheckTimer = null;
637
+ this._resetCallStore();
638
+ }
639
+ }
640
+ private _getFeatureButtonDefaultState(buttonName: FeatureButton) {
641
+ const { button: buttonConfig } = TUIStore.getData(StoreName.CALL, NAME.CUSTOM_UI_CONFIG);
642
+ return buttonConfig?.[buttonName]?.state;
643
+ }
644
+ private _updateCallDuration(): void {
645
+ const callDurationNum = Math.round((performanceNow() - this._startTimeStamp) / 1000); // miniProgram stop timer when background
646
+ const callDurationStr = formatTime(callDurationNum);
647
+ TUIStore.update(StoreName.CALL, NAME.CALL_DURATION, callDurationStr);
648
+ }
649
+ private _stopTimer(): void {
650
+ if (this._timerId !== -1) {
651
+ timer.clearTask(this._timerId);
652
+ this._timerId = -1;
653
+ }
654
+ }
655
+ private _resetCallStore() {
656
+ const oldStatusStr = generateStatusChangeText();
657
+ this._stopTimer();
658
+ // localUserInfo, language 在通话结束后不需要清除
659
+ // callStatus 清除需要通知; isMinimized 也需要通知(basic-vue3 中切小窗关闭后, 再呼叫还是小窗, 因此需要通知到组件侧)
660
+ // isGroup 也不清除(engine 先抛 cancel 事件, 再抛 reject 事件)
661
+ // displayMode、videoResolution 也不能清除, 组件不卸载, 这些属性也需保留, 否则采用默认值.
662
+ // enableFloatWindow 不清除:开启/关闭悬浮窗功能。
663
+ let notResetOrNotifyKeys = Object.keys(CALL_DATA_KEY).filter((key) => {
664
+ switch (CALL_DATA_KEY[key]) {
665
+ case NAME.CALL_STATUS:
666
+ case NAME.LANGUAGE:
667
+ case NAME.IS_GROUP:
668
+ case NAME.DISPLAY_MODE:
669
+ case NAME.VIDEO_RESOLUTION:
670
+ case NAME.ENABLE_FLOAT_WINDOW:
671
+ case NAME.LOCAL_USER_INFO:
672
+ case NAME.IS_SHOW_ENABLE_VIRTUAL_BACKGROUND:
673
+ case NAME.IS_FORCE_USE_V2_API:
674
+ case NAME.LOCAL_USER_INFO_EXCLUDE_VOLUMN: {
675
+ return false;
676
+ }
677
+ default: {
678
+ return true;
679
+ }
680
+ }
681
+ });
682
+ notResetOrNotifyKeys = notResetOrNotifyKeys.map(key => CALL_DATA_KEY[key]);
683
+ TUIStore.reset(StoreName.CALL, notResetOrNotifyKeys);
684
+ const callStatus = TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS);
685
+ callStatus !== CallStatus.IDLE && TUIStore.reset(StoreName.CALL, [NAME.CALL_STATUS], true); // callStatus reset need notify
686
+ TUIStore.reset(StoreName.CALL, [NAME.IS_MINIMIZED], true); // isMinimized reset need notify
687
+ TUIStore.reset(StoreName.CALL, [NAME.IS_EAR_PHONE], true); // isEarPhone reset need notify
688
+ TUIStore.reset(StoreName.CALL, [NAME.ENABLE_VIRTUAL_BACKGROUND], true); // ENABLE_VIRTUAL_BACKGROUND reset need notify
689
+ TUIStore.reset(StoreName.CALL, [NAME.IS_MUTE_SPEAKER], true); // IS_MUTE_SPEAKER reset need notify
690
+ TUIStore.update(StoreName.CALL, NAME.LOCAL_USER_INFO, {
691
+ ...TUIStore.getData(StoreName.CALL, NAME.LOCAL_USER_INFO),
692
+ isVideoAvailable: false,
693
+ isAudioAvailable: false,
694
+ });
695
+ TUIStore.update(StoreName.CALL, NAME.LOCAL_USER_INFO_EXCLUDE_VOLUMN, {
696
+ ...TUIStore.getData(StoreName.CALL, NAME.LOCAL_USER_INFO_EXCLUDE_VOLUMN),
697
+ isVideoAvailable: false,
698
+ isAudioAvailable: false,
699
+ });
700
+ TUIStore.update(StoreName.CALL, NAME.REMOTE_USER_INFO_LIST, []);
701
+ TUIStore.update(StoreName.CALL, NAME.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, []);
702
+ TUIStore.update(StoreName.CALL, NAME.CAMERA_POSITION, CameraPosition.FRONT);
703
+
704
+ const newStatusStr = generateStatusChangeText();
705
+ if (oldStatusStr !== newStatusStr) {
706
+ this.statusChanged && this.statusChanged({ oldStatus: oldStatusStr, newStatus: newStatusStr });
707
+ }
708
+ }
709
+ // =========================【Calling the Chat SDK APi】=========================
710
+ // 获取群成员
711
+ public async getGroupMemberList(count: number, offset: number) {
712
+ const groupID = TUIStore.getData(StoreName.CALL, NAME.GROUP_ID);
713
+ let groupMemberList = await getGroupMemberList(groupID, this.getTim(), count, offset);
714
+ return groupMemberList;
715
+ }
716
+ // 获取群信息
717
+ public async getGroupProfile() {
718
+ const groupID: string = TUIStore.getData(StoreName.CALL, NAME.GROUP_ID);
719
+ return await getGroupProfile(groupID, this.getTim());
720
+ }
721
+ // =========================【监听 TUIStore 中的状态及处理】=========================
722
+ private _handleCallStatusChange = async (value: CallStatus) => {
723
+ try {
724
+ const bellParams: IBellParams = {
725
+ callRole: TUIStore.getData(StoreName.CALL, NAME.CALL_ROLE),
726
+ callStatus: TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS),
727
+ };
728
+ this._bellContext.setBellProperties(bellParams);
729
+ if (value === CallStatus.CALLING) {
730
+ await this?._bellContext?.play();
731
+ } else {
732
+ // 状态变更通知
733
+ if (value === CallStatus.CONNECTED) {
734
+ const isGroup = TUIStore.getData(StoreName.CALL, NAME.IS_GROUP);
735
+ const callMediaType = TUIStore.getData(StoreName.CALL, NAME.CALL_MEDIA_TYPE);
736
+ const remoteUserInfoList = TUIStore.getData(StoreName.CALL, NAME.REMOTE_USER_INFO_LIST);
737
+ const oldStatus = isGroup ? StatusChange.DIALING_GROUP : StatusChange.DIALING_C2C;
738
+ TUIStore.update(StoreName.CALL, NAME.CALL_TIPS, '');
739
+ this.statusChanged && this.statusChanged({ oldStatus, newStatus: generateStatusChangeText() });
740
+ if (!isGroup && callMediaType === CallMediaType.VIDEO) {
741
+ this.switchScreen(remoteUserInfoList[0].domId);
742
+ }
743
+ }
744
+ await this?._bellContext?.stop();
745
+ }
746
+ } catch (error) {
747
+ console.warn(`${NAME.PREFIX}handleCallStatusChange, ${error}.`);
748
+ }
749
+ };
750
+ private _watchTUIStore() {
751
+ TUIStore?.watch(StoreName.CALL, {
752
+ [NAME.CALL_STATUS]: this._handleCallStatusChange,
753
+ });
754
+ }
755
+ private _unwatchTUIStore() {
756
+ TUIStore?.unwatch(StoreName.CALL, {
757
+ [NAME.CALL_STATUS]: this._handleCallStatusChange,
758
+ });
759
+ }
760
+ // =========================【融合 chat 】=========================
761
+ public bindTUICore(TUICore: any) {
762
+ this._TUICore = TUICore;
763
+ }
764
+ // =========================【set、get methods】=========================
765
+ public getTim() {
766
+ if (this._tim) return this._tim;
767
+ if (!this._tuiCallEngine) {
768
+ console.warn(`${NAME.PREFIX}getTim warning: _tuiCallEngine Instance is not available.`);
769
+ return null;
770
+ }
771
+ return this._tuiCallEngine?.tim || this._tuiCallEngine?.getTim(); // mini support getTim interface
772
+ }
773
+ public setIsFromChat(isFromChat: boolean) {
774
+ this._isFromChat = isFromChat;
775
+ }
776
+ public setCurrentGroupId(groupId: string) {
777
+ this._currentGroupId = groupId;
778
+ }
779
+ public getCurrentGroupId() {
780
+ return this._currentGroupId;
781
+ }
782
+ public setDefaultOfflinePushInfo(offlinePushInfo) {
783
+ this._offlinePushInfo = offlinePushInfo;
784
+ }
785
+ public getDefaultOfflinePushInfo() {
786
+ const localUserInfo: IUserInfo = TUIStore.getData(StoreName.CALL, NAME.LOCAL_USER_INFO);
787
+ if (this._offlinePushInfo) {
788
+ return this._offlinePushInfo;
789
+ }
790
+
791
+ return {
792
+ title: localUserInfo?.displayUserInfo || '',
793
+ description: t('you have a new call'),
794
+ };
795
+ }
796
+ public async getCallMessage(message) {
797
+ return await this._chatCombine.getCallKitMessage(message, this.getTim());
798
+ }
799
+ }