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 { 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 } }