Files
qiming/qiming-mobile/subpackages/pages/chat-conversation-component/layers/ComponentManager.uts

110 lines
3.1 KiB
Plaintext
Raw Permalink 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 { nextTick } from 'vue'
import { MessageInfo } from '@/types/interfaces/conversationInfo'
import { MessageTypeEnum } from '@/types/enums/agent'
import { MessageStatusEnum } from '@/types/enums/common'
import AgentDetailData from './AgentDetailData.uts'
import AgentDetailUtils from './AgentDetailUtils.uts'
/**
* 组件管理层:负责组件的引用管理和更新
*/
export default class ComponentManager {
private data: AgentDetailData
constructor(private data: AgentDetailData) {
this.data = data
}
/**
* 设置消息组件引用
*/
setMessageRef(el: any, messageId: string): void {
if (el) {
this.data.messageRefs.value[messageId] = el
}
}
/**
* 移除消息组件引用
*/
removeMessageRef(messageId: string): void {
if (this.data.messageRefs.value[messageId]) {
delete this.data.messageRefs.value[messageId]
}
}
/**
* 更新消息组件
*/
async updateMessageComponent(messageId: string, newData: any): Promise<void> {
const messageRef = this.data.messageRefs.value[messageId]
if (messageRef) {
try {
if (typeof messageRef.updateMessage === 'function') {
await messageRef.updateMessage(newData)
} else {
// 备用方案:强制触发组件更新
await nextTick()
const message = this.data.messageList.value.find(msg => msg.id === messageId)
if (message) {
message.lastUpdateTime = Date.now()
this.data.messageList.value = [...this.data.messageList.value]
}
}
} catch (error) {
console.error(`更新消息组件 ${messageId} 失败:`, error)
// 错误恢复:使用备用方案
try {
await nextTick()
const message = this.data.messageList.value.find(msg => msg.id === messageId)
if (message) {
message.lastUpdateTime = Date.now()
this.data.messageList.value = [...this.data.messageList.value]
}
} catch (backupError) {
console.error('备用方案也失败了:', backupError)
}
}
}
}
/**
* 根据状态枚举确定状态
*/
determineState(status: MessageStatusEnum): number {
switch (status) {
case MessageStatusEnum.Loading:
return 1
case MessageStatusEnum.Incomplete:
return 2
case MessageStatusEnum.Complete:
return 3
case MessageStatusEnum.Error:
return 4
default:
return 3
}
}
/**
* 将MessageInfo转换为MsgItem格式
*/
convertMessageInfoToMsgItem(messageInfo: MessageInfo): any {
return {
_id: messageInfo.id?.toString() || '',
from_uid: messageInfo.messageType === MessageTypeEnum.ASSISTANT ? 'uni-ai' : 'user',
// thinkContent: messageInfo.text || messageInfo.think || '',
// body: messageInfo.text || messageInfo.think || '',
thinkContent: messageInfo.think || '',
body: messageInfo.text || '',
create_time: new Date(messageInfo.time || Date.now()).getTime(),
state: this.determineState(messageInfo.status),
chat_id: 'chat-' + this.data.conversationId.value,
// markdownElList: [],
// markdownElList: messageInfo.markdownElList || [],
rendered: false,
// 传递processingList用于自定义组件渲染历史消息的工具调用等
processingList: messageInfo.processingList || []
} as any
}
}