replies.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <div
  3. class="replies"
  4. :class="[isH5 ? 'replies-H5' : '', isMenuOpen ? 'replies-menu-open' : '']"
  5. v-if="show"
  6. ref="dialog"
  7. >
  8. <div class="header">
  9. <div class="header-back">
  10. <i v-if="isH5" class="icon icon-back" @click="toggleShow"></i>
  11. </div>
  12. <div class="header-title">
  13. <span>{{ $t('TUIChat.回复详情') }}</span>
  14. </div>
  15. <div class="header-close">
  16. <i v-if="!isH5" class="icon icon-close" @click="toggleShow"></i>
  17. </div>
  18. </div>
  19. <div class="body">
  20. <div class="body-message">
  21. <RepliesItem :message="message" :isH5="isH5" :isRoot="true" />
  22. </div>
  23. <div class="body-list">
  24. <ul>
  25. <li v-for="(item, index) in replies" :key="index" class="body-list-item">
  26. <RepliesItem :message="item" :isH5="isH5" :isRoot="false" />
  27. </li>
  28. </ul>
  29. </div>
  30. </div>
  31. </div>
  32. </template>
  33. <script lang="ts">
  34. import { defineComponent, reactive, watchEffect, toRefs, watch, ref } from 'vue';
  35. import { onClickOutside } from '@vueuse/core';
  36. import { caculateTimeago } from '../../../utils';
  37. import { Message } from '../../interface';
  38. import TIM from '../../../../../TUICore/tim';
  39. import RepliesItem from './replies-item.vue';
  40. import { JSONToObject } from '../../utils/utils';
  41. const ReadReceiptDialog = defineComponent({
  42. type: 'custom',
  43. components: {
  44. RepliesItem,
  45. },
  46. props: {
  47. message: {
  48. type: Object,
  49. default: () => ({}),
  50. },
  51. isH5: {
  52. type: Boolean,
  53. default: false,
  54. },
  55. show: {
  56. type: Boolean,
  57. default: () => false,
  58. },
  59. url: {
  60. type: String,
  61. default: '',
  62. },
  63. messageList: {
  64. type: Array,
  65. default: () => [],
  66. },
  67. },
  68. setup(props: any, ctx: any) {
  69. const data = reactive({
  70. message: {} as Message,
  71. isGroup: false,
  72. show: false,
  73. isH5: false,
  74. url: '',
  75. showListNow: 0,
  76. isMenuOpen: true,
  77. replies: [],
  78. messageList: [],
  79. TIM,
  80. });
  81. const dialog: any = ref();
  82. watchEffect(() => {
  83. data.message = props.message;
  84. data.show = props.show;
  85. data.isH5 = props.isH5;
  86. data.url = props.url;
  87. data.messageList = props.messageList;
  88. console.log(props.message, 'props.message')
  89. });
  90. watch(
  91. () => {
  92. data.message, data.messageList;
  93. },
  94. () => {
  95. data.message = props.message;
  96. data.messageList = props.messageList;
  97. handleReplies(data.message);
  98. },
  99. { deep: true }
  100. );
  101. const toggleShow = () => {
  102. data.show = !data.show;
  103. if (!data.show) {
  104. ctx.emit('closeDialog', 'replies');
  105. close();
  106. }
  107. };
  108. onClickOutside(dialog, () => {
  109. data.show = false;
  110. ctx.emit('closeDialog', 'replies');
  111. close();
  112. });
  113. const handleReplies = (message: Message) => {
  114. try {
  115. const { cloudCustomData } = message;
  116. if (!cloudCustomData) return;
  117. const cloudCustomObject = JSONToObject(cloudCustomData);
  118. data.replies = cloudCustomObject?.messageReplies?.replies;
  119. data?.replies?.forEach((item: any) => {
  120. const { messageID, messageSender } = item;
  121. const message = data.messageList.find((item: Message) =>
  122. (item.ID === messageID || item.from === messageSender)
  123. );
  124. item.avatar = message ? (message as Message)?.avatar : '';
  125. // try {
  126. // const res = await imUserFriendBatchFriend({ imUserIds: [messageSender] })
  127. // item.messageSenderName = res.data[0]?.friendNickname || res.data[0]?.imUserId
  128. // item.avatar = res.data[0]?.friendAvatar || ''
  129. // } catch {
  130. // //
  131. // }
  132. });
  133. } catch (err) {
  134. console.log(err);
  135. }
  136. };
  137. const close = () => {
  138. data.message = {};
  139. };
  140. const handleDialogPosition = () => {
  141. data.isMenuOpen = !!document?.getElementsByClassName('home-menu')?.length;
  142. };
  143. return {
  144. ...toRefs(data),
  145. dialog,
  146. toggleShow,
  147. close,
  148. caculateTimeago,
  149. handleDialogPosition,
  150. };
  151. },
  152. });
  153. export default ReadReceiptDialog;
  154. </script>
  155. <style lang="scss" scoped src="./style/index.scss"></style>