110 lines
3.1 KiB
Plaintext
110 lines
3.1 KiB
Plaintext
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
|
||
}
|
||
}
|