import { defineCustomElement } from 'vue' import AiChatWidget from '../components/ai-chat/index.vue' import { setSDKConfig, type SDKConfig } from '../components/ai-chat/api' // 全局状态 let isInitialized = false let customElement: CustomElementConstructor | null = null // 默认配置 const defaultConfig: Partial = { themeColor: ['#667eea', '#764ba2'], position: { top: 'auto', right: '20px', bottom: '20px', left: 'auto' }, draggable: true, pollingInterval: 500 } /** * 初始化AI聊天SDK(框架无关版本) * @param config SDK配置 */ export const init = (config: SDKConfig) => { // 防止重复初始化 if (isInitialized) { console.warn('AI Chat SDK 已经初始化过了') return } // 验证必需参数 if (!config.botCode || !config.userName) { throw new Error('botCode 和 userName 是必需参数') } // 合并配置 const finalConfig = { ...defaultConfig, ...config } // 设置全局配置 setSDKConfig(finalConfig) // 检查是否支持Web Components if (!window.customElements) { throw new Error('当前浏览器不支持Web Components,请使用现代浏览器') } // 定义Web Component const tagName = 'ai-chat-widget' if (!customElement) { customElement = defineCustomElement(AiChatWidget, { shadowRoot: false, styles: [] }) customElements.define(tagName, customElement) } // 创建并添加到页面 const widget = document.createElement(tagName) widget.setAttribute('theme-color', JSON.stringify(finalConfig.themeColor)) widget.setAttribute('position', JSON.stringify(finalConfig.position)) widget.setAttribute('draggable', String(finalConfig.draggable)) widget.setAttribute('polling-interval', String(finalConfig.pollingInterval)) console.log(document, 'widget', widget) // 添加到body document.body.appendChild(widget) // 标记为已初始化 isInitialized = true console.log('AI Chat SDK 初始化成功(Web Components版本)', finalConfig) } /** * 销毁SDK实例 */ export const destroy = () => { if (!isInitialized) { console.warn('AI Chat SDK 未初始化或已经销毁') return } // 移除所有ai-chat-widget元素 const widgets = document.querySelectorAll('ai-chat-widget') widgets.forEach(widget => widget.remove()) // 重置状态 isInitialized = false console.log('AI Chat SDK 已销毁') } /** * 检查SDK是否已初始化 */ export const isSDKInitialized = () => isInitialized /** * 重新配置SDK(需要先销毁再初始化) */ export const reconfigure = (config: SDKConfig) => { destroy() init(config) } // 导出类型 export type { SDKConfig } from '@/components/ai-chat/api' // 默认导出 export default { init, destroy, isSDKInitialized, reconfigure }