ykt-wxapp/pages/message/hooks/use-group-chat.js
2026-02-02 14:12:46 +08:00

119 lines
3.5 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 // 标记是否为团队成员
}
})
return res
})
// 判断某个userId是否为团队成员
const isTeamMember = (userId) => {
return teamMemberIds.value.includes(userId)
}
// 获取用户头像(根据是否为团队成员返回不同的默认头像)
const getUserAvatar = (userId) => {
const member = chatMember.value[userId]
if (!member) {
// 如果找不到成员信息,根据是否为团队成员返回默认头像
return isTeamMember(userId) ? '/static/home/avatar.svg' : '/static/default-patient-avatar.png'
}
// 如果有头像且不为空字符串,返回头像
if (member.avatar && member.avatar.trim() !== '') {
return member.avatar
}
// 否则根据是否为团队成员返回默认头像
return member.isTeamMember ? '/static/home/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 avatarMap = await teamStore.getTeamMemberAvatars(groupResult.data.teamId)
// 3. 存储团队成员ID列表
teamMemberIds.value = Object.keys(avatarMap)
// 4. 构建团队成员列表
members.value = teamMemberIds.value.map(userId => ({
id: userId,
name: userId, // 这里可以从其他地方获取真实姓名
avatar: avatarMap[userId] || '',
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
})
}
}
}
} catch (error) {
console.error('获取群聊信息失败:', error)
}
}
onShow(() => {
getGroupInfo()
})
onUnload(() => {
// 清理资源
})
return {
groupInfo,
members,
chatMember,
getGroupInfo,
isTeamMember,
getUserAvatar
}
}