custom-element.vue 3.27 KB
<template>
  <message-bubble :isMine=isMine :message=message>
    <div class="custom-element-wrapper">
      <div class="survey" v-if="this.payload.data === 'survey'">
        <div class="title">对IM DEMO的评分和建议</div>
        <el-rate
            v-model="rate"
            disabled
            show-score
            text-color="#ff9900"
            score-template="{value}">
        </el-rate>
        <div class="suggestion">{{ this.payload.extension }}</div>
      </div>
      <span class="text" title="您可以自行解析自定义消息" v-else>
      <template v-if="text.isFromGroupLive && text.isFromGroupLive === 1">
        <message-group-live-status :liveInfo='text'/>
      </template>
      <template v-else-if="this.payload.data === 'image'">
        <el-image :src="this.payload.description" :preview-src-list="[this.payload.description]"/>
        <!--            <img alt="image" class="image-element" :src="this.payload.description" @load="onImageLoaded"-->
        <!--                 @click="handlePreview"/>-->
      </template>
      <template v-else>{{ text }}</template>
    </span>
    </div>
  </message-bubble>
</template>

<script>
import {mapState} from 'vuex'
import MessageBubble from '../message-bubble'
import {Rate} from 'element-ui'
import MessageGroupLiveStatus from '../message-group-live-status'
import ImageElement from '../message-elements/image-element.vue'

export default {
  name: 'CustomElement',
  props: {
    payload: {
      type: Object,
      required: true
    },
    message: {
      type: Object,
      required: true
    },
    isMine: {
      type: Boolean
    }
  },
  components: {
    MessageBubble,
    ElRate: Rate,
    MessageGroupLiveStatus,
    ImageElement,
  },
  computed: {
    ...mapState({
      currentUserProfile: state => state.user.currentUserProfile
    }),
    text() {
      return this.translateCustomMessage(this.payload)
    },
    rate() {
      return parseInt(this.payload.description)
    }
  },
  methods: {
    guid() {
      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8)
        return v.toString(16)
      })
    },
    translateCustomMessage(payload) {
      let videoPayload = {}
      try {
        videoPayload = JSON.parse(payload.data)
      } catch (e) {
        videoPayload = {}
      }
      if (payload.data === 'group_create') {
        return `${payload.extension}`
      }
      if (videoPayload.roomId) {
        videoPayload.roomId = videoPayload.roomId.toString()
        videoPayload.isFromGroupLive = 1
        return videoPayload
      }
      if (payload.text) {
        return payload.text
      } else {
        return '[自定义消息]'
      }
    },
    onImageLoaded(event) {
      this.$bus.$emit('image-loaded', event)
    },
    handlePreview() {
      this.$bus.$emit('image-preview', {
        url: this.payload.description
      })
    }
  }
}
</script>

<style lang="stylus" scoped>
.image-element
  max-width 250px
  cursor zoom-in
  width: 100%

.text
  font-weight bold

.title
  font-size 16px
  font-weight 600
  padding-bottom 10px

.survey
  background-color white
  color black
  padding 20px
  display flex
  flex-direction column

.suggestion
  padding-top 10px
  font-size 14px
</style>