ykt-team-wxapp/pages/message/hooks/use-group-avatars.js

105 lines
3.2 KiB
JavaScript
Raw Normal View History

2026-02-03 16:38:45 +08:00
import { ref, computed } from 'vue'
import api from '@/utils/api.js'
import useTeamStore from '@/store/team.js'
/**
* 群聊头像管理hook - 为消息列表中的每个群聊获取成员头像
* 用于在消息列表中显示群聊的group-avatar组件
*/
export default function useGroupAvatars() {
const groupAvatarMap = ref({}) // { groupID: [avatarUrl1, avatarUrl2, ...] }
const teamStore = useTeamStore()
2026-02-05 11:26:53 +08:00
const patientDefaultAvatar = '/static/default-patient-avatar.png'
2026-02-11 16:12:30 +08:00
const teamMemberDefaultAvatar = '/static/default-avatar.png'
2026-02-03 16:38:45 +08:00
/**
* 获取单个群聊的头像列表
* @param {string} groupID 群组ID
* @param {string} teamId 团队ID
* @param {string} patientId 患者ID
2026-02-08 13:47:13 +08:00
* @returns {Promise<Array>} 头像URL数组仅包含团队成员头像不包含患者头像
2026-02-03 16:38:45 +08:00
*/
async function getGroupAvatarList(groupID, teamId, patientId) {
try {
if (!teamId) {
console.warn(`群聊 ${groupID} 没有 teamId无法获取头像`)
2026-02-08 13:47:13 +08:00
return []
2026-02-03 16:38:45 +08:00
}
// 获取团队成员的头像和名称
const memberMap = await teamStore.getTeamMemberAvatarsAndName(teamId)
2026-02-10 16:57:05 +08:00
2026-02-03 16:38:45 +08:00
if (!memberMap || Object.keys(memberMap).length === 0) {
console.warn(`群聊 ${groupID} 的团队成员为空`)
2026-02-08 13:47:13 +08:00
return []
2026-02-03 16:38:45 +08:00
}
// 提取头像列表(过滤掉空头像,使用默认头像替代)
const avatarList = Object.values(memberMap)
.map(member => {
2026-02-05 11:26:53 +08:00
// 如果成员有头像且不为空,使用成员头像;否则使用团队成员默认头像
2026-02-10 16:57:05 +08:00
return (member.avatar && member.avatar.trim() !== '')
? member.avatar
2026-02-05 11:26:53 +08:00
: teamMemberDefaultAvatar
2026-02-03 16:38:45 +08:00
})
2026-02-08 13:47:13 +08:00
console.log(`群聊 ${groupID} 的头像列表已加载,共 ${avatarList.length} 个团队成员头像`)
2026-02-03 16:38:45 +08:00
return avatarList
} catch (error) {
console.error(`获取群聊 ${groupID} 的头像列表失败:`, error)
2026-02-08 13:47:13 +08:00
return []
2026-02-03 16:38:45 +08:00
}
}
/**
* 批量获取多个群聊的头像列表
* @param {Array} conversationList 会话列表
* @returns {Promise<void>}
*/
async function loadGroupAvatars(conversationList) {
if (!conversationList || conversationList.length === 0) {
return
}
try {
// 并发加载所有群聊的头像
const promises = conversationList.map(async (conversation) => {
const avatarList = await getGroupAvatarList(
conversation.groupID,
conversation.teamId,
conversation.patientId
)
groupAvatarMap.value[conversation.groupID] = avatarList
})
await Promise.all(promises)
console.log('所有群聊头像加载完成')
} catch (error) {
console.error('批量加载群聊头像失败:', error)
}
}
/**
* 获取指定群聊的头像列表
* @param {string} groupID 群组ID
2026-02-08 13:47:13 +08:00
* @returns {Array} 头像URL数组仅包含团队成员头像
2026-02-03 16:38:45 +08:00
*/
function getAvatarList(groupID) {
2026-02-08 13:47:13 +08:00
return groupAvatarMap.value[groupID] || []
2026-02-03 16:38:45 +08:00
}
/**
* 清空缓存
*/
function clearCache() {
groupAvatarMap.value = {}
}
return {
groupAvatarMap,
getGroupAvatarList,
loadGroupAvatars,
getAvatarList,
clearCache
}
}