import { ref, computed } from 'vue' import { onShow, onUnload } from '@dcloudio/uni-app' import { storeToRefs } from 'pinia' import api from '@/utils/api.js' import useTeamStore from '@/store/team.js' import useAccountStore from '@/store/account.js' /** * 群聊hook - 管理群聊成员和头像 * @param {string} groupID 群组ID */ export default function useGroupChat(groupID) { const groupInfo = ref({}) const members = ref([]) const teamMemberIds = ref([]) // 存储团队成员的userId列表 const patientId = ref('') // 存储患者ID const teamStore = useTeamStore() const { openid } = storeToRefs(useAccountStore()) // 群聊成员映射 const chatMember = computed(() => { const res = {} members.value.forEach(member => { res[member.id] = { name: member.name, avatar: member.avatar, isTeamMember: member.isTeamMember // 标记是否为团队成员 } // 如果成员有 miniAppId(患者的聊天 userID),也添加一个映射(用于消息的 from 字段) if (member.miniAppId) { res[member.miniAppId] = { name: member.name, avatar: member.avatar, isTeamMember: member.isTeamMember } } }) return res }) // 判断某个userId是否为团队成员 const isTeamMember = (userId) => { return teamMemberIds.value.includes(userId) } // 获取用户头像(根据是否为团队成员返回不同的默认头像) const getUserAvatar = (userId) => { const member = chatMember.value[userId] if (!member) { // 如果找不到成员信息,根据是否为团队成员返回默认头像 // 患者(userId为当前账户openid)使用 default-patient-avatar.png // 其他情况使用 default-avatar.svg return userId === openid.value ? '/static/default-patient-avatar.png' : '/static/default-avatar.svg' } // 如果有头像且不为空字符串,返回头像 if (member.avatar && member.avatar.trim() !== '') { return member.avatar } // 否则根据是否为团队成员返回默认头像 // 患者使用 default-patient-avatar.png,团队成员使用 default-avatar.svg return member.isTeamMember ? '/static/default-avatar.svg' : '/static/default-patient-avatar.png' } // 获取群聊信息和成员头像 async function getGroupInfo() { const gid = typeof groupID === 'string' ? groupID : groupID.value if (!gid) return try { // 1. 获取群聊基本信息 const groupResult = await api('getGroupListByGroupId', { groupId: gid }) if (groupResult && groupResult.success && groupResult.data) { groupInfo.value = { groupID: gid, name: groupResult.data.team?.name || '群聊', status: groupResult.data.orderStatus || 'active', teamId: groupResult.data.teamId } // 2. 如果有teamId,获取团队成员头像和名称 if (groupResult.data.teamId) { const memberMap = await teamStore.getTeamMemberAvatarsAndName(groupResult.data.teamId) // 3. 存储团队成员ID列表 teamMemberIds.value = Object.keys(memberMap) // 4. 构建团队成员列表(从返回的 { userId: { avatar, name } } 中提取) members.value = teamMemberIds.value.map(userId => { const memberInfo = memberMap[userId] || {} return { id: userId, name: memberInfo.name || userId, // 使用返回的 name,如果没有则用 userId avatar: memberInfo.avatar || '', // 使用返回的 avatar isTeamMember: true } }) // 5. 添加患者信息(使用默认患者头像) if (groupResult.data.patient) { const pid = groupResult.data.patientId?.toString() || '' patientId.value = pid members.value.push({ id: pid, name: groupResult.data.patient.name || '患者', avatar: '', // 患者不设置头像,使用默认 isTeamMember: false, miniAppId: groupResult.data.patient.miniAppId || '' // 患者的聊天 userID }) } } } } catch (error) { console.error('获取群聊信息失败:', error) } } onShow(() => { getGroupInfo() }) onUnload(() => { // 清理资源 }) return { groupInfo, members, chatMember, getGroupInfo, isTeamMember, getUserAvatar } }