MessageHistory.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <template>
  2. <div v-loading="loading" class="p-base scroll-y-auto message-history-container">
  3. <template v-if="!history?.length">
  4. <empty></empty>
  5. </template>
  6. <template v-else>
  7. <div v-for="(message, index) in history" :key="index" class="m-b-base message-info">
  8. <div class="m-b-mini message-header">
  9. <span class="m-r-base user-name">{{ message.sendUserName }}</span>
  10. <span class="message-time">{{ message.sendTime }}</span>
  11. </div>
  12. <pre class="message-info-content" @click="onContentClick" v-html="message.content"></pre>
  13. </div>
  14. </template>
  15. </div>
  16. <image-preview v-model="previewModalVisible" :url="paperPath" :is-big="true"></image-preview>
  17. </template>
  18. <script setup lang="ts" name="MessageHistory">
  19. /** 历史消息 */
  20. import { watch, ref } from 'vue'
  21. import useFetch from '@/hooks/useFetch'
  22. import Empty from '@/components/common/Empty.vue'
  23. import ImagePreview from '../ImagePreview.vue'
  24. const props = defineProps<{ sendUserId?: number }>()
  25. /** 图片预览 */
  26. const previewModalVisible = ref<boolean>(false)
  27. /** 图片路径 */
  28. const paperPath = ref<string>('')
  29. const { fetch: getMessageHistory, result: history, loading } = useFetch('getMessageHistory')
  30. watch(
  31. () => props.sendUserId,
  32. () => {
  33. if (props.sendUserId) {
  34. getMessageHistory({ sendUserId: props.sendUserId })
  35. }
  36. },
  37. { immediate: true }
  38. )
  39. const onContentClick = (e: Event) => {
  40. const target = e.target as HTMLButtonElement
  41. const path = target.getAttribute('data-path')
  42. if (path) {
  43. previewModalVisible.value = true
  44. paperPath.value = path
  45. }
  46. }
  47. </script>
  48. <style scoped lang="scss">
  49. .message-history-container {
  50. // max-height: 400px;
  51. // height: 250px;
  52. border-top: $OnePixelLine;
  53. border-radius: 0 0 6px 6px;
  54. background-color: $color--white;
  55. position: absolute;
  56. left: 100%;
  57. top: 0;
  58. height: 100%;
  59. width: 300px;
  60. border-left: 1px solid #eee;
  61. .message-info {
  62. .message-header {
  63. color: $color--primary;
  64. }
  65. .message-info-content {
  66. white-space: pre-wrap;
  67. }
  68. }
  69. }
  70. </style>