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.

148 lines
4.4 KiB

4 weeks ago
<template>
<uni-popup ref="popup" type="right" >
<view class="chat-group-readed">
<view class="uni-padding-wrap uni-common-mt">
<uni-segmented-control :current="current" :values="items" style-type="button"
active-color="#9CE0DCFF"
in-active-color="white"
@clickItem="onClickItem" />
</view>
<view class="content">
<!-- 已读列表 -->
<view v-if="current === 0" class="member-list">
<scroll-view scroll-y="true" style="max-height: 400rpx;">
<view v-for="(item, index) in readedMembers" :key="index" class="member-item">
<head-image :name="item.showNickName" :online="item.online" :url="item.headImage"
:size="90"></head-image>
<view class="member-name">{{ item.showNickName }}</view>
</view>
</scroll-view>
</view>
<!-- 未读列表 -->
<view v-if="current === 1" class="member-list">
<scroll-view scroll-y="true" style="max-height: 400rpx;">
<view v-for="(item, index) in unreadMembers" :key="index" class="member-item">
<head-image :name="item.showNickName" :online="item.online" :url="item.headImage"
:size="90"></head-image>
<view class="member-name">{{ item.showNickName }}</view>
</view>
</scroll-view>
</view>
</view>
</view>
</uni-popup>
</template>
<script>
export default {
name: "chat-group-readed",
props: {
msgInfo: {
type: Object,
required: true
},
groupMembers: {
type: Array,
default: () => []
}
},
data() {
return {
items: ['已读', '未读'],
current: 0,
readedMembers: [],
unreadMembers: []
};
},
methods: {
open() {
this.$refs.popup.open();
// this.loadReadedUser();
},
async loadReadedUser() {
this.readedMembers = [];
this.unreadMembers = [];
await uni.$http.get( `/api/message/group/findReadedUsers?groupId=${this.msgInfo.groupId}&messageId=${this.msgInfo.id}`)
.then(res => {
this.groupMembers.forEach(member => {
// 发送者和已退群的不显示
if (member.userId == this.msgInfo.sendId || member.quit) {
return;
}
if (res.data.data.find(userId => member.userId == Number(userId))) {
this.readedMembers.push(member);
console.log(member)
} else {
this.unreadMembers.push(member);
}
});
this.items[0] = `已读(${this.readedMembers.length})`;
this.items[1] = `未读(${this.unreadMembers.length})`;
// 更新已读人数(通过 Vuex
const chatInfo = { type: 'GROUP', targetId: this.msgInfo.groupId };
const msgInfo = {
id: this.msgInfo.id,
groupId: this.msgInfo.groupId,
readedCount: this.readedMembers.length
};
// 若已通过 mapActions 映射 updateMessage可直接 this.updateMessage({ msgInfo, chatInfo })
// 否则使用 dispatch
if (this.updateMessage) {
this.updateMessage({ msgInfo, chatInfo });
} else {
this.$store.dispatch('chatStore/updateMessage', { msgInfo, chatInfo });
}
}).catch(err => {
console.error('加载已读用户失败', err);
});
},
onClickItem(e) {
this.current = e.currentIndex;
}
}
}
</script>
<style lang="scss" scoped>
.chat-group-readed {
// 深度选择器,穿透 scoped
::v-deep .uni-segmented-control__item {
color: #333 !important; // 未选中文字颜色
&.uni-segmented-control__item--active {
color: #007AFF !important; // 选中文字颜色
// 若需要调整背景色,可另设
background-color: transparent !important; // 或保持原色
}
}
}
.chat-group-readed {
position: relative;
display: flex;
flex-direction: column;
background-color: white;
padding: 10rpx;
}
.member-item {
height: 120rpx;
display: flex;
position: relative;
padding: 0 30rpx;
align-items: center;
background-color: white;
white-space: nowrap;
.member-name {
flex: 1;
padding-left: 20rpx;
font-size: 30rpx;
font-weight: 600;
line-height: 60rpx;
white-space: nowrap;
overflow: hidden;
}
}
</style>