MessageView.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <template>
  2. <zb-tooltip placement="bottom" ref="tooltip" content="信息提示" color="#ccc">
  3. <template #content>
  4. <view class="menu">
  5. <view class="menu-item" @tap="handleToOther">转发</view>
  6. <view class="menu-item" @tap="handleQuote">引用</view>
  7. <view class="menu-item" @tap="handleMultiple">多选</view>
  8. <view class="menu-item" @tap="handleCollect">收藏</view>
  9. <view class="menu-item" @tap="handleDelect">删除</view>
  10. <view class="menu-item" v-if="item.messageType === MessageType.text" @tap="handleClipboard">复制</view>
  11. <view class="menu-item" v-if="item.messageType === MessageType.file" @tap="handleOpen">打开</view>
  12. <view class="menu-item" v-if="timeShow" @tap="messageBack">撤回</view>
  13. <view class="menu-item" v-if="item.messageType === MessageType.image" @tap="handleDownload">下载</view>
  14. </view>
  15. </template>
  16. <!-- #ifndef MP-WEIXIN -->
  17. <component :is="useMessageComponent(item.messageType)" :message="item"></component>
  18. <!-- #endif -->
  19. <!-- #ifdef MP-WEIXIN -->
  20. <message-text v-if="item.messageType === MessageType.text" :message="item"></message-text>
  21. <message-image v-if="item.messageType === MessageType.image" :message="item"></message-image>
  22. <message-file v-if="item.messageType === MessageType.file" :message="item"></message-file>
  23. <message-voice v-if="item.messageType === MessageType.voice" :message="item"></message-voice>
  24. <message-video v-if="item.messageType === MessageType.video" :message="item"></message-video>
  25. <message-multiple-forward v-if="item.messageType === MessageType.forward" :message="item"></message-multiple-forward>
  26. <!-- #endif -->
  27. </zb-tooltip>
  28. </template>
  29. <script setup lang="ts">
  30. import {ref } from "vue";
  31. import MessageType from "@/utils/MessageType";
  32. import {useChatStore} from "@/store/chatStore";
  33. import CollectApi from "@/api/CollectApi";
  34. import MessageUtils from "@/utils/MessageUtils";
  35. import ZbTooltip from "@/uni_modules/zb-tooltip/components/zb-tooltip/zb-tooltip.vue";
  36. import {useWsStore} from "@/store/WsStore";
  37. import type Message from "@/mode/Message";
  38. import type Collect from "@/mode/Collect";
  39. // #ifndef MP-WEIXIN
  40. import useMessageComponent from "@/hooks/useMessageComponent";
  41. // #endif
  42. import useClipboard from 'vue-clipboard3'
  43. import {useMessageStore} from "@/store/messageStore";
  44. import MessageText from '@/components/messages/MessageText.vue'
  45. import MessageImage from '@/components/messages/MessageImage.vue'
  46. import MessageFile from '@/components/messages/MessageFile.vue'
  47. import MessageVoice from '@/components/messages/MessageVoice.vue'
  48. import MessageVideo from '@/components/messages/MessageVideo.vue'
  49. import MessageMultipleForward from "@/components/messages/MessageMultipleForward.vue";
  50. const {toClipboard} = useClipboard()
  51. const wsStore = useWsStore();
  52. const chatStore = useChatStore();
  53. const messageStore = useMessageStore();
  54. const emit = defineEmits(['toOtherHandle'])
  55. const tooltip = ref();
  56. interface IProps {
  57. item: Message
  58. }
  59. let props = defineProps<IProps>();
  60. //转发
  61. const handleToOther = () => {
  62. tooltip.value.close();
  63. messageStore.setCheckList([props.item])
  64. uni.navigateTo({
  65. url: `/pages/chat/send-other`
  66. })
  67. }
  68. const handleClipboard = () => {
  69. tooltip.value.close();
  70. const message = props.item;
  71. uni.setClipboardData({
  72. data:message.content,
  73. success: function() {
  74. MessageUtils.message("复制成功");
  75. }
  76. })
  77. // toClipboard(message.content).then(() => {
  78. // MessageUtils.message("复制成功");
  79. // })
  80. }
  81. const handleOpen = () => {
  82. tooltip.value.close();
  83. const message = props.item;
  84. const url = message.extend?.url
  85. if (url) {
  86. uni.downloadFile({
  87. url: url, //仅为示例,并非真实的资源
  88. success: (res) => {
  89. if (res.statusCode === 200) {
  90. uni.openDocument({
  91. filePath: res.tempFilePath,
  92. showMenu: true
  93. });
  94. }
  95. }
  96. })
  97. }
  98. }
  99. const handleDownload = () => {
  100. tooltip.value.close();
  101. const message = props.item;
  102. const url = message.extend?.url
  103. if (url) {
  104. uni.downloadFile({
  105. url: url, //仅为示例,并非真实的资源
  106. success: (res) => {
  107. if (res.statusCode === 200) {
  108. uni.saveImageToPhotosAlbum({
  109. filePath: res.tempFilePath,
  110. success: () => {
  111. MessageUtils.message("已经成功下载到相册");
  112. }
  113. });
  114. }
  115. }
  116. });
  117. }
  118. }
  119. const handleDelect = () => {
  120. tooltip.value.close();
  121. const message = props.item;
  122. chatStore.deMessage(message);
  123. console.log(message);
  124. MessageUtils.message("删除成功");
  125. }
  126. //收藏
  127. const handleCollect = () => {
  128. tooltip.value.close();
  129. const message = props.item;
  130. const collect: Collect = {
  131. fromId: message.fromId,
  132. content: message.content,
  133. messageType: message.messageType,
  134. extend: message.extend === undefined ? "" : JSON.stringify(message.extend),
  135. sendTime: message.timestamp,
  136. };
  137. CollectApi.save(collect).then(() => {
  138. MessageUtils.message("收藏成功");
  139. });
  140. }
  141. //引用
  142. const handleQuote = () => {
  143. tooltip.value.close();
  144. chatStore.setQuoteMessage(props.item);
  145. }
  146. //多选
  147. const handleMultiple = () => {
  148. tooltip.value.close();
  149. useMessageStore().setShowMultipleCheck(true)
  150. }
  151. const timeShow = ref(false);
  152. const interval = setInterval(() => {
  153. if (props.item && props.item.timestamp && props.item.mine) {
  154. timeShow.value = props.item.mine && ((props.item.timestamp + 2 * 60 * 1000) > new Date().getTime())
  155. if (!timeShow.value) {
  156. clearInterval(interval);
  157. }
  158. }
  159. }, 1000);
  160. /**
  161. * 消息撤回
  162. */
  163. const messageBack = () => {
  164. tooltip.value.close();
  165. const message = JSON.parse(JSON.stringify(props.item));
  166. message.messageType = MessageType.back;
  167. message.content = "该消息已被撤回";
  168. wsStore.sendMessage(message);
  169. };
  170. </script>
  171. <style scoped lang="scss">
  172. .menu {
  173. display: flex;
  174. flex-wrap: wrap;
  175. align-items:center;
  176. width: 40vw;
  177. .menu-item {
  178. padding: 5px;
  179. color:black;
  180. font-size: 32upx;
  181. }
  182. }
  183. </style>