ykt-team-wxapp/pages/message/hooks/use-group-chat.js
2026-02-03 16:01:31 +08:00

132 lines
4.1 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 { onShow, onUnload } from '@dcloudio/uni-app'
import api from '@/utils/api.js'
import useTeamStore from '@/store/team.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 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) {
// 如果找不到成员信息,根据是否为团队成员返回默认头像
// 团队成员和患者都使用 default-avatar.png
return '/static/default-avatar.png'
}
// 如果有头像且不为空字符串,返回头像
if (member.avatar && member.avatar.trim() !== '') {
return member.avatar
}
// 否则使用默认头像
return '/static/default-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
}
}