622 lines
17 KiB
Vue
622 lines
17 KiB
Vue
<template>
|
||
<view class="container-conversation">
|
||
<!-- 顶部适配 -->
|
||
<u-navbar height="0">
|
||
<view class="u-nav-slot" slot="left"></view>
|
||
</u-navbar>
|
||
<!-- 标题栏 -->
|
||
<view class="topIcon">
|
||
消息
|
||
<view class="msgRt">
|
||
<!-- <view class="msgBox" @click="$navigateTo('/pages/im/application/application')">
|
||
<u-icon name="man-add-fill" color="#A6ADBB" size="22"></u-icon>
|
||
<text class="tips" v-if="unreadCount">{{unreadCount>99?'99+':unreadCount}}</text>
|
||
</view> -->
|
||
<view>
|
||
<u-icon @click="addBtn" name="plus-people-fill" color="#A6ADBB" size="22"></u-icon>
|
||
<view class="boxPopBg" v-if="false">
|
||
<text>
|
||
<u-icon name="photo" color="#fff"></u-icon>
|
||
</text>
|
||
<text>
|
||
<u-icon name="photo" color="#fff"></u-icon>
|
||
</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<u-search placeholder="搜索" v-model="searchKey" :show-action="false" v-if="false"></u-search>
|
||
<view class="imgBar" @click="handleRouter" v-if="false">
|
||
<view>
|
||
<image src="https://jw-uniapp.oss-cn-beijing.aliyuncs.com/static/images/imgBar/haoyou.png"></image>
|
||
<text>粉丝</text>
|
||
</view>
|
||
<view>
|
||
<image src="https://jw-uniapp.oss-cn-beijing.aliyuncs.com/static/images/imgBar/zan.png"></image>
|
||
<text>赞</text>
|
||
</view>
|
||
<view>
|
||
<image src="https://jw-uniapp.oss-cn-beijing.aliyuncs.com/static/images/imgBar/shafa.png"></image>
|
||
<text>动态</text>
|
||
</view>
|
||
<view>
|
||
<image src="https://jw-uniapp.oss-cn-beijing.aliyuncs.com/static/images/imgBar/chakan.png"></image>
|
||
<text>系统通知</text>
|
||
</view>
|
||
</view>
|
||
<!-- 通知 -->
|
||
<view class="notice" v-if="false">
|
||
<image src="https://jw-uniapp.oss-cn-beijing.aliyuncs.com/static/images/imgBar/tixing.png"></image>
|
||
<view>
|
||
开启消息通知
|
||
<text>第一时间收到Ta的私信消息</text>
|
||
</view>
|
||
<text @click="handleRouter">去开启</text>
|
||
</view>
|
||
<!-- 消息 -->
|
||
<view class="scroll-box">
|
||
<view class="uni-list margintop-bar">
|
||
<view v-if="conversationList.length > 0">
|
||
<u-swipe-action>
|
||
<u-swipe-action-item :threshold="60" :options="item.isPinned ? (item.messageRemindType == 'AcceptNotNotify' ? options4 : options1) : item.messageRemindType == 'AcceptNotNotify' ? options3 : options2" v-for="item of conversationList" :key="item.conversationID" :autoClose="true" @click="deleteConversationList($event, item.conversationID)">
|
||
<scroll-view scroll-y="true" class="scroll-Y">
|
||
<view class="swipe-action u-border-top u-border-bottom" @tap="handleRoute(item.conversationID)">
|
||
<view class="swipe-action__content">
|
||
<TUI-conversation-item class="swipe-action__content__text" :data-type="item.type" :conversation="item"></TUI-conversation-item>
|
||
</view>
|
||
</view>
|
||
</scroll-view>
|
||
</u-swipe-action-item>
|
||
</u-swipe-action>
|
||
</view>
|
||
<u-empty v-else text="暂无会话" marginTop="30" :customStyle="{height: '80vh'}" icon="https://jw-uniapp.oss-cn-beijing.aliyuncs.com/static/images/moreImg.png"></u-empty>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<!-- 这里有个加载的补丁逻辑待优化,页面向SDK请求conversationList的时候会有时延,
|
||
造成页面的一个抖动,这里加一个if逻辑打一个补丁,后续继续优化 -->
|
||
<script>
|
||
import TUIConversationItem from '@/components/tui-conversation/conversation-item/index';
|
||
import {destroy_group} from '@/common/http/tim.js'
|
||
export default {
|
||
data() {
|
||
return {
|
||
show: false,
|
||
options1: [
|
||
{
|
||
text: '恢复',
|
||
style: {
|
||
backgroundColor: '#3c9cff',
|
||
},
|
||
},
|
||
{
|
||
text: '删除',
|
||
style: {
|
||
backgroundColor: '#f56c6c',
|
||
},
|
||
},
|
||
{
|
||
text: '免打扰',
|
||
style: {
|
||
backgroundColor: '#ffaa00',
|
||
},
|
||
},
|
||
],
|
||
options4: [
|
||
{
|
||
text: '恢复',
|
||
style: {
|
||
backgroundColor: '#3c9cff',
|
||
},
|
||
},
|
||
{
|
||
text: '删除',
|
||
style: {
|
||
backgroundColor: '#f56c6c',
|
||
},
|
||
},
|
||
{
|
||
text: '提醒',
|
||
style: {
|
||
backgroundColor: '#ffaa00',
|
||
},
|
||
},
|
||
],
|
||
options2: [
|
||
{
|
||
text: '顶置',
|
||
style: {
|
||
backgroundColor: '#3c9cff',
|
||
},
|
||
},
|
||
{
|
||
text: '删除',
|
||
style: {
|
||
backgroundColor: '#f56c6c',
|
||
},
|
||
},
|
||
{
|
||
text: '免打扰',
|
||
style: {
|
||
backgroundColor: '#ffaa00',
|
||
},
|
||
},
|
||
],
|
||
options3: [
|
||
{
|
||
text: '顶置',
|
||
style: {
|
||
backgroundColor: '#3c9cff',
|
||
},
|
||
},
|
||
{
|
||
text: '删除',
|
||
style: {
|
||
backgroundColor: '#f56c6c',
|
||
},
|
||
},
|
||
{
|
||
text: '提醒',
|
||
style: {
|
||
backgroundColor: '#ffaa00',
|
||
},
|
||
},
|
||
],
|
||
conversationID: '',
|
||
searchKey: '',
|
||
conversationList: [],
|
||
showSelectTag: false,
|
||
unreadCount:0,
|
||
};
|
||
},
|
||
components: {
|
||
TUIConversationItem,
|
||
},
|
||
computed: {
|
||
isLogin() {
|
||
console.log(this.$store.state);
|
||
return this.$store.state.isLogin;
|
||
},
|
||
},
|
||
watch: {
|
||
isLogin(val) {
|
||
if (val) {
|
||
// 登入后拉去会话列表
|
||
this.getConversationList();
|
||
uni.$TUIKit.on(uni.$TUIKitEvent.CONVERSATION_LIST_UPDATED, this.onConversationListUpdated);
|
||
}
|
||
},
|
||
},
|
||
mounted() {
|
||
console.log("mounted聊天首页");
|
||
if (this.isLogin) {
|
||
// 登入后拉去会话列表
|
||
console.log("拉数据去了");
|
||
this.getFriendApplicationList();
|
||
this.getConversationList();
|
||
uni.$TUIKit.on(uni.$TUIKitEvent.CONVERSATION_LIST_UPDATED, this.onConversationListUpdated);
|
||
/* 申请列表更新时触发*/
|
||
uni.$TUIKit.on(uni.$TUIKitEvent.FRIEND_APPLICATION_LIST_UPDATED,this.onUnreadCount)
|
||
}
|
||
},
|
||
/**
|
||
* 生命周期函数--监听页面加载
|
||
*/
|
||
onShow() {
|
||
|
||
},
|
||
/**
|
||
* 生命周期函数--监听页面卸载
|
||
*/
|
||
onUnload() {
|
||
// uni.$TUIKit.off(uni.$TUIKitEvent.SDK_READY, this.onConversationListUpdated);
|
||
},
|
||
methods: {
|
||
getFriendApplicationList(){
|
||
let promise = uni.$TUIKit.getFriendApplicationList();
|
||
promise.then((imResponse)=> {
|
||
// friendApplicationList - 好友申请列表 - [FriendApplication]
|
||
// unreadCount - 好友申请的未读数
|
||
const { friendApplicationList, unreadCount } = imResponse.data;
|
||
this.unreadCount = unreadCount;
|
||
})
|
||
},
|
||
deleteConversationList: function (e, value) {
|
||
console.log(e,value);
|
||
if (e.index == '0') {
|
||
const list = this.conversationList;
|
||
const show = list.map(item => {
|
||
return item.isPinned;
|
||
});
|
||
for (var item of list) {
|
||
if (item.conversationID == value) {
|
||
if (show[list.indexOf(item)] === false) {
|
||
// 置顶会话,v2.14.0起支持
|
||
uni.$TUIKit
|
||
.pinConversation({
|
||
conversationID: value,
|
||
isPinned: true,
|
||
})
|
||
.then(imResponse => {
|
||
// 置顶会话成功
|
||
const { conversationID } = imResponse.data; // 被置顶的会话 ID
|
||
console.log(conversationID);
|
||
})
|
||
.catch(function (imError) {
|
||
console.warn('pinConversation error:', imError); // 置顶会话失败的相关信息
|
||
});
|
||
}
|
||
if (show[list.indexOf(item)] === true) {
|
||
// 取消置顶会话,v2.14.0起支持
|
||
uni.$TUIKit
|
||
.pinConversation({
|
||
conversationID: value,
|
||
isPinned: false,
|
||
})
|
||
.then(imResponse => {
|
||
// 取消置顶会话成功
|
||
const { conversationID } = imResponse.data; // 被取消置顶的会话 ID
|
||
})
|
||
.catch(function (imError) {
|
||
console.warn('pinConversation error:', imError); // 取消置顶会话失败的相关信息
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (e.index == '1') {
|
||
uni.$TUIKit
|
||
.deleteConversation(value)
|
||
.then(function (imResponse) {
|
||
//删除成功。
|
||
const { conversationID } = imResponse.data; // 被删除的会话 ID。
|
||
})
|
||
.catch(function (imError) {
|
||
console.warn('deleteConversation error:', imError); // 删除会话失败的相关信息
|
||
});
|
||
}
|
||
if (e.index == '2') {
|
||
const list = this.conversationList;
|
||
const show = list.map(item => {
|
||
return item.conversationID;
|
||
});
|
||
const num = value.substring(0, 3);
|
||
if (num === 'C2C') {
|
||
const user = value.slice(3);
|
||
if (list[show.indexOf(value)].messageRemindType === 'AcceptNotNotify') {
|
||
uni.$TUIKit
|
||
.setMessageRemindType({
|
||
userIDList: [user],
|
||
messageRemindType: this.TIM.TYPES.MSG_REMIND_ACPT_AND_NOTE,
|
||
})
|
||
.then(function (imResponse) {
|
||
// 设置成功后 SDK 会触发 TIM.EVENT.CONVERSATION_LIST_UPDATED 事件(遍历列表,并读取 Conversation.messageRemindType)
|
||
const { successUserIDList, failureUserIDList } = imResponse.data;
|
||
})
|
||
.catch(function (imError) {
|
||
console.warn('setMessageRemindType error:', imError);
|
||
});
|
||
}
|
||
if (list[show.indexOf(value)].messageRemindType === 'AcceptAndNotify') {
|
||
uni.$TUIKit
|
||
.setMessageRemindType({
|
||
userIDList: [user],
|
||
messageRemindType: this.TIM.TYPES.MSG_REMIND_ACPT_NOT_NOTE,
|
||
})
|
||
.then(function (imResponse) {
|
||
// 设置成功后 SDK 会触发 TIM.EVENT.CONVERSATION_LIST_UPDATED 事件(遍历列表,并读取 Conversation.messageRemindType)
|
||
const { successUserIDList, failureUserIDList } = imResponse.data;
|
||
})
|
||
.catch(function (imError) {
|
||
console.warn('setMessageRemindType error:', imError);
|
||
});
|
||
}
|
||
if (list[show.indexOf(value)].messageRemindType === '') {
|
||
list[show.indexOf(value)].messageRemindType = 'AcceptNotNotify';
|
||
}
|
||
}
|
||
if (num === 'GRO') {
|
||
const groupID = value.slice(5);
|
||
if (list[show.indexOf(value)].messageRemindType === 'AcceptNotNotify') {
|
||
uni.$TUIKit
|
||
.setMessageRemindType({
|
||
groupID: groupID,
|
||
messageRemindType: this.TIM.TYPES.MSG_REMIND_ACPT_AND_NOTE,
|
||
})
|
||
.then(function (imResponse) {})
|
||
.catch(function (imError) {
|
||
console.warn('setMessageRemindType error:', imError);
|
||
});
|
||
}
|
||
if (list[show.indexOf(value)].messageRemindType === 'AcceptAndNotify') {
|
||
uni.$TUIKit
|
||
.setMessageRemindType({
|
||
groupID: groupID,
|
||
messageRemindType: this.TIM.TYPES.MSG_REMIND_ACPT_NOT_NOTE,
|
||
})
|
||
.then(function (imResponse) {})
|
||
.catch(function (imError) {
|
||
console.warn('setMessageRemindType error:', imError);
|
||
});
|
||
}
|
||
}
|
||
}
|
||
},
|
||
handleRouter() {
|
||
destroy_group('GROUP12').then((res)=>{
|
||
console.log(res);
|
||
}).catch((err)=>{
|
||
console.log(err);
|
||
})
|
||
uni.showToast({
|
||
title: '跳转',
|
||
icon: 'none',
|
||
});
|
||
},
|
||
addBtn() {
|
||
uni.showActionSheet({
|
||
itemList:[... ['添加好友', '创建群聊', '加入群聊', '扫一扫','通讯录'],`新的好友`],
|
||
success: res => {
|
||
// /pages/im/application/application
|
||
switch (res.tapIndex + 1) {
|
||
case 1:
|
||
uni.navigateTo({
|
||
url: '/pages/im/conversation/create-conversation/create',
|
||
});
|
||
break;
|
||
|
||
case 2:
|
||
uni.navigateTo({
|
||
url: '/pages/im/group/create-group/create',
|
||
});
|
||
break;
|
||
|
||
case 3:
|
||
uni.navigateTo({
|
||
url: '/pages/im/group/join-group/join',
|
||
});
|
||
break;
|
||
case 4:
|
||
uni.scanCode({
|
||
success: function (res) {
|
||
console.log('条码类型:' + res.scanType);
|
||
console.log('条码内容:' + res.result);
|
||
},
|
||
});
|
||
break;
|
||
case 5:
|
||
uni.navigateTo({
|
||
url: '../chat/list',
|
||
});
|
||
break;
|
||
case 6:
|
||
uni.navigateTo({
|
||
url: '/pages/im/application/application',
|
||
});
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
},
|
||
fail: res => {
|
||
console.log(res.errMsg);
|
||
},
|
||
});
|
||
},
|
||
handleRoute(id) {
|
||
uni.navigateTo({
|
||
url: `/pages/im/chat/chat?conversationID=${id}`,
|
||
});
|
||
},
|
||
onUnreadCount(event){
|
||
const { friendApplicationList, unreadCount } = event.data;
|
||
this.unreadCount = unreadCount;
|
||
},
|
||
onConversationListUpdated(event) {
|
||
this.conversationList = event.data;
|
||
},
|
||
pullDownRefresh(){
|
||
console.log("pullDownRefresh刷新聊天首页");
|
||
if (this.isLogin) {
|
||
// 登入后拉去会话列表
|
||
console.log("拉数据去了");
|
||
this.getFriendApplicationList();
|
||
this.getConversationList();
|
||
uni.$TUIKit.on(uni.$TUIKitEvent.CONVERSATION_LIST_UPDATED, this.onConversationListUpdated);
|
||
setTimeout(()=>{
|
||
uni.stopPullDownRefresh()
|
||
},2500)
|
||
}
|
||
},
|
||
getConversationList() {
|
||
console.log(789);
|
||
uni.$TUIKit.getConversationList().then(imResponse => {
|
||
console.log(imResponse);
|
||
this.conversationList = imResponse.data.conversationList;
|
||
});
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
.container-conversation {
|
||
display: flex;
|
||
flex-direction: column;
|
||
box-sizing: border-box;
|
||
background-color: #fff;
|
||
width: 100%;
|
||
padding: 0 30rpx;
|
||
|
||
.boxPopBg {
|
||
position: absolute;
|
||
right: 20rpx;
|
||
top: 10rpx;
|
||
background: #303133;
|
||
width: 230rpx;
|
||
height: auto;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: center;
|
||
align-items: center;
|
||
border-radius: 6rpx;
|
||
|
||
> text {
|
||
width: 100%;
|
||
height: 80rpx;
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
color: #fff;
|
||
border-bottom: 1rpx solid #fff;
|
||
font-size: 30rpx;
|
||
}
|
||
|
||
.topTag {
|
||
position: absolute;
|
||
width: 0;
|
||
height: 0;
|
||
border-bottom: solid 5px #303133;
|
||
border-right: solid 5px transparent;
|
||
border-left: solid 5px transparent;
|
||
right: 15px;
|
||
top: 0px;
|
||
z-index: 999;
|
||
}
|
||
}
|
||
|
||
.notice {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-evenly;
|
||
height: 130rpx;
|
||
background: #ffffff;
|
||
box-shadow: 0px 4rpx 27rpx 11rpx rgba(80, 15, 101, 0.09);
|
||
border-radius: 19rpx;
|
||
margin-bottom: 30rpx;
|
||
|
||
> image {
|
||
width: 56rpx;
|
||
height: 56rpx;
|
||
}
|
||
|
||
> view {
|
||
display: flex;
|
||
flex-direction: column;
|
||
font-size: 28rpx;
|
||
font-weight: bold;
|
||
color: #333333;
|
||
|
||
text {
|
||
font-size: 24rpx;
|
||
font-weight: bold;
|
||
color: #999999;
|
||
}
|
||
}
|
||
|
||
> text {
|
||
width: 138rpx;
|
||
height: 57rpx;
|
||
background: linear-gradient(99deg, #fd8be0 0%, #48c5fe 100%);
|
||
border-radius: 29rpx;
|
||
font-size: 30rpx;
|
||
font-weight: bold;
|
||
color: #ffffff;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
}
|
||
|
||
.imgBar {
|
||
padding: 40rpx 0;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
|
||
view {
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
|
||
image {
|
||
width: 90rpx;
|
||
height: 90rpx;
|
||
}
|
||
|
||
text {
|
||
margin-top: 20rpx;
|
||
font-size: 30rpx;
|
||
color: #333;
|
||
}
|
||
}
|
||
}
|
||
|
||
.topIcon {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
font-size: 40rpx;
|
||
height: 80rpx;
|
||
align-items: center;
|
||
margin-bottom: 30rpx;
|
||
font-weight: bold;
|
||
z-index: 99999;
|
||
margin-top: 10rpx;
|
||
/* #ifdef APP-PLUS */
|
||
margin-top: 90rpx;
|
||
/* #endif */
|
||
/* #ifdef MP-WEIXIN */
|
||
.msgRt {
|
||
margin-right: 200rpx;
|
||
}
|
||
/* #endif */
|
||
.msgBox{
|
||
position: relative;
|
||
.tips{
|
||
position: absolute;
|
||
right: -20rpx;
|
||
top: -10rpx;
|
||
color: white;
|
||
font-size: 20rpx;
|
||
padding: 0 14rpx;
|
||
border-radius: 50rpx;
|
||
z-index: 9;
|
||
background-color: #CA0400;
|
||
}
|
||
}
|
||
view {
|
||
display: flex;
|
||
align-items: center;
|
||
|
||
.u-icon {
|
||
margin-left: 30rpx;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.scroll-box {
|
||
height: calc(100vh - 220rpx);
|
||
}
|
||
|
||
.margintop-bar {
|
||
margin-bottom: 160 rpx;
|
||
}
|
||
|
||
.btn-show-more {
|
||
display: flex;
|
||
width: 160rpx;
|
||
height: 160rpx;
|
||
padding-left: 3rpx;
|
||
}
|
||
|
||
.picker {
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
width: 100%;
|
||
height: 96rpx;
|
||
}
|
||
</style>
|