harmony/localconversationkit_ui/src/main/ets/viewmodel/LocalConversationViewModel.ets
2025-07-15 14:16:15 +08:00

274 lines
10 KiB
Plaintext

/*
* Copyright (c) 2022 NetEase, Inc. All rights reserved.
* Use of this source code is governed by a MIT license that can be
* found in the LICENSE file.
*
*/
import { patientDbManager } from '@itcast/basic'
import { ChatKitClient, LocalConversationRepo, TeamRepo } from '@nimkit/chatkit'
import {
V2NIMConnectStatus,
V2NIMConversationType,
V2NIMFriend,
V2NIMFriendDeletionType,
V2NIMLocalConversation,
V2NIMLoginStatus,
V2NIMTeam,
V2NIMTeamType
} from '@nimsdk/base'
import { Constant } from '../loader/Constant'
import { AitServer, AitSession, AitSessionChangeEvent } from '../service/ait/AitService'
@ObservedV2
export class LocalConversationViewModel {
static logTag = 'ConversationViewModel'
//是否已经加载完成
public isFinished: boolean = false
//会话列表数据
@Trace conversationList?: V2NIMLocalConversation[]
@Trace isFinishedSyncLoad?: boolean = false
onUreadMessageChange?: (unreadCount?: number) => void = undefined
// 网络连接状态
@Trace networkBroken: boolean = ChatKitClient.connectBroken()
//记录偏移量,下次请求使用
private offset: number = 0
//每次请求拉取的上限
private limit: number = Constant.PAGE_SIZE
//被@的会话
@Trace aitConversationList: Set<string> = new Set()
//会话排序
sortConversation(a: V2NIMLocalConversation, b: V2NIMLocalConversation): number {
return b.sortOrder - a.sortOrder
}
initConversation() {
//首先拉取一次
// if (ChatKitClient.haveSyncedConversation) {
this.loadConversation(0)
// }
//添加监听
ChatKitClient.nim.localConversationService?.on('onSyncFinished',
async () => {
//同步完成拉一次
ChatKitClient.logger?.debug(`${LocalConversationViewModel.logTag} onSyncFinished`)
await this.loadConversation(0)
this.isFinishedSyncLoad = true
}
)
ChatKitClient.nim.localConversationService?.on('onSyncFailed',
async (err) => {
//同步完成拉一次
ChatKitClient.logger?.debug(`${LocalConversationViewModel.logTag} onSyncFailed`+err)
}
)
// 长连接状态变更
ChatKitClient.nim.loginService?.on('onConnectStatus',
(status: V2NIMConnectStatus) => {
if (status !== V2NIMConnectStatus.V2NIM_CONNECT_STATUS_CONNECTED) {
this.networkBroken = true
}
}
)
// 登录状态变更
ChatKitClient.nim.loginService?.on('onLoginStatus',
(status: V2NIMLoginStatus) => {
if (status === V2NIMLoginStatus.V2NIM_LOGIN_STATUS_LOGINED) {
this.networkBroken = false
}
}
)
//好友信息变更修改
ChatKitClient.nim.friendService?.on('onFriendInfoChanged', async (friend: V2NIMFriend) => {
await this.updateConversationById(ChatKitClient.nim.conversationIdUtil.p2pConversationId(friend.accountId))
})
//好友删除,别名不存在需要更新
ChatKitClient.nim.friendService?.on('onFriendDeleted',
async (accountId: string, deletionType: V2NIMFriendDeletionType) => {
await this.updateConversationById(ChatKitClient.nim.conversationIdUtil.p2pConversationId(accountId))
})
//群解散
ChatKitClient.nim.teamService?.on('onTeamDismissed', (team: V2NIMTeam) => {
this.deleteConversation(ChatKitClient.nim.conversationIdUtil.teamConversationId(team.teamId))
})
//退出群
ChatKitClient.nim.teamService?.on('onTeamLeft', (team: V2NIMTeam) => {
this.deleteConversation(ChatKitClient.nim.conversationIdUtil.teamConversationId(team.teamId))
})
//会话未读数变化
ChatKitClient.nim.localConversationService?.on('onTotalUnreadCountChanged', (unreadCount: number) => {
if (this.onUreadMessageChange) {
this.onUreadMessageChange(unreadCount)
}
})
//会话创建
ChatKitClient.nim.localConversationService?.on('onConversationCreated', (conversation: V2NIMLocalConversation) => {
ChatKitClient.logger?.debug(`${LocalConversationViewModel.logTag} onConversationCreated type is ${conversation.type}`)
if (conversation.type === V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM) {
this.addTeamConversation(conversation)
} else {
let existConversation: V2NIMLocalConversation | undefined =
this.conversationList?.find((m) => m.conversationId === conversation.conversationId)
//如果已经存在,则不处理
if (existConversation) {
return
}
this.conversationList?.push(...[conversation])
this.conversationList?.sort((a, b) => this.sortConversation(a, b))
}
})
//会话删除
ChatKitClient.nim.localConversationService?.on('onConversationDeleted', (conversationIds: string[]) => {
this.conversationList =
this.conversationList?.filter(conversation => !conversationIds.includes(conversation.conversationId))
})
//会话更新
ChatKitClient.nim.localConversationService?.on('onConversationChanged', (updateList: V2NIMLocalConversation[]) => {
updateList.forEach(
changedItem => {
const index =
this.conversationList?.findIndex(conversation => conversation.conversationId === changedItem.conversationId)
if (index !== undefined && index > -1 && this.conversationList) {
this.conversationList[index] = changedItem
}
if (changedItem.type === V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM) {
setTimeout(() => {
this.addTeamConversation(changedItem)
}, 100)
} else {
//this.conversationList?.push(...[changedItem])
}
}
);
this.conversationList?.sort((a, b) => this.sortConversation(a, b))
})
//监听@的回调
getContext().eventHub.on(AitSessionChangeEvent, (session: AitSession) => {
ChatKitClient.logger?.debug(LocalConversationViewModel.logTag,
`AitSessionChangeEvent ConversationID = ${session.sessionId} been ait ${session.isAit}`)
if (session.isAit) {
this.aitConversationList.add(session.sessionId)
} else if (this.aitConversationList.has(session.sessionId)) {
this.aitConversationList.delete(session.sessionId)
}
})
//获取数据库中所有的@数据
AitServer.instance.getAllAitSession(ChatKitClient.getLoginUserId()).then((
aitSessions: string[]
) => {
aitSessions.forEach((session) => {
this.aitConversationList.add(session)
})
})
}
//按照会话ID更新会话
async updateConversationById(conversationId: string) {
const newConversation = await LocalConversationRepo.getConversation(conversationId)
ChatKitClient.logger?.debug(`${LocalConversationViewModel.logTag} updateConversationById ${newConversation?.conversationId} name = ${newConversation?.name}`)
if (newConversation) {
const index = this.conversationList?.findIndex(e => e.conversationId === newConversation.conversationId)
if (index !== undefined && this.conversationList) {
this.conversationList[index] = newConversation
}
}
}
//添加群会话
async addTeamConversation(conversation: V2NIMLocalConversation) {
let teamId: string = ChatKitClient.nim.conversationIdUtil.parseConversationTargetId(conversation.conversationId)
//添加之前判断是否合法team
let team = await TeamRepo.getTeamInfo(teamId, V2NIMTeamType.V2NIM_TEAM_TYPE_NORMAL)
if (team?.isValidTeam) {
let existConversation: V2NIMLocalConversation | undefined =
this.conversationList?.find((m) => m.conversationId === conversation.conversationId)
//如果已经存在,则不处理
if (existConversation) {
return
}
this.conversationList?.push(...[conversation])
this.conversationList?.sort((a, b) => this.sortConversation(a, b))
} else {
this.deleteConversation(conversation.conversationId)
}
}
/**
* 删除会话
* @param conversationId
*/
async deleteConversation(conversationId: string) {
await LocalConversationRepo.deleteConversation(conversationId)
//无论成功与否UI都删
this.conversationList = this.conversationList?.filter((m) => m.conversationId !== conversationId)
}
/**
* 请求回话列表
* @param offset
*/
async loadConversation(offset?: number) {
try {
if (!this.conversationList) {
this.conversationList = []
}
console.debug(`Performance Test start loadLocalConversation`)
if (offset === 0) {
this.conversationList?.splice(0, this.conversationList.length);
}
const result = await LocalConversationRepo.getConversationList(offset ?? this.offset, this.limit)
if (result != null) {
if (offset === 0) {
this.conversationList?.splice(0, this.conversationList.length);
}
this.offset = result.offset
this.isFinished = result.finished
// let newConversation = result.conversationList
// if (this.conversationList.length > 0 && newConversation.length > 0) {
// this.conversationList =
// this.conversationList.filter(conversation => !newConversation.find((m) => m.conversationId ===
// conversation.conversationId))
// }
// this.conversationList?.push(...newConversation)
//异步有问题
// if (this.conversationList.length > 0 ) {
// const resultconversationList =await this.conversationList.filter(async conversation =>
// await patientDbManager.getPatientByUuid(ChatKitClient.nim.conversationIdUtil.parseConversationTargetId(conversation.conversationId))!=null
// )
// this.conversationList =resultconversationList;
//
// }
const filteredConversations: V2NIMLocalConversation[] = [];
for (const conversation of result.conversationList) {
const uuid = ChatKitClient.nim.conversationIdUtil.parseConversationTargetId(conversation.conversationId);
// 假设 selectUserStyleWithModel 返回 "1" 表示 type=1
const style = await patientDbManager.getPatientTypeByUuid(uuid);
if (style == 1) {
filteredConversations.push(conversation);
}
}
this.conversationList = filteredConversations;
this.conversationList?.sort((a, b) => this.sortConversation(a, b))
this.isFinishedSyncLoad = true
console.debug(`Performance Test finish loadLocalConversation`)
}
} catch (e) {
}
}
}