137 lines
4.5 KiB
JavaScript
137 lines
4.5 KiB
JavaScript
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
|
||
}
|
||
}
|