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

132 lines
4.1 KiB
JavaScript
Raw Normal View History

2026-01-28 13:38:05 +08:00
import { ref, computed } from 'vue'
import { onShow, onUnload } from '@dcloudio/uni-app'
2026-02-03 11:20:32 +08:00
import api from '@/utils/api.js'
import useTeamStore from '@/store/team.js'
2026-01-28 13:38:05 +08:00
/**
2026-02-03 11:20:32 +08:00
* 群聊hook - 管理群聊成员和头像
2026-01-28 13:38:05 +08:00
* @param {string} groupID 群组ID
*/
export default function useGroupChat(groupID) {
const groupInfo = ref({})
const members = ref([])
2026-02-03 11:20:32 +08:00
const teamMemberIds = ref([]) // 存储团队成员的userId列表
const patientId = ref('') // 存储患者ID
const teamStore = useTeamStore()
2026-01-28 13:38:05 +08:00
// 群聊成员映射
const chatMember = computed(() => {
const res = {}
members.value.forEach(member => {
res[member.id] = {
name: member.name,
2026-02-03 11:20:32 +08:00
avatar: member.avatar,
isTeamMember: member.isTeamMember // 标记是否为团队成员
2026-01-28 13:38:05 +08:00
}
2026-02-03 16:01:31 +08:00
// 如果成员有 miniAppId患者的聊天 userID也添加一个映射用于消息的 from 字段)
if (member.miniAppId) {
res[member.miniAppId] = {
name: member.name,
avatar: member.avatar,
isTeamMember: member.isTeamMember
}
}
2026-01-28 13:38:05 +08:00
})
return res
})
2026-02-03 11:20:32 +08:00
// 判断某个userId是否为团队成员
const isTeamMember = (userId) => {
return teamMemberIds.value.includes(userId)
}
// 获取用户头像(根据是否为团队成员返回不同的默认头像)
const getUserAvatar = (userId) => {
const member = chatMember.value[userId]
if (!member) {
// 如果找不到成员信息,根据是否为团队成员返回默认头像
2026-02-04 17:12:59 +08:00
// 团队成员和患者都使用 default-avatar.svg
return '/static/default-avatar.svg'
2026-02-03 11:20:32 +08:00
}
// 如果有头像且不为空字符串,返回头像
if (member.avatar && member.avatar.trim() !== '') {
return member.avatar
}
// 否则使用默认头像
2026-02-04 17:12:59 +08:00
return '/static/default-avatar.svg'
2026-02-03 11:20:32 +08:00
}
// 获取群聊信息和成员头像
2026-01-28 13:38:05 +08:00
async function getGroupInfo() {
const gid = typeof groupID === 'string' ? groupID : groupID.value
if (!gid) return
try {
2026-02-03 11:20:32 +08:00
// 1. 获取群聊基本信息
const groupResult = await api('getGroupListByGroupId', { groupId: gid })
2026-01-28 13:38:05 +08:00
2026-02-03 11:20:32 +08:00
if (groupResult && groupResult.success && groupResult.data) {
groupInfo.value = {
groupID: gid,
name: groupResult.data.team?.name || '群聊',
status: groupResult.data.orderStatus || 'active',
teamId: groupResult.data.teamId
}
2026-02-03 16:01:31 +08:00
// 2. 如果有teamId获取团队成员头像和名称
2026-02-03 11:20:32 +08:00
if (groupResult.data.teamId) {
2026-02-03 16:01:31 +08:00
const memberMap = await teamStore.getTeamMemberAvatarsAndName(groupResult.data.teamId)
2026-02-03 11:20:32 +08:00
// 3. 存储团队成员ID列表
2026-02-03 16:01:31 +08:00
teamMemberIds.value = Object.keys(memberMap)
2026-02-03 11:20:32 +08:00
2026-02-03 16:01:31 +08:00
// 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
}
})
2026-02-03 11:20:32 +08:00
// 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: '', // 患者不设置头像,使用默认
2026-02-03 16:01:31 +08:00
isTeamMember: false,
miniAppId: groupResult.data.patient.miniAppId || '' // 患者的聊天 userID
2026-02-03 11:20:32 +08:00
})
}
}
2026-01-28 13:38:05 +08:00
}
} catch (error) {
console.error('获取群聊信息失败:', error)
}
}
onShow(() => {
getGroupInfo()
})
onUnload(() => {
// 清理资源
})
return {
groupInfo,
members,
chatMember,
2026-02-03 11:20:32 +08:00
getGroupInfo,
isTeamMember,
getUserAvatar
2026-01-28 13:38:05 +08:00
}
}