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.
 
 
 
 
 
 

278 lines
8.5 KiB

<template>
<scroll-view class="message-list-container" scroll-y="true" :scroll-into-view="scrollView" :refresher-enabled="true"
@refresherrefresh="refresh" :scroll-top="scrollTop" :refresher-triggered="triggered">
<view id="message-scroll" style="width:100%">
<view class="no-message" v-if="isCompleted">{{i18n.message.meiyougengduola}}</view>
<view v-for="item in messageList" :key="item.ID" class="t-message">
<view v-if="conversation.type !== '@TIM#SYSTEM'" :id="item.ID">
<view class="t-message-item">
<TUI-TipMessage v-if="item.type === 'TIMGroupTipElem'" :message="item"></TUI-TipMessage>
<view v-if="item.type !== 'TIMGroupTipElem'"
:class="item.flow === 'out' ? 't-self-message' : 't-recieve-message'">
<image class="t-message-avatar" v-if="item.flow === 'in'"
:src="item.avatar || 'https://sdk-web-1252463788.cos.ap-hongkong.myqcloud.com/component/TUIKit/assets/avatar_21.png'">
</image>
<view class="read-receipts" v-if="conversation.type === 'C2C' && item.flow === 'out'">
<view v-if="item.isPeerRead">{{i18n.message.yidu}}</view>
<view v-else>{{i18n.message.wudu}}</view>
</view>
<view>
<TUI-TextMessage v-if="item.type === 'TIMTextElem'" :message="item"
:isMine="item.flow === 'out'"></TUI-TextMessage>
<TUI-ImageMessage v-if="item.type === 'TIMImageElem'" :message="item"
:isMine="item.flow === 'out'"></TUI-ImageMessage>
<TUI-VideoMessage v-if="item.type === 'TIMVideoFileElem'" :message="item"
:isMine="item.flow === 'out'"></TUI-VideoMessage>
<TUI-AudioMessage v-if="item.type === 'TIMSoundElem'" :message="item"
:isMine="item.flow === 'out'"></TUI-AudioMessage>
<TUI-CustomMessage v-if="item.type === 'TIMCustomElem'" :message="item"
:isMine="item.flow === 'out'"></TUI-CustomMessage>
<TUI-FaceMessage v-if="item.type === 'TIMFaceElem'" :message="item"
:isMine="item.flow === 'out'"></TUI-FaceMessage>
<TUI-FileMessage v-if="item.type === 'TIMFileElem'" :message="item"
:isMine="item.flow === 'out'"></TUI-FileMessage>
</view>
<image class="t-message-avatar" v-if="item.flow === 'out'"
:src="item.avatar || 'https://sdk-web-1252463788.cos.ap-hongkong.myqcloud.com/component/TUIKit/assets/avatar_21.png'">
</image>
<!-- <view class="" v-if="item.flow != 'out'" @click="doFanyiItem(item)">
<image src="../../../static/message/fanyi.png" mode="aspectFit"
style="width: 72rpx;height: 72rpx"></image>
</view> -->
</view>
<!-- <view class="text-message-fanyi" v-if="item.fanyi && item.fanyi.length > 0">
{{item.fanyi}}
</view> -->
</view>
</view>
<view v-else :id="item.ID" :data-value="item.ID">
<TUI-SystemMessage :message="item"></TUI-SystemMessage>
</view>
</view>
</view>
</scroll-view>
</template>
<script>
import TUITextMessage from '../message-elements/text-message/index';
import TUIImageMessage from '../message-elements/image-message/index';
import TUIVideoMessage from '../message-elements/video-message/index';
import TUIAudioMessage from '../message-elements/audio-message/index';
import TUICustomMessage from '../message-elements/custom-message/index';
import TUITipMessage from '../message-elements/tip-message/index';
import TUISystemMessage from '../message-elements/system-message/index';
import TUIFaceMessage from '../message-elements/face-message/index';
import TUIFileMessage from '../message-elements/file-message/index';
export default {
computed: {
i18n() {
return this.$t('index')
},
},
data() {
return {
avatar: '',
userID: '',
// 当前会话
messageList: [],
// 自己的 ID 用于区分历史消息中,哪部分是自己发出的
scrollView: '',
scrollTop: 0,
triggered: true,
nextReqMessageID: '',
// 下一条消息标志
isCompleted: false // 当前会话消息是否已经请求完毕
};
},
components: {
TUITextMessage,
TUIImageMessage,
TUIVideoMessage,
TUIAudioMessage,
TUICustomMessage,
TUITipMessage,
TUISystemMessage,
TUIFaceMessage,
TUIFileMessage
},
props: {
conversation: {
type: Object,
default: () => {}
}
},
watch: {
conversation: {
handler: function(newVal) {
if (!newVal.conversationID) return;
this.setData({
conversation: newVal
},
() => {
this.getMessageList(newVal);
}
);
},
immediate: true,
deep: true
}
},
mounted() {
uni.$TUIKit.getMyProfile().then(res => {
this.avatar = res.data.avatar;
this.userID = res.data.userID;
});
uni.$TUIKit.on(uni.$TUIKitEvent.MESSAGE_RECEIVED, this.$onMessageReceived, this);
uni.$TUIKit.on(uni.$TUIKitEvent.MESSAGE_READ_BY_PEER, this.$onMessageReadByPeer, this);
},
destroyed() {
// 一定要解除相关的事件绑定
uni.$TUIKit.off(uni.$TUIKitEvent.MESSAGE_RECEIVED, this.$onMessageReceived);
},
methods: {
refresh() {
if (this.isCompleted) {
this.setData({
isCompleted: true,
triggered: false
});
return;
}
this.getMessageList(this.conversation);
setTimeout(() => {
this.setData({
triggered: false
});
}, 2000);
},
getMessageList(conversation) {
if (!this.isCompleted) {
uni.$TUIKit
.getMessageList({
conversationID: conversation.conversationID,
nextReqMessageID: this.nextReqMessageID,
count: 15
})
.then(res => {
const {
messageList
} = res.data; // 消息列表。
var newList = []
for (let i = 0; i < messageList.length; i++) {
var item = messageList[i]
if(item.payload.text.indexOf('TUIKit-kami') != -1){
console.log('messageList',item.payload.text)
}else{
newList.push(item)
}
}
this.nextReqMessageID = res.data.nextReqMessageID; // 用于续拉,分页续拉时需传入该字段。
this.isCompleted = res.data.isCompleted; // 表示是否已经拉完所有消息。
this.messageList = [...newList, ...this.messageList];
this.$handleMessageRender(this.messageList, messageList);
});
}
},
// 自己的消息上屏
updateMessageList(msg) {
this.messageList = [...this.messageList, msg];
this.scrollToButtom();
},
// 消息已读更新
$onMessageReadByPeer() {
this.setData({
messageList: this.messageList
});
},
scrollToButtom() {
const query = uni.createSelectorQuery().in(this);
let nodesRef = query.select('#message-scroll');
nodesRef
.boundingClientRect(res => {
this.$nextTick(() => {
//进入页面滚动到底部
this.scrollTop = res.height;
});
})
.exec();
},
// 收到的消息
$onMessageReceived(value) {
// 若需修改消息,需将内存的消息复制一份,不能直接更改消息,防止修复内存消息,导致其他消息监听处发生消息错误
const event = value;
const list = [];
event.data.forEach(item => {
if (item.conversationID === this.conversation.conversationID) {
list.push(Object.assign(item));
}
});
this.messageList = this.messageList.concat(list);
this.scrollToButtom();
},
// 历史消息渲染
$handleMessageRender(messageList) {
if (messageList.length > 0) {
this.setData({
messageList
},
() => {}
);
this.$nextTick(() => {
//进入页面滚动到底部
this.scrollTop = 9999;
});
}
},
doFanyiItem(item) {
console.log(item.payload.text)
uni.showLoading({
title: ' '
})
var fromLag;
var toLag;
const system_info = uni.getStorageSync('system_info')
const language = system_info.language
if (language.indexOf('zh') != -1) {
fromLag = 'th';
toLag = 'zh-CN';
} else{
fromLag = 'zh-CN';
toLag = 'th';
}
var that = this
uni.request({
url: 'https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&sl=' + fromLag + '&tl=' +
toLag + '&q=' + item.payload.text,
success: function(res) {
uni.hideLoading();
console.log(res.data[0][0][0])
item.fanyi = res.data[0][0][0]
that.$forceUpdate()
},
fail: function(error) {
console.log(error)
uni.hideLoading();
},
complete:function(res){
console.log(res.data[0][0])
uni.hideLoading();
}
})
}
}
};
</script>
<style>
@import './index.css';
</style>