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-10 16:57:05 +08:00
|
|
|
|
const teamMemberDefaultAvatar = '/static/default-avatar.svg'
|
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
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|