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

106 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
const patientDefaultAvatar = '/static/default-patient-avatar.png'
const teamMemberDefaultAvatar = '/static/default-avatar.svg'
/**
* 获取单个群聊的头像列表
* @param {string} groupID 群组ID
* @param {string} teamId 团队ID
* @param {string} patientId 患者ID
* @returns {Promise<Array>} 头像URL数组仅包含团队成员头像不包含患者头像
*/
async function getGroupAvatarList(groupID, teamId, patientId) {
try {
if (!teamId) {
console.warn(`群聊 ${groupID} 没有 teamId无法获取头像`)
return []
}
// 获取团队成员的头像和名称
const memberMap = await teamStore.getTeamMemberAvatarsAndName(teamId)
if (!memberMap || Object.keys(memberMap).length === 0) {
console.warn(`群聊 ${groupID} 的团队成员为空`)
return []
}
// 提取头像列表(过滤掉空头像,使用默认头像替代)
const avatarList = Object.values(memberMap)
.map(member => {
// 如果成员有头像且不为空,使用成员头像;否则使用团队成员默认头像
return (member.avatar && member.avatar.trim() !== '')
? member.avatar
: teamMemberDefaultAvatar
})
console.log(`群聊 ${groupID} 的头像列表已加载,共 ${avatarList.length} 个团队成员头像`)
return avatarList
} catch (error) {
console.error(`获取群聊 ${groupID} 的头像列表失败:`, error)
return []
}
}
/**
* 批量获取多个群聊的头像列表
* @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
* @returns {Array} 头像URL数组仅包含团队成员头像
*/
function getAvatarList(groupID) {
return groupAvatarMap.value[groupID] || []
}
/**
* 清空缓存
*/
function clearCache() {
groupAvatarMap.value = {}
}
return {
groupAvatarMap,
getGroupAvatarList,
loadGroupAvatars,
getAvatarList,
clearCache
}
}