jiuyiUniapp/jiuyi2/components/news/msgList.vue

411 lines
9.0 KiB
Vue
Raw Normal View History

2024-12-18 15:46:27 +08:00
<script setup>
2025-02-15 16:09:39 +08:00
/**
* 消息列表
*/
import api from '@/api/index.js'
import {
ref,
computed,
reactive,
onMounted,
onUnmounted,
getCurrentInstance,
} from 'vue'
// 腾讯云聊天
import TencentCloudChat from '@tencentcloud/chat';
// 工具库
import util from '@/common/js/util.js'
import {
useStore,
} from 'vuex'
const {
proxy
} = getCurrentInstance()
const store = useStore()
const userinfo = computed(() => {
let result = store.state.userinfo
return result
})
// 右滑菜单
const rightOption = [{
text: '删除',
style: {
backgroundColor: '#F85050'
},
fn: (item) => delMsg(item)
}, {
text: '设为已读',
style: {
backgroundColor: '#00ADEE'
},
fn: (item) => setRead(item)
},]
// 系统
const systemRightOption = [{
text: '删除',
style: {
backgroundColor: '#F85050'
},
}, {
text: '设为已读',
style: {
backgroundColor: '#00ADEE'
},
},]
2025-02-19 16:36:12 +08:00
// 传入参数
const props = defineProps({
// 类型
type: {
type: Number,
default: 0,
},
})
2025-02-15 16:09:39 +08:00
// 用户列表
const list = reactive([])
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
onMounted(() => {
2025-02-19 16:36:12 +08:00
if (props.type == 0) {
getList()
2025-02-20 15:12:53 +08:00
} else if (props.type == 1) {
2025-02-19 16:36:12 +08:00
// 视频消息
} else if (props.type == 2) {
// 商城消息
}
2025-02-15 16:09:39 +08:00
addListener()
})
onUnmounted(() => {
2025-02-20 15:12:53 +08:00
removeListener()
2025-02-15 16:09:39 +08:00
})
// 开启监听消息
function addListener() {
let onMessageReceived = function (event) {
2024-12-18 15:46:27 +08:00
getList()
2025-02-15 16:09:39 +08:00
}
uni.$chat.on(TencentCloudChat.EVENT.CONVERSATION_LIST_UPDATED, onMessageReceived);
}
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
// 移除监听
function removeListener() {
2025-02-21 17:57:08 +08:00
uni.$chat.off(TencentCloudChat.EVENT.CONVERSATION_LIST_UPDATED, () => { });
2025-02-15 16:09:39 +08:00
}
2025-02-19 16:36:12 +08:00
// 获取消息列表
2025-02-15 16:09:39 +08:00
function getList() {
2025-02-21 17:57:08 +08:00
// 验证sdk是否准备完毕
let isReady = uni.$chat.isReady();
if (!isReady) {
setTimeout(function () {
getList();
}, 800);
return
}
uni.$emit('updateNum', {})
uni.$chat.getConversationList().then(rs => {
let res = rs.data.conversationList
let arr = []
res.forEach(item => {
let obj = {}
obj.type = item.type;
obj.chatText = item.lastMessage.messageForShow;
obj.MsgTime = handleDate(item.lastMessage.lastTime);
obj.unreadCount = item.unreadCount;
if (item.type == 'C2C') {
obj.avatar = item.userProfile.avatar;
obj.name = item.userProfile.nick;
obj.userID = item.userProfile.userID;
} else if (item.type == 'GROUP') {
obj.avatar = item.groupProfile.avatar;
obj.name = item.groupProfile.name;
obj.num = item.groupProfile.memberCount;
obj.groupID = item.groupProfile.groupID;
}
arr.push(obj)
2025-02-15 16:09:39 +08:00
})
2025-02-21 17:57:08 +08:00
list.data = arr;
2024-12-18 15:46:27 +08:00
})
2025-02-21 17:57:08 +08:00
// api.news.getMessageList({
// query: {
// userId: userinfo.value.id,
// }
// }).then(rs => {
// if (rs.code == 200) {
// let msg = JSON.parse(rs.msg);
// list.data = handleList(msg.SessionItem);
// return
// }
// util.alert({
// content: rs.msg,
// showCancel: false,
// })
// })
2025-02-15 16:09:39 +08:00
}
/**
* 消息列表
* @param {Object} item
*/
function handleList(list) {
// 验证sdk是否准备完毕
let isReady = uni.$chat.isReady();
if (!isReady) {
setTimeout(function () {
2025-02-20 15:12:53 +08:00
handleList(list);
2025-02-19 16:36:12 +08:00
}, 800);
2025-02-15 16:09:39 +08:00
return
2024-12-18 15:46:27 +08:00
}
2025-02-21 17:57:08 +08:00
if (list) {
list.forEach(item => {
item.MsgTime = handleDate(item.MsgTime)
let type = item.Type == 1 ? `C2C${item.To_Account}` : `GROUP${item.GroupId}`;
uni.$chat.getConversationProfile(type).then(rs => {
let res = rs.data.conversation;
item.chatText = res.lastMessage.messageForShow;
item.unreadCount = res.unreadCount;
if (item.Type == 1) {
item.avatar = res.userProfile.avatar;
item.name = res.userProfile.nick;
} else if (item.Type == 2) {
item.avatar = res.groupProfile.avatar;
item.name = res.groupProfile.name;
item.num = res.groupProfile.memberCount;
}
})
2025-02-20 15:12:53 +08:00
})
2025-02-21 17:57:08 +08:00
}
2024-12-18 15:46:27 +08:00
2025-02-20 15:12:53 +08:00
return list
2025-02-15 16:09:39 +08:00
}
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
// // 点击用户
// function handleUser(item) {
// uni.navigateTo({
// url: util.setUrl('/pages/index/videoHome', {
// userId: item.userId,
// })
// })
// }
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
// // 跳转
// function navigateToPage(path) {
// uni.navigateTo({
// url: path
// });
// }
/**
* 去聊天
* @param {Object} item
*/
function handleChat(item) {
let param = {};
// 单聊
2025-02-21 17:57:08 +08:00
if (item.type == 'C2C') {
2025-02-15 16:09:39 +08:00
param.type = 'C2C'
2025-02-20 15:12:53 +08:00
param.name = `${item.name}`
2025-02-21 17:57:08 +08:00
param.msgId = `${item.userID}`
2025-02-15 16:09:39 +08:00
} else {
2024-12-18 15:46:27 +08:00
// 群聊
2025-02-15 16:09:39 +08:00
param.type = 'GROUP'
2025-02-20 15:12:53 +08:00
param.name = `${item.name}`
2025-02-21 17:57:08 +08:00
param.msgId = `${item.groupID}`
2025-02-20 15:12:53 +08:00
param.num = `${item.num}`
2024-12-18 15:46:27 +08:00
}
2025-02-19 16:36:12 +08:00
setRead(item)
2025-02-15 16:09:39 +08:00
util.toChat(param)
}
/**
* 菜单
* @param {Object} ev 默认事件
* @param {Object} item 单项
*/
function handleMenu(ev, item) {
console.log('ev', ev, item)
ev.content.fn(item)
proxy.$refs.swipeAction.closeAll()
}
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
// 删除会话
function delMsg(item) {
// 验证sdk是否准备完毕
let isReady = uni.$chat.isReady();
if (!isReady) {
setTimeout(function () {
delMsg(item);
2025-02-19 16:36:12 +08:00
}, 800);
2025-02-15 16:09:39 +08:00
return
2024-12-18 15:46:27 +08:00
}
2025-02-21 17:57:08 +08:00
let conversationId = item.Type == 1 ? `C2C${item.userID}` : `GROUP${item.groupID}`;
2025-02-15 16:09:39 +08:00
2025-02-18 11:38:36 +08:00
uni.$chat.deleteConversation(conversationId).then(rs => {
2025-02-15 16:09:39 +08:00
getList()
})
}
// 标为已读
function setRead(item) {
// 验证sdk是否准备完毕
let isReady = uni.$chat.isReady();
if (!isReady) {
setTimeout(function () {
setRead(item);
2025-02-19 16:36:12 +08:00
}, 800);
2025-02-15 16:09:39 +08:00
return
2024-12-18 15:46:27 +08:00
}
2025-02-15 16:09:39 +08:00
2025-02-21 17:57:08 +08:00
let conversationId = item.Type == 1 ? `C2C${item.userID}` : `GROUP${item.groupID}`;
2025-02-15 16:09:39 +08:00
uni.$chat.setMessageRead({
conversationID: conversationId,
}).then(rs => {
getList()
})
}
2025-02-20 15:12:53 +08:00
// 时间转换
function handleDate(timestamp) {
var timestamp = +timestamp * 1000;
var date = new Date(timestamp);
var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
var s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
var formattedDate = M + D + h + m + s;
return formattedDate
}
2025-02-15 16:09:39 +08:00
2024-12-18 15:46:27 +08:00
</script>
<template>
<view class="firendBox pr">
<scroll-view scroll-y="true" class="scroll">
<uni-swipe-action ref="swipeAction">
<view class="list pb30">
<!-- <uni-swipe-action-item :right-options="systemRightOption">
<view class="item rows ptb20 plr30">
<view class="image wh90 pr">
2025-02-15 16:09:39 +08:00
<image class="cir wh90" src="/static/msg1.png" mode="aspectFill" />
2024-12-18 15:46:27 +08:00
<view class="dot pa t0 r0 cir" v-if="1"></view>
</view>
<view class="col f1 ml20">
<view class="rows">
<view class="name f1 thd c333 f32">新的关注</view>
</view>
<view class="desc thd mt10 c666 f24">新增一位关注快看看是谁吧~</view>
</view>
</view>
2025-02-15 16:09:39 +08:00
</uni-swipe-action-item>
<uni-swipe-action-item :right-options="systemRightOption">
2024-12-18 15:46:27 +08:00
<view class="item rows ptb20 plr30">
<view class="image wh90 pr">
<image class="cir wh90" src="/static/msg1.png" mode="aspectFill" />
<view class="dot pa t0 r0 cir" v-if="1"></view>
</view>
<view class="col f1 ml20">
<view class="rows">
<view class="name f1 thd c333 f32">互动消息</view>
</view>
<view class="desc thd mt10 c666 f24">快去看看吧~</view>
</view>
</view>
2025-02-15 16:09:39 +08:00
</uni-swipe-action-item>
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
<uni-swipe-action-item :right-options="systemRightOption">
2024-12-18 15:46:27 +08:00
<view class="item rows ptb20 plr30">
<view class="image wh90 pr">
2025-02-15 16:09:39 +08:00
<image class="cir wh90" src="/static/msg2.png" mode="aspectFill" />
2024-12-18 15:46:27 +08:00
<view class="dot pa t0 r0 cir" v-if="0"></view>
</view>
<view class="col f1 ml20">
<view class="rows">
<view class="name f1 thd c333 f32">系统消息</view>
<view class="datetime c999 f22">16:06</view>
</view>
<view class="desc thd mt10 c666 f24">平台福利上新快来玩转平台</view>
</view>
</view>
</uni-swipe-action-item> -->
2025-02-15 16:09:39 +08:00
<uni-swipe-action-item :right-options="rightOption" v-for="(item, index) in list.data" :key="index"
@click="handleMenu($event, item)">
2025-02-19 16:36:12 +08:00
<view class="item rows ptb20 plr30" @click.stop="handleChat(item)">
2024-12-18 15:46:27 +08:00
<view class="image wh90 pr">
2025-02-20 15:12:53 +08:00
<image class="cir wh90" :src="item.avatar" mode="aspectFill" />
2025-02-15 16:09:39 +08:00
<view class="mark pa t0 r0 cfff f22 cir" v-if="item.unreadCount">{{ item.unreadCount }}
</view>
2024-12-18 15:46:27 +08:00
</view>
<view class="col f1 ml20">
<view class="rows">
2025-02-20 15:12:53 +08:00
<view class="name f1 thd c333 f32">{{ item.name }}</view>
2025-02-12 09:05:14 +08:00
<view class="datetime c999 f22">
2025-02-20 15:12:53 +08:00
{{ util.formatTime('MM-dd HH:mm', item.MsgTime) }}</view>
2024-12-18 15:46:27 +08:00
</view>
2025-02-18 11:38:36 +08:00
<view class="desc thd mt10 c666 f24">{{ item.chatText }}</view>
2024-12-18 15:46:27 +08:00
</view>
</view>
</uni-swipe-action-item>
<view class="mtb20 tac c999 f20">到底啦~</view>
</view>
</uni-swipe-action>
</scroll-view>
</view>
</template>
<style lang="scss">
2025-02-15 16:09:39 +08:00
// 朋友列表
.firendBox {
height: 100%;
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
.scroll {
height: 100%;
}
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
// 列表
.list {
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
// 消息提示点
.mark,
.dot {
background-color: #FF6B17;
text-align: center;
line-height: 30rpx;
}
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
.mark {
width: 30rpx;
height: 30rpx;
}
2024-12-18 15:46:27 +08:00
2025-02-15 16:09:39 +08:00
.dot {
width: 20rpx;
height: 20rpx;
2024-12-18 15:46:27 +08:00
}
}
2025-02-15 16:09:39 +08:00
}
2024-12-18 15:46:27 +08:00
</style>