miniprogramme/components/mention-selector/mention-selector.js
2025-09-12 16:08:17 +08:00

181 lines
3.7 KiB
JavaScript

// 💬 @提醒选择组件逻辑
const groupChatManager = require('../../utils/group-chat-manager.js');
Component({
properties: {
// 是否显示
visible: {
type: Boolean,
value: false
},
// 群ID
groupId: {
type: String,
value: ''
},
// 当前用户ID
currentUserId: {
type: String,
value: ''
},
// 是否显示@全体成员
showMentionAll: {
type: Boolean,
value: true
}
},
data: {
// 成员数据
allMembers: [],
filteredMembers: [],
// 搜索关键词
searchKeyword: '',
// 加载状态
loading: false
},
observers: {
'visible': function(visible) {
if (visible && this.data.groupId) {
this.loadGroupMembers();
}
},
'groupId': function(groupId) {
if (groupId && this.data.visible) {
this.loadGroupMembers();
}
}
},
methods: {
// 加载群成员
async loadGroupMembers() {
if (!this.data.groupId) return;
try {
this.setData({
loading: true
});
const result = await groupChatManager.getGroupMembers(this.data.groupId);
if (result.success) {
// 过滤掉当前用户
const members = result.data.filter(member => member.userId !== this.data.currentUserId);
this.setData({
allMembers: members,
loading: false
});
// 应用搜索过滤
this.applyFilter();
console.log('✅ 群成员加载完成:', members.length);
} else {
throw new Error(result.error || '获取群成员失败');
}
} catch (error) {
this.setData({
loading: false
});
console.error('❌ 加载群成员失败:', error);
wx.showToast({
title: '加载成员失败',
icon: 'none'
});
}
},
// 搜索输入
onSearchInput(e) {
const keyword = e.detail.value;
this.setData({
searchKeyword: keyword
});
this.applyFilter();
},
// 清除搜索
clearSearch() {
this.setData({
searchKeyword: ''
});
this.applyFilter();
},
// 应用搜索过滤
applyFilter() {
const keyword = this.data.searchKeyword.toLowerCase();
let filtered = this.data.allMembers;
if (keyword) {
filtered = this.data.allMembers.filter(member => {
const name = (member.nickname || member.username || '').toLowerCase();
return name.includes(keyword);
});
}
this.setData({
filteredMembers: filtered
});
},
// @全体成员
onMentionAll() {
console.log('💬 @全体成员');
this.triggerEvent('mention', {
type: 'all',
text: '所有人',
userIds: this.data.allMembers.map(member => member.userId)
});
this.onClose();
},
// @特定成员
onMentionMember(e) {
const member = e.currentTarget.dataset.member;
console.log('💬 @特定成员:', member);
this.triggerEvent('mention', {
type: 'user',
text: member.nickname || member.username,
userId: member.userId,
userIds: [member.userId]
});
this.onClose();
},
// 关闭选择器
onClose() {
this.setData({
searchKeyword: '',
filteredMembers: this.data.allMembers
});
this.triggerEvent('close');
},
// 点击遮罩
onMaskTap() {
this.onClose();
},
// 阻止事件冒泡
stopPropagation() {
// 阻止点击事件冒泡
}
}
});