You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

221 lines
6.3 KiB

<template>
<view>
<view v-if="renderDom[0].type === 'order'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
<image class="custom-image" :src="renderDom[0].imageUrl"></image>
<view class="custom-content">
<view class="custom-content-title">{{ renderDom[0].title }}</view>
<view class="custom-content-description">{{ renderDom[0].description }}</view>
<view class="custom-content-price">{{ renderDom[0].price }}</view>
</view>
</view>
<view v-if="renderDom[0].type === 'consultion'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
<view class="custom-content">
<view class="custom-content-title">{{ renderDom[0].title }}</view>
<view v-for="(item, index) in renderDom[0].item" :key="index" class="custom-content-description" :id="item.key">{{ item.key }}</view>
<view class="custom-content-description">{{ renderDom[0].description }}</view>
</view>
</view>
<view v-if="renderDom[0].type === 'evaluation'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
<view class="custom-content">
<view class="custom-content-title">{{ renderDom[0].title }}</view>
<view class="custom-content-score">
<image v-for="(item, index) in renderDom[0].score" :key="index" class="score-star" src="/static/static/images/star.png"></image>
</view>
<view class="custom-content-description">{{ renderDom[0].description }}</view>
</view>
</view>
<view v-if="renderDom[0].type === 'group_create'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
<view class="custom-content-text">{{ renderDom[0].text }}</view>
</view>
<view v-if="renderDom[0].type === 'c2cCalling' || renderDom[0].type === 'groupCalling'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
<view class="custom-content-text">{{ renderDom[0].text }}</view>
</view>
<view v-if="renderDom[0].type === 'notSupport'" class="message-body-span text-message">
<view class="message-body-span-text">{{ renderDom[0].text }}</view>
</view>
</view>
</template>
<script>
import { formateTime } from '../../../base/common.js';
export default {
data() {
return {};
},
components: {},
props: {
message: {
type: Object,
default: () => {}
},
isMine: {
type: Boolean,
default: true
}
},
watch: {
message: {
handler: function(newVal) {
this.setData({
message: newVal,
renderDom: this.parseCustom(newVal)
});
},
immediate: true,
deep: true
}
},
methods: {
// 解析音视频通话消息
extractCallingInfoFromMessage(message) {
const callingmessage = JSON.parse(message.payload.data);
if (callingmessage.businessID !== 1) {
return '';
}
const objectData = JSON.parse(callingmessage.data);
switch (callingmessage.actionType) {
case 1: {
if (objectData.call_end >= 0 && !callingmessage.groupID) {
return `通话时长:${formateTime(objectData.call_end)}`;
}
if (callingmessage.groupID) {
return '结束群聊';
}
if (objectData.data && objectData.data.cmd === 'switchToAudio') {
return '切换语音通话';
}
if (objectData.data && objectData.data.cmd === 'switchToVideo') {
return '切换视频通话';
}
return '发起通话';
}
case 2:
return '取消通话';
case 3:
if (objectData.data && objectData.data.cmd === 'switchToAudio') {
return '切换语音通话';
}
if (objectData.data && objectData.data.cmd === 'switchToVideo') {
return '切换视频通话';
}
return '已接听';
case 4:
return '拒绝通话';
case 5:
if (objectData.data && objectData.data.cmd === 'switchToAudio') {
return '切换语音通话';
}
if (objectData.data && objectData.data.cmd === 'switchToVideo') {
return '切换视频通话';
}
return '无应答';
default:
return '';
}
},
parseCustom(message) {
// 约定自定义消息的 data 字段作为区分,不解析的不进行展示
if (message.payload.data === 'order') {
const extension = JSON.parse(message.payload.extension);
const renderDom = [
{
type: 'order',
name: 'custom',
title: extension.title || '',
imageUrl: extension.imageUrl || '',
price: extension.price || 0,
description: message.payload.description
}
];
return renderDom;
} // 客服咨询
if (message.payload.data === 'consultion') {
const extension = JSON.parse(message.payload.extension);
const renderDom = [
{
type: 'consultion',
title: extension.title || '',
item: extension.item || 0,
description: extension.description
}
];
return renderDom;
} // 服务评价
if (message.payload.data === 'evaluation') {
const extension = JSON.parse(message.payload.extension);
const renderDom = [
{
type: 'evaluation',
title: message.payload.description,
score: extension.score,
description: extension.comment
}
];
return renderDom;
} // 群消息解析
// 群消息解析
if (message.payload.data === 'group_create') {
const renderDom = [
{
type: 'group_create',
text: message.payload.extension
}
];
return renderDom;
}
// 音视频通话消息解析
const callingmessage = JSON.parse(message.payload.data);
if (callingmessage.businessID === 1) {
if (message.conversationType === 'GROUP') {
if (message.payload.data.actionType === 5) {
message.nick = message.payload.data.inviteeList ? message.payload.data.inviteeList.join(',') : message.from;
}
const _text = this.extractCallingInfoFromMessage(message);
const groupText = `${_text}`;
const renderDom = [
{
type: 'groupCalling',
text: groupText,
userIDList: []
}
];
return renderDom;
}
if (message.conversationType === 'C2C') {
const c2cText = this.extractCallingInfoFromMessage(message);
const renderDom = [
{
type: 'c2cCalling',
text: c2cText
}
];
return renderDom;
}
}
if (message.payload.data === 'group_create') {
const renderDom = [
{
type: 'group_create',
text: message.payload.extension
}
];
return renderDom;
}
return [
{
type: 'notSupport',
text: '[自定义消息]'
}
];
}
}
};
</script>
<style>
@import './index.css';
</style>