index.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <Overlay
  3. :visible="isShowForwardPanel"
  4. :useMask="false"
  5. >
  6. <Transfer
  7. :title="TUITranslateService.t('TUIChat.转发')"
  8. :isSearch="false"
  9. :isCustomItem="false"
  10. :list="customConversationList"
  11. :isHiddenBackIcon="isUniFrameWork"
  12. @cancel="closeForwardPanel"
  13. @submit="onSubmit"
  14. />
  15. </Overlay>
  16. </template>
  17. <script lang="ts" setup>
  18. import { onMounted, onUnmounted, ref } from '../../../adapter-vue';
  19. import {
  20. TUIStore,
  21. StoreName,
  22. TUIChatService,
  23. TUITranslateService,
  24. IConversationModel,
  25. } from '@tencentcloud/chat-uikit-engine';
  26. import Overlay from '../../common/Overlay/index.vue';
  27. import Transfer from '../../common/Transfer/index.vue';
  28. import { Toast, TOAST_TYPE } from '../../../components/common/Toast';
  29. import { isUniFrameWork } from '../../../utils/env';
  30. import { isEnabledMessageReadReceiptGlobal } from '../utils/utils';
  31. import { createOfflinePushInfo } from '../utils/sendMessage';
  32. const isShowForwardPanel = ref(false);
  33. const customConversationList = ref();
  34. onMounted(() => {
  35. TUIStore.watch(StoreName.CONV, {
  36. conversationList: onConversationListUpdated,
  37. });
  38. TUIStore.watch(StoreName.CUSTOM, {
  39. singleForwardMessageID: onSingleForwardMessageIDUpdated,
  40. });
  41. });
  42. onUnmounted(() => {
  43. // 组件卸载时需要清掉数据 否则小程序会自动打开
  44. TUIStore.update(StoreName.CUSTOM, 'singleForwardMessageID', undefined);
  45. TUIStore.unwatch(StoreName.CONV, {
  46. conversationList: onConversationListUpdated,
  47. });
  48. TUIStore.unwatch(StoreName.CUSTOM, {
  49. singleForwardMessageID: onSingleForwardMessageIDUpdated,
  50. });
  51. });
  52. function onSingleForwardMessageIDUpdated(messageID: string) {
  53. if (typeof messageID !== 'undefined') {
  54. openForwardPanel();
  55. }
  56. }
  57. function closeForwardPanel(): void {
  58. // ! 必须通过close函数关闭转发面板 singleForwardMessage必须清掉
  59. TUIStore.update(StoreName.CUSTOM, 'singleForwardMessageID', undefined);
  60. isShowForwardPanel.value = false;
  61. }
  62. function openForwardPanel(): void {
  63. isShowForwardPanel.value = true;
  64. }
  65. function finishSelected(selectedConvIDWrapperList: Array<{ userID: string }>): void {
  66. /**
  67. * 这里传递的是 coversationID
  68. * 但为了实现 Transfer 的复用 这里用 userID 代替 ConversationID
  69. */
  70. const selectedConversationList = selectedConvIDWrapperList.map((convIDWrapper) => {
  71. const { userID: conversationID } = convIDWrapper;
  72. return TUIStore.getConversationModel(conversationID);
  73. });
  74. const singleForwardMessageID: string = TUIStore.getData(StoreName.CUSTOM, 'singleForwardMessageID');
  75. const message = TUIStore.getMessageModel(singleForwardMessageID);
  76. const sendMessageOptions: any = {};
  77. for (let i = 0; i < selectedConversationList.length; i++) {
  78. const conversation = selectedConversationList[i];
  79. const { conversationID } = conversation;
  80. sendMessageOptions[conversationID] = {
  81. offlinePushInfo: createOfflinePushInfo(conversation),
  82. };
  83. }
  84. TUIChatService.sendForwardMessage(
  85. selectedConversationList,
  86. [message],
  87. {
  88. params: {
  89. needReadReceipt: isEnabledMessageReadReceiptGlobal(),
  90. },
  91. ...sendMessageOptions,
  92. },
  93. ).catch((error: { message: string; code: number }) => {
  94. if (error.code === 80001) {
  95. Toast({
  96. message: TUITranslateService.t('内容包含敏感词汇'),
  97. type: TOAST_TYPE.ERROR,
  98. });
  99. } else {
  100. Toast({
  101. message: error.message as string,
  102. type: TOAST_TYPE.ERROR,
  103. });
  104. }
  105. });
  106. closeForwardPanel();
  107. }
  108. function onSubmit(convIDWrapperList: Array<{ userID: string }>) {
  109. if (convIDWrapperList?.length === 0) return;
  110. finishSelected(convIDWrapperList);
  111. }
  112. function onConversationListUpdated(list: IConversationModel[]) {
  113. customConversationList.value = list.map((conversation) => {
  114. return {
  115. // 为了实现Transfer的复用,这里用userID代替ConversationID
  116. userID: conversation.conversationID,
  117. nick: conversation.getShowName(),
  118. avatar: conversation.getAvatar(),
  119. };
  120. });
  121. }
  122. </script>