custom-element.vue
3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<template>
<div class="custom-element-wrapper">
<image-element
v-if="this.payload.data === 'image'"
:isMine="isMine"
:payload="
Object.assign(message.payload, {
imageInfoArray: [{ url: message.payload.description }],
})
"
:message="message"
/>
<video-element
v-else-if="this.payload.data === 'video'"
:isMine="isMine"
:payload="
Object.assign(message.payload, {
videoUrl: message.payload.description,
})
"
:message="message"
/>
<audio-element
v-else-if="this.payload.data === 'audio'"
:isMine="isMine"
:payload="message.payload"
:message="message"
/>
<template v-else>
<message-bubble :isMine="isMine" :message="message">
<message-group-live-status
v-if="text.isFromGroupLive && text.isFromGroupLive === 1"
:liveInfo="text"
/>
<template v-else>{{ text }}</template>
</message-bubble>
</template>
</div>
</template>
<script>
import { mapState } from "vuex";
import MessageBubble from "../message-bubble";
import MessageGroupLiveStatus from "../message-group-live-status";
import ImageElement from "../message-elements/image-element.vue";
import VideoElement from "./video-element";
import AudioElement from "./audio-element.vue";
export default {
name: "CustomElement",
props: {
payload: {
type: Object,
required: true,
},
message: {
type: Object,
required: true,
},
isMine: {
type: Boolean,
},
},
components: {
VideoElement,
MessageBubble,
MessageGroupLiveStatus,
ImageElement,
AudioElement,
},
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 "[自定义消息]";
}
},
},
};
</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>