mall_client/zyhs3_uniapp/pages/im/chat/chat.vue

416 lines
11 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container" v-if="isLogin">
<!-- <view class="chatBg" v-if="!isShow && conversation && conversation.userProfile" @click="nameTo">
<image v-if="conversation.userProfile" :src="conversation.userProfile.avatar || 'https://jw-uniapp.oss-cn-beijing.aliyuncs.com/static/images/avatar.png'"></image>
<view class="chatUser">
<text>{{ conversation.userProfile.nick }}</text>
<text>23岁</text>
</view>
</view> -->
<!-- 小程序视频通话 -->
<!-- #ifdef MP-WEIXIN -->
<tuicalling ref="TUICalling" id="TUICalling-component" :config="config"></tuicalling>
<!-- #endif -->
<!-- 先查 remark无 remark 查 (c2c)nick/(group)name最后查 (c2c)userID/(group)groupID -->
<!-- <view class="tui-chatroom-navigatorbar" v-if="conversation.type === 'GROUP'"></view> -->
<view class="group-profile">
<TUI-group-profile id="groip-profile" v-if="isShow" :conversation="conversation"></TUI-group-profile>
</view>
<view class="message-list" @tap="triggerClose">
<TUI-message-list ref="messageList" id="message-list" :conversation="conversation"></TUI-message-list>
</view>
<view class="container-box" v-if="videoPlay" @tap.stop="stopVideoHander">
<video class="video-message" v-if="videoPlay" :src="videoMessage.payload.videoUrl" :poster="videoMessage.payload.snapshotUrl" object-fit="cover" error="videoError" autoplay="true" direction="0"></video>
</view>
<view class="message-input" v-if="showChat">
<TUI-message-input ref="messageInput" id="message-input" :conversation="conversation" @sendMessage="sendMessage" @handleCall="handleCall"></TUI-message-input>
</view>
</view>
</template>
<script>
import TUIMessageList from '../components/tui-chat/message-list/index';
import TUIMessageInput from '../components/tui-chat/message-input/index';
import TUIGroupProfile from '../components/tui-group/group-profile/index';
export default {
data() {
return {
conversationName: '',
conversation: {},
messageList: [],
isShow: false,
showChat: true,
conversationID: '',
videoPlay: false,
videoMessage: {},
config: {
sdkAppID: uni.getStorageSync('sdkAppID'),
userID: uni.getStorageSync('userID'),
userSig: uni.getStorageSync('userSig'),
type: 1,
tim: null
},
friendList: '',
options: ''
};
},
components: {
TUIMessageList,
TUIMessageInput,
TUIGroupProfile
},
props: {},
created() {
uni.$on('videoPlayerHandler', value => {
this.videoPlay = value.isPlay;
this.videoMessage = value.message;
});
},
computed: {
isLogin() {
return this.$store.state.isLogin;
}
},
watch: {
isLogin(val) {
if (val) {
this.getMsg();
}
}
},
/**
* 生命周期函数--监听页 面加载
*/
onLoad(options) {
this.options = options;
if (this.isLogin) {
this.getMsg();
}
},
onUnload() {
// #ifdef MP-WEIXIN
this.$refs.TUICalling.destroyed();
// #endif
},
methods: {
getMsg() {
this.getFriendList();
// #ifdef MP-WEIXIN
// 初始化 小程序视频通话 TUICalling
this.config = {
sdkAppID: uni.getStorageSync('sdkAppID'),
userID: uni.getStorageSync('userInfo').userID,
userSig: uni.getStorageSync('userInfo').userSig
};
this.$nextTick(() => {
this.$refs.TUICalling.init();
});
// #endif
const { conversationID } = this.options;
this.conversationID = conversationID;
uni.$TUIKit
.setMessageRead({
conversationID
})
.then(() => {});
uni.$TUIKit.getConversationProfile(conversationID).then(res => {
const { conversation } = res.data;
this.conversation = conversation;
uni.setNavigationBarTitle({
title: this.getConversationName(conversation)
});
this.setData({
conversationName: this.getConversationName(conversation),
isShow: conversation.type === 'GROUP'
});
});
},
nameTo() {
this.pageUrl();
},
pageUrl() {
const num = this.conversationID.slice(0, 3);
const list = this.friendList;
// 跳转好友信息页面
if (num === 'C2C') {
const ID = this.conversationID.substring(3);
const id = list.some(item => item.userID == ID);
if (id === true) {
let promise = uni.$TUIKit.getFriendProfile({
userIDList: [ID]
});
promise
.then(function (imResponse) {
const { friendList, failureUserIDList } = imResponse.data;
friendList.forEach(friend => {
// Friend 对象
});
// 失败的 userIDList
failureUserIDList.forEach(item => {
const { userID, code, message } = item;
});
var id = friendList[0].userID;
var avatar = friendList[0].profile.avatar;
var remark = friendList[0].remark;
uni.navigateTo({
url: '/pages/im/information/information?id=' + id + '&url=' + avatar + '&remark=' + remark + '&index=1'
});
})
.catch(function (imError) {
console.warn('getFriendProfile error:', imError); // 获取失败
});
} else {
let promise = uni.$TUIKit.getUserProfile({
userIDList: [ID] // 请注意即使只拉取一个用户的资料也需要用数组类型例如userIDList: ['user1']
});
promise
.then(function (imResponse) {
// 存储用户资料的数组 - [Profile]
const userID = imResponse.data;
for (var i = 0; i < userID.length; i++) {
var id = userID[i].userID;
var avatar = userID[i].avatar;
var nick = userID[i].nick;
}
uni.navigateTo({
url: '/pages/im/information/information?id=' + id + '&url=' + avatar + '&nick=' + nick + '&index=2'
});
})
.catch(function (imError) {
console.warn('getUserProfile error:', imError); // 获取其他用户资料失败的相关信息
});
}
}
// 跳转群聊信息页面
if (num === 'GRO') {
const group = this.conversationID.substring(5);
uni.navigateTo({
url: '/pages/im/information/groupInfo?id=' + group
});
}
},
onNavigationBarButtonTap() {
this.pageUrl();
},
stopVideoHander() {
this.videoPlay = false;
},
getFriendList() {
let promise = uni.$TUIKit.getFriendList();
promise
.then(imResponse => {
const friendList = imResponse.data; // 好友列表
this.friendList = friendList;
})
.catch(function (imError) {
console.warn('getFriendList error:', imError); // 获取好友列表失败的相关信息
});
},
getConversationName(conversation) {
if (conversation.type === '@TIM#SYSTEM') {
this.setData({
showChat: false
});
return '系统通知';
}
if (conversation.type === 'C2C') {
return conversation.remark || conversation.userProfile.nick || conversation.userProfile.userID;
}
if (conversation.type === 'GROUP') {
return conversation.groupProfile.name || conversation.groupProfile.groupID;
}
},
handleCall(val) {
console.log(val.detail.userID, '通话id');
console.log(val.detail.type, '通话类型');
// 小程序通话
// #ifdef MP-WEIXIN
this.$refs.TUICalling.call({
userID: val.detail.userID,
type: val.detail.type
});
// #endif
// APP通话
// #ifdef APP-PLUS
console.log('callMediaType', Number(val.detail.type));
uni.$TUICallKit.call(
{
userID: val.detail.userID,
callMediaType: Number(val.detail.type)
},
res => {
if (res.code === 0) {
console.log('call success');
} else {
console.log(`${res.msg}`);
}
}
);
// #endif
},
sendMessage(event) {
// 将自己发送的消息写进消息列表里面
this.$refs.messageList.updateMessageList(event.detail.message);
},
triggerClose() {
if (this.showChat) {
this.$refs.messageInput.handleClose();
}
},
goBack() {
const pages = getCurrentPages(); // 当前页面栈
if (pages[pages.length - 2].route === '/pages/im/conversation/create-conversation/create' || pages[pages.length - 2].route === 'pages/TUI-Group/create-group/create' || pages[pages.length - 2].route === 'pages/TUI-Group/join-group/join') {
uni.navigateBack({
delta: 2
});
} else {
uni.navigateBack({
delta: 1
});
}
uni.$TUIKit
.setMessageRead({
conversationID: this.conversationID
})
.then(() => {});
}
},
onShareAppMessage() {}
};
</script>
<style lang="scss" scoped>
.chatBg {
position: fixed;
/* #ifdef H5 */
top: 120rpx;
/* #endif */
/* #ifdef MP-WEIXIN || APP-PLUS */
top: 20rpx;
/* #endif */
width: 90%;
background: linear-gradient(to right, #6665f6, #fa709a);
border-radius: 10rpx;
display: flex;
left: 50%;
margin-left: -45%;
padding: 10px 20px;
box-sizing: border-box;
z-index: 99;
image {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
margin-right: 100rpx;
}
.chatUser {
color: #ffffff;
font-size: 30rpx;
font-weight: bold;
display: flex;
flex-direction: column;
justify-content: space-around;
}
}
.container {
width: 100vw;
height: 100vh;
position: relative;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: flex;
flex-direction: column;
}
.tui-chatroom-navigatorbar {
position: relative;
flex-shrink: 0;
height: 90rpx;
}
.tui-chatroom-navigatorbar-back {
position: absolute;
width: 48rpx;
height: 48rpx;
left: 24rpx;
bottom: 20rpx;
}
.conversation-title {
position: absolute;
width: 350rpx;
height: 88rpx;
line-height: 56rpx;
font-size: 36rpx;
color: #ffffff;
z-index: 100;
bottom: 0;
left: 200rpx;
display: flex;
justify-content: center;
align-items: center;
}
.message-list {
flex: 1;
width: 100vw;
overflow-y: scroll;
}
.message-input {
flex-shrink: 0;
width: 100%;
}
.calling {
position: fixed;
z-index: 199;
top: 0;
/* #ifdef H5 */
top: calc(88rpx + constant(safe-area-inset-top));
top: calc(88rpx + env(safe-area-inset-top));
/* #endif */
bottom: 0;
right: 0;
}
.group-profile {
z-index: 1111;
}
.container-box {
position: fixed;
display: flex;
justify-content: center;
align-items: center;
left: 0;
right: 0;
bottom: 0;
top: 0;
background-color: rgba(0, 0, 0, 0.5);
}
.video-message {
width: 90vw;
height: 300px;
}
</style>