QuoteMessageRender.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <template>
  2. <view class="message_quote_wrap">
  3. <view class="message_quote_text">
  4. <u-parse :content="getSenderNickname" />
  5. <view style="margin-left: 6rpx" class="message_quote_media">
  6. <image
  7. v-if="isReplyFile"
  8. src="../../../../../static/images/chating_message_file.png"
  9. alt="file"
  10. />
  11. <image
  12. v-if="isReplyImage"
  13. :src="getQuoteMessage.pictureElem.sourcePicture.url"
  14. alt="img"
  15. @click="clickImageItem"
  16. />
  17. <my-avatar
  18. v-if="isReplyCard"
  19. :src="getQuoteMessage.cardElem.faceURL"
  20. :desc="getQuoteMessage.cardElem.nickname"
  21. size="26"
  22. @click="clickCardUser"
  23. />
  24. <image
  25. v-if="isReplyVideo"
  26. :src="getQuoteMessage.videoElem.snapshotUrl"
  27. alt="video"
  28. />
  29. <image
  30. v-if="isReplyVideo"
  31. class="play_icon"
  32. src="../../../../../static/images/chating_message_video_play.png"
  33. alt=""
  34. srcset=""
  35. @click.stop="clickMediaItem"
  36. />
  37. </view>
  38. </view>
  39. </view>
  40. </template>
  41. <script>
  42. import { mapGetters } from "vuex";
  43. import { checkFileIsExist } from "../../../../../util/common";
  44. import UParse from "../../../../../components/gaoyia-parse/parse.vue";
  45. import { parseMessageByType } from "../../../../../util/imCommon";
  46. import { MessageType } from "openim-uniapp-polyfill";
  47. import MyAvatar from "../../../../../components/MyAvatar/index.vue";
  48. import { myPreview } from "../../../../../util/preview";
  49. const extraTypes = [
  50. MessageType.FileMessage,
  51. MessageType.LocationMessage,
  52. MessageType.PictureMessage,
  53. MessageType.VideoMessage,
  54. MessageType.CardMessage,
  55. ];
  56. export default {
  57. name: "",
  58. components: {
  59. UParse,
  60. MyAvatar,
  61. },
  62. props: {
  63. message: Object,
  64. },
  65. data() {
  66. return {};
  67. },
  68. computed: {
  69. ...mapGetters([
  70. "storeCacheMap"
  71. ]),
  72. hasExtra() {
  73. return extraTypes.includes(this.message.quoteElem.quoteMessage.contentType);
  74. },
  75. isAtMessage() {
  76. return this.message.contentType === MessageType.AtTextMessage;
  77. },
  78. getQuoteMessage() {
  79. return this.isAtMessage
  80. ? this.message.atTextElem.quoteMessage
  81. : this.message.quoteElem.quoteMessage;
  82. },
  83. isReplyImage() {
  84. return this.getQuoteMessage.contentType === MessageType.PictureMessage;
  85. },
  86. isReplyVideo() {
  87. return this.getQuoteMessage.contentType === MessageType.VideoMessage;
  88. },
  89. isReplyFile() {
  90. return this.getQuoteMessage.contentType === MessageType.FileMessage;
  91. },
  92. isReplyCard() {
  93. return this.getQuoteMessage.contentType === MessageType.CardMessage;
  94. },
  95. isLocationMessage() {
  96. return this.getQuoteMessage.contentType === MessageType.LocationMessage;
  97. },
  98. isRevokedMessage() {
  99. return this.getQuoteMessage.contentType === MessageType.RevokeMessage;
  100. },
  101. getMessageContent() {
  102. if (this.isReplyImage || this.isReplyVideo) {
  103. return "";
  104. }
  105. if (this.isRevokedMessage) {
  106. return "引用内容已被撤回";
  107. }
  108. return parseMessageByType(this.getQuoteMessage);
  109. },
  110. getSenderNickname() {
  111. return `${this.getQuoteMessage.senderNickname}: ${this.getMessageContent}`;
  112. },
  113. },
  114. methods: {
  115. clickImageItem() {
  116. myPreview(0, [this.getQuoteMessage.pictureElem.sourcePicture.url])
  117. },
  118. async clickMediaItem() {
  119. if (this.isReplyVideo) {
  120. const message = this.getQuoteMessage
  121. const path = this.storeCacheMap[message.clientMsgID]?.path;
  122. const localPath = await checkFileIsExist({
  123. key: message.clientMsgID,
  124. path
  125. })
  126. const previewVideoUrl = localPath || message.videoElem.videoUrl
  127. uni.navigateTo({
  128. url: `/pages_im/pages/conversation/previewVideo/index?clientMsgID=${message.clientMsgID}&previewVideoUrl=${previewVideoUrl}&snapshotUrl=${message.videoElem.snapshotUrl}`,
  129. });
  130. }
  131. },
  132. clickCardUser() {
  133. uni.navigateTo({
  134. url: `/pages_im/pages/common/userCard/index?sourceID=${this.getQuoteMessage.cardElem.userID}`,
  135. });
  136. },
  137. },
  138. };
  139. </script>
  140. <style lang="scss" scoped>
  141. .message_quote_wrap {
  142. display: flex;
  143. justify-content: flex-end;
  144. margin-top: 8rpx;
  145. .message_quote_text {
  146. display: flex;
  147. flex-direction: row;
  148. align-items: center;
  149. justify-content: space-between;
  150. width: fit-content;
  151. padding: 16rpx 16rpx;
  152. border-radius: 6rpx;
  153. color: #666;
  154. font-size: 24rpx;
  155. background-color: #f0f0f0;
  156. ::v-deep uni-view {
  157. @include ellipsisWithLine(3);
  158. }
  159. }
  160. .message_quote_media {
  161. position: relative;
  162. image {
  163. width: 26px;
  164. height: 26px;
  165. }
  166. .play_icon {
  167. width: 13px !important;
  168. height: 13px !important;
  169. position: absolute;
  170. top: 50%;
  171. left: 50%;
  172. transform: translate(-50%, -50%);
  173. }
  174. }
  175. }
  176. </style>