/** * ============================================================ * XinyaoChatEmbed —— 聊天窗 iframe 控制层(第三方网站接入) * ------------------------------------------------------------ * 职责:把独立聊天页(chat-page,部署在信遥域下)包进 iframe—— * - 控制宽高、移动(拖拽)、显示/隐藏、销毁; * - 通过 postMessage 注入 app_key/app_secret 等配置(不暴露在 URL); * - 接收页面回传的 ready/open/close/error 事件并透传给接入方。 * 零依赖(纯 DOM),可在任意框架 / 原生 HTML 中使用。 * ============================================================ */ /** 与 chat-page 约定的 postMessage 协议(两端需保持一致) */ export declare const CHAT_IFRAME_PROTOCOL: { /** 父 → 页面:注入运行配置 */ readonly CONFIG: "xinyao-chat:config"; /** 页面 → 父:页面挂载后主动请求配置(load 时 postConfig 可能丢失,收到后补发) */ readonly CONFIG_REQUEST: "xinyao-chat:config-request"; /** 页面 → 父:页面已就绪(若接入方未配置密钥,页面会等待 CONFIG) */ readonly READY: "xinyao-chat:ready"; /** 页面 → 父:会话开启成功(payload: { sid }) */ readonly OPEN: "xinyao-chat:open"; /** 页面 → 父:会话关闭 */ readonly CLOSE: "xinyao-chat:close"; /** 页面 → 父:错误(payload: { message }) */ readonly ERROR: "xinyao-chat:error"; /** 页面 → 父:页面请求隐藏整个聊天窗(收起;SDK 收到后隐藏并显示恢复按钮) */ readonly HIDE: "xinyao-chat:hide"; /** 页面 → 父:页面请求重新显示聊天窗 */ readonly SHOW: "xinyao-chat:show"; /** 父 → 页面:父窗口已重新显示聊天窗(点恢复按钮后),页面据此自动开启新会话 */ readonly SHOWN: "xinyao-chat:shown"; /** 页面 → 父:渠道样式就绪(含 consult_logo,外部球渲染图片用) */ readonly STYLE: "xinyao-chat:style"; }; /** 页面运行配置(经 postMessage 注入,密钥不进入 URL) */ export interface ChatPageConfig { appKey?: string; appSecret?: string; appId?: string; channelNo?: string; channelName?: string; channelSource?: string; baseURL?: string; wsURL?: string; title?: string; } /** 创建选项 */ export interface ChatEmbedOptions extends ChatPageConfig { /** chat-page 地址(必填,不含密钥参数) */ pageUrl: string; /** 挂载容器(元素或选择器)。不传则 fixed 悬浮于视口右下角 */ container?: HTMLElement | string; /** 宽(px,默认 360) */ width?: number; /** 高(px,默认 600) */ height?: number; /** fixed 模式初始位置(默认 { right: 20, bottom: 20 }) */ position?: { left?: number; top?: number; right?: number; bottom?: number; }; /** 是否可拖拽(默认 true,按住顶部拖拽条移动) */ draggable?: boolean; /** 是否显示拖拽条(默认 true) */ dragHandle?: boolean; /** 拖拽条文案(默认 grip 图标 '⠿') */ dragHandleText?: string; /** 悬浮窗圆角(px,默认 8) */ radius?: number; /** 页面就绪 */ onReady?: () => void; /** 会话开启成功(payload: { sid }) */ onOpen?: (data: unknown) => void; /** 会话关闭 */ onClose?: () => void; /** 页面错误 */ onError?: (err: unknown) => void; } export declare class XinyaoChatEmbed { private opts; private el; private iframe; private handle; private messageHandler; private destroyed; /** 隐藏后显示的"重新打开"悬浮按钮 */ private restoreBtn; /** 渠道咨询按钮 logo(chat-page 经 OPEN 透传,恢复按钮图片样式用) */ private consultLogo; constructor(options: ChatEmbedOptions); /** 把运行配置注入页面(剥离 UI/回调相关选项,只传 ChatPageConfig 字段) */ private postConfig; /** 拖拽(指针事件,兼容鼠标/触摸) */ private onHandlePointerDown; private applyPosition; /** 显示(并移除恢复按钮);同时通知 iframe 页面已重新显示——点恢复按钮后页面自动开启新会话(无需再点小球) */ show(): void; /** 隐藏(不销毁会话);隐藏后显示"重新打开"悬浮按钮 */ hide(): void; private ensureRestoreButton; private removeRestoreButton; /** 外部球已存在且拿到渠道 logo 时,把球更新为 logo 图片样式(与 iframe 内咨询球一致) */ private updateRestoreButton; /** 切换显隐 */ toggle(): void; /** 设置宽高(px) */ setSize(width: number, height: number): void; /** 移动到指定坐标(px,相对视口/容器) */ moveTo(left: number, top: number): void; /** 销毁:断开事件、卸载 iframe、移除节点 */ destroy(): void; } /** 工厂函数:创建聊天窗 iframe 控件 */ export declare function createChatWidget(options: ChatEmbedOptions): XinyaoChatEmbed; /** 注册 自定义元素(幂等) */ export declare function registerXinyaoChatEmbed(name?: string): void;