@ai-group/chat-sdk 3.3.4 → 3.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +2 -0
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +150 -112
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +2 -2
- package/dist/cjs/components/XAdkProvider/compound/Sender.js +4 -2
- package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +2 -2
- package/dist/cjs/components/XAdkSender/index.d.ts +2 -2
- package/dist/cjs/components/XAdkSender/index.js +34 -9
- package/dist/cjs/components/XAdkSender/index.js.map +2 -2
- package/dist/cjs/hooks/useADKChat.js +26 -20
- package/dist/cjs/hooks/useADKChat.js.map +2 -2
- package/dist/cjs/types/XAdkProvider.d.ts +6 -0
- package/dist/cjs/types/XAdkProvider.js.map +1 -1
- package/dist/cjs/types/XAdkSender.d.ts +5 -0
- package/dist/cjs/types/XAdkSender.js.map +1 -1
- package/dist/cjs/utils/umdEntry.js +3 -0
- package/dist/cjs/utils/umdEntry.js.map +2 -2
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +2 -0
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +48 -5
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +2 -2
- package/dist/esm/components/XAdkProvider/compound/Sender.js +4 -3
- package/dist/esm/components/XAdkProvider/compound/Sender.js.map +1 -1
- package/dist/esm/components/XAdkSender/index.d.ts +2 -2
- package/dist/esm/components/XAdkSender/index.js +44 -10
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/hooks/useADKChat.js +12 -5
- package/dist/esm/hooks/useADKChat.js.map +1 -1
- package/dist/esm/types/XAdkProvider.d.ts +6 -0
- package/dist/esm/types/XAdkProvider.js.map +1 -1
- package/dist/esm/types/XAdkSender.d.ts +5 -0
- package/dist/esm/types/XAdkSender.js.map +1 -1
- package/dist/esm/utils/umdEntry.js +4 -1
- package/dist/esm/utils/umdEntry.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
- package/dist/esm/assets/svg/AddChatIcon.d.ts.map +0 -1
- package/dist/esm/client/base.d.ts.map +0 -1
- package/dist/esm/client/restClient.d.ts.map +0 -1
- package/dist/esm/client/wsClient.d.ts.map +0 -1
- package/dist/esm/components/DislikeFeedback.d.ts.map +0 -1
- package/dist/esm/components/FeedbackTags.d.ts.map +0 -1
- package/dist/esm/components/FileGallery/index.d.ts.map +0 -1
- package/dist/esm/components/FileGallery/styles.d.ts.map +0 -1
- package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.d.ts.map +0 -1
- package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/styles.d.ts.map +0 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts.map +0 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.d.ts.map +0 -1
- package/dist/esm/components/XAdkChatbot/components/ThinkRender/index.d.ts.map +0 -1
- package/dist/esm/components/XAdkChatbot/index.d.ts.map +0 -1
- package/dist/esm/components/XAdkChatbot/styles.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/Chatbot.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/DislikeFeedBack.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/FeedbackTags.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/Header.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/Messages.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/Sender.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/Sidebar.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/Welcome.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/index.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/compound/styles.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/context/ChatActionContext.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/context/ChatStateContext.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/context/SessionContext.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/context/index.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/index.d.ts.map +0 -1
- package/dist/esm/components/XAdkProvider/styles.d.ts.map +0 -1
- package/dist/esm/components/XAdkSender/index.d.ts.map +0 -1
- package/dist/esm/components/XAdkSender/styles.d.ts.map +0 -1
- package/dist/esm/components/XAdkThoughtChain/index.d.ts.map +0 -1
- package/dist/esm/components/XAdkThoughtChain/styles.d.ts.map +0 -1
- package/dist/esm/components/XAiChatbot/index.d.ts.map +0 -1
- package/dist/esm/components/XAiChatbot/styles.d.ts.map +0 -1
- package/dist/esm/components/XAiConversations/index.d.ts.map +0 -1
- package/dist/esm/components/XAiConversations/styles.d.ts.map +0 -1
- package/dist/esm/components/XAiJsonView/index.d.ts.map +0 -1
- package/dist/esm/components/XAiJsonView/styles.d.ts.map +0 -1
- package/dist/esm/components/XAiProvider/demo.styles.d.ts.map +0 -1
- package/dist/esm/components/XAiProvider/index.d.ts.map +0 -1
- package/dist/esm/components/XAiSDK.d.ts.map +0 -1
- package/dist/esm/components/XAiSender/index.d.ts.map +0 -1
- package/dist/esm/components/XAiSender/styles.d.ts.map +0 -1
- package/dist/esm/constants/index.d.ts.map +0 -1
- package/dist/esm/context/AiProviderContext.d.ts.map +0 -1
- package/dist/esm/context/ThemeContext.d.ts.map +0 -1
- package/dist/esm/hooks/useAgentGenerator.d.ts.map +0 -1
- package/dist/esm/hooks/useEventStreamRequest.d.ts.map +0 -1
- package/dist/esm/hooks/useProviderContext.d.ts.map +0 -1
- package/dist/esm/hooks/useXAiSDK.d.ts.map +0 -1
- package/dist/esm/index.d.ts.map +0 -1
- package/dist/esm/presets/xGroupAdk.d.ts.map +0 -1
- package/dist/esm/services/api.d.ts.map +0 -1
- package/dist/esm/styles/common.d.ts.map +0 -1
- package/dist/esm/styles/markdown.d.ts.map +0 -1
- package/dist/esm/types/ChatHook.d.ts.map +0 -1
- package/dist/esm/types/ChatStrategies.d.ts.map +0 -1
- package/dist/esm/types/FileGallery.d.ts.map +0 -1
- package/dist/esm/types/FunctionCallRender.d.ts.map +0 -1
- package/dist/esm/types/XAdkChatbot.d.ts.map +0 -1
- package/dist/esm/types/XAdkProvider.d.ts.map +0 -1
- package/dist/esm/types/XAdkSender.d.ts.map +0 -1
- package/dist/esm/types/XAdkThoughtChain.d.ts.map +0 -1
- package/dist/esm/types/XAiChatbot.d.ts.map +0 -1
- package/dist/esm/types/XAiConversations.d.ts.map +0 -1
- package/dist/esm/types/XAiMessage.d.ts.map +0 -1
- package/dist/esm/types/XAiProvider.d.ts.map +0 -1
- package/dist/esm/types/XAiSender.d.ts.map +0 -1
- package/dist/esm/types/common.d.ts.map +0 -1
- package/dist/esm/types/index.d.ts.map +0 -1
- package/dist/esm/types/node.d.ts.map +0 -1
- package/dist/esm/utils/chat.d.ts.map +0 -1
- package/dist/esm/utils/file.d.ts.map +0 -1
- package/dist/esm/utils/index.d.ts.map +0 -1
- package/dist/esm/utils/parseAgentMessage.d.ts.map +0 -1
- package/dist/esm/utils/providerManager.d.ts.map +0 -1
- package/dist/esm/utils/request.d.ts.map +0 -1
- package/dist/esm/utils/request.example.d.ts.map +0 -1
- package/dist/esm/utils/umdEntry.d.ts.map +0 -1
- package/dist/esm/utils/workflowNode.d.ts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/utils/umdEntry.tsx"],
|
|
4
|
-
"sourcesContent": ["import { createRef } from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { XAdkSDKProps, XAdkProviderHandle, IMessage } from \"@/types\";\nimport XAdkProvider from \"@/components/XAdkProvider\";\nimport { SendContent } from \"@/types\";\n\n/**\n * XAiWebSDK - UMD 入口类\n *\n * 用于通过 <script> 标签引入 SDK 的场景\n *\n * @example\n * ```html\n * <script src=\"chat-sdk.min.js\"></script>\n * <script>\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true\n * }\n * }\n * });\n * </script>\n * ```\n */\nclass XAiWebSDK {\n container: HTMLElement;\n\n props: XAdkSDKProps;\n\n root: any;\n\n providerRef = createRef<XAdkProviderHandle>();\n\n // ———— hook ————\n onError?: (error: any) => void;\n\n onSuccess?: (appInfo: any) => void;\n\n onMessage?: (content: string, data: IMessage) => void;\n\n constructor(container: HTMLElement, props: XAdkSDKProps) {\n this.container = container;\n this.props = props;\n this.onError = props.onError;\n this.onSuccess = props.onSuccess;\n this.onMessage = props.onMessage;\n this.mount();\n }\n\n mount() {\n // 提取配置\n const { config = {} } = this.props;\n const showSessionList = config.session?.showSessionList ?? false;\n const allowUpload = config.allowUpload ?? false;\n const clearBtnShow = config.chatProps?.clearBtnShow ?? true;\n\n if (ReactDOM.createRoot) {\n this.root = ReactDOM.createRoot(this.container);\n this.root.render(\n <div style={{ width: \"100%\", height: \"100%\" }}>\n <XAdkProvider ref={this.providerRef} {...this.props}>\n {/* 使用 DefaultLayout 作为默认布局 */}\n <XAdkProvider.DefaultLayout\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n clearBtnShow={clearBtnShow}\n showFnCallDetail={true}\n />\n </XAdkProvider>\n </div>,\n );\n } else {\n // 兼容 React 17\n // @ts-ignore\n ReactDOM.render(\n <div style={{ width: \"100%\", height: \"100%\" }}>\n <XAdkProvider ref={this.providerRef} {...this.props}>\n <XAdkProvider.DefaultLayout\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n clearBtnShow={clearBtnShow}\n showFnCallDetail={true}\n />\n </XAdkProvider>\n </div>,\n this.container,\n );\n }\n }\n\n unmount() {\n if (this.root && this.root.unmount) {\n this.root.unmount();\n }\n }\n\n /**\n * 初始化聊天机器人(推荐方式)\n *\n * @param props - SDK 配置参数\n * @returns XAiWebSDK 实例\n *\n * @example\n * ```javascript\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true // 显示会话列表\n * },\n * allowUpload: true, // 允许文件上传\n * chatProps: {\n * clearBtnShow: false // 隐藏清空按钮\n * }\n * },\n * componentProps: {\n * id: 'my-chatbot', // 容器 ID\n * width: '100%',\n * height: '600px'\n * }\n * });\n * ```\n */\n static initChatbot(props: XAdkSDKProps): XAiWebSDK {\n let container: HTMLElement;\n\n // 检查是否有指定的 componentProps.id\n if (props.componentProps?.id) {\n const existingContainer = document.getElementById(\n props.componentProps.id,\n );\n if (existingContainer) {\n container = existingContainer;\n } else {\n // 如果指定的 ID 不存在,创建新元素\n container = document.createElement(\"div\");\n container.id = props.componentProps.id;\n }\n } else {\n // 没有指定 ID,创建默认容器\n container = document.createElement(\"div\");\n container.id = \"xai-chatbot-container\";\n }\n\n // 设置容器样式 - 将除了 id 以外的所有属性都应用到容器\n if (props.componentProps) {\n const { id, ...styleProps } = props.componentProps;\n Object.assign(container.style, styleProps);\n }\n\n // 如果容器不在 DOM 中,添加到 body\n if (!container.parentNode) {\n document.body.appendChild(container);\n }\n\n return new XAiWebSDK(container, props);\n }\n\n /**\n * 兼容旧版本的静态方法\n * @deprecated 使用 initChatbot 替代\n */\n static create(props: XAdkSDKProps): XAiWebSDK {\n return this.initChatbot(props);\n }\n\n // ————对外暴露的方法————\n\n /**\n * 获取当前数据(聚合方法)\n * @returns 应用信息、消息列表、会话列表\n */\n getData() {\n return {\n appInfo: this.providerRef.current?.getAppInfo(),\n messages: this.providerRef.current?.getMessages(),\n sessions: this.providerRef.current?.getSessions(),\n };\n }\n\n /**\n * 获取应用信息\n * @returns 应用信息\n */\n getAppInfo() {\n return this.providerRef.current?.getAppInfo();\n }\n\n /**\n * 获取当前会话的消息列表\n * @returns 消息列表\n */\n getMessages() {\n return this.providerRef.current?.getMessages();\n }\n\n /**\n * 获取会话列表\n * @returns 会话列表\n */\n getSessions() {\n return this.providerRef.current?.getSessions();\n }\n\n /**\n * 设置消息列表\n * @param msgs - 要设置的消息数组\n */\n setMessages(msgs: IMessage[]) {\n this.providerRef.current?.setMessages(msgs);\n }\n\n /**\n * 发送消息\n * @param content - 消息内容\n *\n * @example\n * ```javascript\n * sdk.startChat({ text: 'Hello!' });\n * ```\n */\n startChat(content: SendContent) {\n this.providerRef.current?.startChat(content);\n }\n\n /**\n * 停止当前消息生成\n */\n stopChat() {\n this.providerRef.current?.stopChat();\n }\n\n /**\n * 重新生成最后一条回复\n */\n reChat() {\n this.providerRef.current?.reChat();\n }\n\n /**\n * 清空当前会话\n */\n clearChat() {\n this.providerRef.current?.clearChat();\n }\n\n /**\n * 切换到指定会话\n * @param sessionId - 会话 ID\n */\n setCurrentSession(sessionId: string) {\n this.providerRef.current?.setCurrentSession(sessionId);\n }\n\n /**\n * 删除指定会话\n * @param sessionId - 会话 ID\n */\n deleteSession(sessionId: string) {\n this.providerRef.current?.deleteSession(sessionId);\n }\n\n /**\n * 更新会话标题\n * @param sessionId - 会话 ID\n * @param title - 新标题\n */\n updateSession(sessionId: string, title: string) {\n this.providerRef.current?.updateSession(sessionId, title);\n }\n\n /**\n * 设置自定义业务参数 (stateDelta)\n * 设置后每次发送消息时会自动携带至后端\n * @param delta - 自定义参数,传入 undefined 可清除\n */\n setStateDelta(delta: Record<string, any> | undefined) {\n this.providerRef.current?.setStateDelta(delta);\n }\n}\n\n// 兼容 window 方式,也支持 new\n// @ts-ignore\nwindow.XAiWebSDK = XAiWebSDK;\n\n// 支持 ESModule/UMD 直接 import\nexport default XAiWebSDK;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0B;AAC1B,oBAAqB;AAErB,0BAAyB;
|
|
4
|
+
"sourcesContent": ["import { createRef } from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { XAdkSDKProps, XAdkProviderHandle, IMessage } from \"@/types\";\nimport XAdkProvider from \"@/components/XAdkProvider\";\nimport { SendContent } from \"@/types\";\n\n/**\n * XAiWebSDK - UMD 入口类\n *\n * 用于通过 <script> 标签引入 SDK 的场景\n *\n * @example\n * ```html\n * <script src=\"chat-sdk.min.js\"></script>\n * <script>\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true\n * }\n * }\n * });\n * </script>\n * ```\n */\nclass XAiWebSDK {\n container: HTMLElement;\n\n props: XAdkSDKProps;\n\n root: any;\n\n providerRef = createRef<XAdkProviderHandle>();\n\n // ———— hook ————\n onError?: (error: any) => void;\n\n onSuccess?: (appInfo: any) => void;\n\n onMessage?: (content: string, data: IMessage) => void;\n\n constructor(container: HTMLElement, props: XAdkSDKProps) {\n this.container = container;\n this.props = props;\n this.onError = props.onError;\n this.onSuccess = props.onSuccess;\n this.onMessage = props.onMessage;\n this.mount();\n }\n\n mount() {\n // 提取配置\n const { config = {} } = this.props;\n const showSessionList = config.session?.showSessionList ?? false;\n const allowUpload = config.allowUpload ?? false;\n const draggable = config.draggable ?? true;\n const clearBtnShow = config.chatProps?.clearBtnShow ?? true;\n\n if (ReactDOM.createRoot) {\n this.root = ReactDOM.createRoot(this.container);\n this.root.render(\n <div style={{ width: \"100%\", height: \"100%\" }}>\n <XAdkProvider ref={this.providerRef} {...this.props}>\n {/* 使用 DefaultLayout 作为默认布局 */}\n <XAdkProvider.DefaultLayout\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n draggable={draggable}\n clearBtnShow={clearBtnShow}\n showFnCallDetail={true}\n />\n </XAdkProvider>\n </div>,\n );\n } else {\n // 兼容 React 17\n // @ts-ignore\n ReactDOM.render(\n <div style={{ width: \"100%\", height: \"100%\" }}>\n <XAdkProvider ref={this.providerRef} {...this.props}>\n <XAdkProvider.DefaultLayout\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n draggable={draggable}\n clearBtnShow={clearBtnShow}\n showFnCallDetail={true}\n />\n </XAdkProvider>\n </div>,\n this.container,\n );\n }\n }\n\n unmount() {\n if (this.root && this.root.unmount) {\n this.root.unmount();\n }\n }\n\n /**\n * 初始化聊天机器人(推荐方式)\n *\n * @param props - SDK 配置参数\n * @returns XAiWebSDK 实例\n *\n * @example\n * ```javascript\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true // 显示会话列表\n * },\n * allowUpload: true, // 允许文件上传\n * chatProps: {\n * clearBtnShow: false // 隐藏清空按钮\n * }\n * },\n * componentProps: {\n * id: 'my-chatbot', // 容器 ID\n * width: '100%',\n * height: '600px'\n * }\n * });\n * ```\n */\n static initChatbot(props: XAdkSDKProps): XAiWebSDK {\n let container: HTMLElement;\n\n // 检查是否有指定的 componentProps.id\n if (props.componentProps?.id) {\n const existingContainer = document.getElementById(\n props.componentProps.id,\n );\n if (existingContainer) {\n container = existingContainer;\n } else {\n // 如果指定的 ID 不存在,创建新元素\n container = document.createElement(\"div\");\n container.id = props.componentProps.id;\n }\n } else {\n // 没有指定 ID,创建默认容器\n container = document.createElement(\"div\");\n container.id = \"xai-chatbot-container\";\n }\n\n // 设置容器样式 - 将除了 id 以外的所有属性都应用到容器\n if (props.componentProps) {\n const { id, ...styleProps } = props.componentProps;\n Object.assign(container.style, styleProps);\n }\n\n // 如果容器不在 DOM 中,添加到 body\n if (!container.parentNode) {\n document.body.appendChild(container);\n }\n\n return new XAiWebSDK(container, props);\n }\n\n /**\n * 兼容旧版本的静态方法\n * @deprecated 使用 initChatbot 替代\n */\n static create(props: XAdkSDKProps): XAiWebSDK {\n return this.initChatbot(props);\n }\n\n // ————对外暴露的方法————\n\n /**\n * 获取当前数据(聚合方法)\n * @returns 应用信息、消息列表、会话列表\n */\n getData() {\n return {\n appInfo: this.providerRef.current?.getAppInfo(),\n messages: this.providerRef.current?.getMessages(),\n sessions: this.providerRef.current?.getSessions(),\n };\n }\n\n /**\n * 获取应用信息\n * @returns 应用信息\n */\n getAppInfo() {\n return this.providerRef.current?.getAppInfo();\n }\n\n /**\n * 获取当前会话的消息列表\n * @returns 消息列表\n */\n getMessages() {\n return this.providerRef.current?.getMessages();\n }\n\n /**\n * 获取会话列表\n * @returns 会话列表\n */\n getSessions() {\n return this.providerRef.current?.getSessions();\n }\n\n /**\n * 设置消息列表\n * @param msgs - 要设置的消息数组\n */\n setMessages(msgs: IMessage[]) {\n this.providerRef.current?.setMessages(msgs);\n }\n\n /**\n * 发送消息\n * @param content - 消息内容\n *\n * @example\n * ```javascript\n * sdk.startChat({ text: 'Hello!' });\n * ```\n */\n startChat(content: SendContent) {\n this.providerRef.current?.startChat(content);\n }\n\n /**\n * 停止当前消息生成\n */\n stopChat() {\n this.providerRef.current?.stopChat();\n }\n\n /**\n * 重新生成最后一条回复\n */\n reChat() {\n this.providerRef.current?.reChat();\n }\n\n /**\n * 清空当前会话\n */\n clearChat() {\n this.providerRef.current?.clearChat();\n }\n\n /**\n * 切换到指定会话\n * @param sessionId - 会话 ID\n */\n setCurrentSession(sessionId: string) {\n this.providerRef.current?.setCurrentSession(sessionId);\n }\n\n /**\n * 删除指定会话\n * @param sessionId - 会话 ID\n */\n deleteSession(sessionId: string) {\n this.providerRef.current?.deleteSession(sessionId);\n }\n\n /**\n * 更新会话标题\n * @param sessionId - 会话 ID\n * @param title - 新标题\n */\n updateSession(sessionId: string, title: string) {\n this.providerRef.current?.updateSession(sessionId, title);\n }\n\n /**\n * 设置自定义业务参数 (stateDelta)\n * 设置后每次发送消息时会自动携带至后端\n * @param delta - 自定义参数,传入 undefined 可清除\n */\n setStateDelta(delta: Record<string, any> | undefined) {\n this.providerRef.current?.setStateDelta(delta);\n }\n}\n\n// 兼容 window 方式,也支持 new\n// @ts-ignore\nwindow.XAiWebSDK = XAiWebSDK;\n\n// 支持 ESModule/UMD 直接 import\nexport default XAiWebSDK;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["ReactDOM", "XAdkProvider"]
|
|
7
7
|
}
|
|
@@ -16,6 +16,8 @@ export interface DefaultLayoutProps {
|
|
|
16
16
|
footer?: React.ReactNode;
|
|
17
17
|
/** 是否允许上传文件 */
|
|
18
18
|
allowUpload?: boolean;
|
|
19
|
+
/** 是否启用拖拽上传,拖拽区域为整个聊天区域(不含侧边栏),需 allowUpload 为 true */
|
|
20
|
+
draggable?: boolean;
|
|
19
21
|
/** 是否显示清空按钮 */
|
|
20
22
|
clearBtnShow?: boolean;
|
|
21
23
|
/** 是否显示函数调用详情 */
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import React, { useRef, useCallback, useState } from "react";
|
|
3
|
+
import { Attachments } from "@ant-design/x";
|
|
2
4
|
import { useChatState } from "../context/ChatStateContext";
|
|
3
5
|
import Sidebar from "./Sidebar";
|
|
4
6
|
import Messages from "./Messages";
|
|
@@ -21,6 +23,8 @@ var DefaultLayout = function DefaultLayout(_ref) {
|
|
|
21
23
|
footer = _ref.footer,
|
|
22
24
|
_ref$allowUpload = _ref.allowUpload,
|
|
23
25
|
allowUpload = _ref$allowUpload === void 0 ? false : _ref$allowUpload,
|
|
26
|
+
_ref$draggable = _ref.draggable,
|
|
27
|
+
draggable = _ref$draggable === void 0 ? true : _ref$draggable,
|
|
24
28
|
_ref$clearBtnShow = _ref.clearBtnShow,
|
|
25
29
|
clearBtnShow = _ref$clearBtnShow === void 0 ? true : _ref$clearBtnShow,
|
|
26
30
|
showFnCallDetail = _ref.showFnCallDetail,
|
|
@@ -31,6 +35,28 @@ var DefaultLayout = function DefaultLayout(_ref) {
|
|
|
31
35
|
messages = _useChatState.messages,
|
|
32
36
|
prologue = _useChatState.prologue,
|
|
33
37
|
suggestions = _useChatState.suggestions;
|
|
38
|
+
var chatAreaRef = useRef(null);
|
|
39
|
+
var senderRef = useRef(null);
|
|
40
|
+
var _useState = useState([]),
|
|
41
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
42
|
+
dropFileList = _useState2[0],
|
|
43
|
+
setDropFileList = _useState2[1];
|
|
44
|
+
|
|
45
|
+
// 拖拽上传是否启用
|
|
46
|
+
var enableDragUpload = allowUpload && draggable;
|
|
47
|
+
|
|
48
|
+
// Attachments 拖拽文件后的回调
|
|
49
|
+
var handleDropFiles = useCallback(function (info) {
|
|
50
|
+
var rawFiles = info.fileList.map(function (f) {
|
|
51
|
+
return f.originFileObj;
|
|
52
|
+
}).filter(Boolean);
|
|
53
|
+
if (rawFiles.length > 0) {
|
|
54
|
+
var _senderRef$current;
|
|
55
|
+
(_senderRef$current = senderRef.current) === null || _senderRef$current === void 0 || _senderRef$current.addFiles(rawFiles);
|
|
56
|
+
}
|
|
57
|
+
// 清空 Attachments 文件列表,避免累积
|
|
58
|
+
setDropFileList([]);
|
|
59
|
+
}, []);
|
|
34
60
|
|
|
35
61
|
// 判断是否为空状态(展示Welcome)
|
|
36
62
|
var isEmpty = messages.length === 0 && !prologue && (!suggestions || suggestions.length === 0);
|
|
@@ -44,16 +70,18 @@ var DefaultLayout = function DefaultLayout(_ref) {
|
|
|
44
70
|
},
|
|
45
71
|
children: [showSessionList && /*#__PURE__*/_jsx(Sidebar, {
|
|
46
72
|
isNarrow: false
|
|
47
|
-
}), /*#__PURE__*/
|
|
73
|
+
}), /*#__PURE__*/_jsxs("div", {
|
|
74
|
+
ref: chatAreaRef,
|
|
48
75
|
style: {
|
|
49
76
|
flex: 1,
|
|
50
77
|
display: "flex",
|
|
51
78
|
justifyContent: "center",
|
|
52
79
|
alignItems: "center",
|
|
53
80
|
flexDirection: "column",
|
|
54
|
-
overflow: "hidden"
|
|
81
|
+
overflow: "hidden",
|
|
82
|
+
position: "relative"
|
|
55
83
|
},
|
|
56
|
-
children: /*#__PURE__*/_jsxs("div", {
|
|
84
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
|
57
85
|
style: {
|
|
58
86
|
width: "100%",
|
|
59
87
|
maxWidth: "800px",
|
|
@@ -125,7 +153,9 @@ var DefaultLayout = function DefaultLayout(_ref) {
|
|
|
125
153
|
transition: "all 0.4s cubic-bezier(0.4, 0, 0.2, 1)"
|
|
126
154
|
},
|
|
127
155
|
children: footer || /*#__PURE__*/_jsx(Sender, {
|
|
156
|
+
ref: senderRef,
|
|
128
157
|
allowUpload: allowUpload,
|
|
158
|
+
draggable: !enableDragUpload,
|
|
129
159
|
clearBtnShow: clearBtnShow
|
|
130
160
|
})
|
|
131
161
|
}), /*#__PURE__*/_jsx("div", {
|
|
@@ -135,7 +165,20 @@ var DefaultLayout = function DefaultLayout(_ref) {
|
|
|
135
165
|
}
|
|
136
166
|
})]
|
|
137
167
|
})]
|
|
138
|
-
})
|
|
168
|
+
}), enableDragUpload && /*#__PURE__*/_jsx(Attachments, {
|
|
169
|
+
style: {
|
|
170
|
+
display: "none"
|
|
171
|
+
},
|
|
172
|
+
items: dropFileList,
|
|
173
|
+
getDropContainer: function getDropContainer() {
|
|
174
|
+
return chatAreaRef.current;
|
|
175
|
+
},
|
|
176
|
+
multiple: true,
|
|
177
|
+
beforeUpload: function beforeUpload() {
|
|
178
|
+
return false;
|
|
179
|
+
},
|
|
180
|
+
onChange: handleDropFiles
|
|
181
|
+
})]
|
|
139
182
|
})]
|
|
140
183
|
});
|
|
141
184
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useChatState","Sidebar","Messages","Welcome","Sender","jsx","_jsx","jsxs","_jsxs","DefaultLayout","_ref","_ref$showSessionList","showSessionList","header","footer","_ref$allowUpload","allowUpload","_ref$clearBtnShow","clearBtnShow","showFnCallDetail","renderFunctionCall","strategies","_useChatState","appInfo","messages","prologue","suggestions","isEmpty","length","style","display","height","width","position","overflow","children","isNarrow","flex","justifyContent","alignItems","flexDirection","maxWidth","padding","background","gap","appName","fontSize","fontWeight","color","transition","marginBottom","alignSelf","displayName"],"sources":["../../../../../src/components/XAdkProvider/compound/DefaultLayout.tsx"],"sourcesContent":["import React from \"react\";\nimport { useChatState } from \"../context/ChatStateContext\";\nimport Sidebar from \"./Sidebar\";\nimport Messages from \"./Messages\";\nimport Welcome from \"./Welcome\";\nimport Sender from \"./Sender\";\nimport type { ChatStrategies } from \"@/types\";\n\n/**\n * XAdkProvider 默认布局\n *\n * 提供类似 ChatGPT/DeepSeek 的默认布局:\n * - 左侧: 会话列表侧边栏 (可选,支持展开/收起)\n * - 右侧: 聊天区域 (标题 + 消息 + 输入框,居中显示,最大宽度800px)\n */\nexport interface DefaultLayoutProps {\n /** 是否显示会话列表 */\n showSessionList?: boolean;\n /** 自定义头部 */\n header?: React.ReactNode;\n /** 自定义底部 (替代默认 Sender) */\n footer?: React.ReactNode;\n /** 是否允许上传文件 */\n allowUpload?: boolean;\n /** 是否显示清空按钮 */\n clearBtnShow?: boolean;\n /** 是否显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 自定义消息 Footer */\n messagesFooter?: (msg: any) => React.ReactNode;\n /** 自定义工具调用渲染函数,返回 null 则降级使用默认渲染 */\n renderFunctionCall?: (msg: import(\"@/types\").IMessage) => React.ReactNode | null;\n /** 局部策略覆盖,优先级高于 Provider preset/strategies */\n strategies?: ChatStrategies;\n}\n\nconst DefaultLayout: React.FC<DefaultLayoutProps> = ({\n showSessionList = false,\n header,\n footer,\n allowUpload = false,\n clearBtnShow = true,\n showFnCallDetail,\n renderFunctionCall,\n strategies,\n}) => {\n const { appInfo, messages, prologue, suggestions } = useChatState();\n\n // 判断是否为空状态(展示Welcome)\n const isEmpty =\n messages.length === 0 &&\n !prologue &&\n (!suggestions || suggestions.length === 0);\n\n return (\n <div\n style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n {/* 左侧会话列表 - XAiConversations 组件会处理展开/收起 */}\n {showSessionList && <Sidebar isNarrow={false} />}\n\n {/* 右侧聊天区域 - 使用 flex: 1 自动占据剩余空间 */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n {/* 居中容器 - 最大宽度 800px */}\n <div\n style={{\n width: \"100%\",\n maxWidth: \"800px\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 头部 */}\n {header ||\n (appInfo && (\n <div\n style={{\n padding: \"16px 24px\",\n display: \"flex\",\n justifyContent: \"center\",\n background: \"white\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {/* {appInfo.icon && (\n <img\n src={appInfo.icon}\n alt=\"应用图标\"\n style={{\n width: 32,\n height: 32,\n borderRadius: \"6px\",\n }}\n />\n )} */}\n {appInfo.appName && (\n <div>\n <div\n style={{\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#000\",\n }}\n >\n {appInfo.appName}\n </div>\n {/* {appInfo.description && (\n <div\n style={{\n fontSize: \"12px\",\n color: \"#999\",\n marginTop: \"2px\",\n }}\n >\n {appInfo.description}\n </div>\n )} */}\n </div>\n )}\n </div>\n </div>\n ))}\n\n {/* 消息区域或Welcome区域 */}\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 上方弹性占位 - Welcome状态时占据空间 */}\n <div\n style={{\n flex: isEmpty ? 1 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n\n {/* Welcome 组件 - 只在空状态显示 */}\n {isEmpty && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: \"0 24px\",\n marginBottom: \"24px\",\n }}\n >\n <Welcome />\n </div>\n )}\n\n {/* Messages 组件 - 只在非空状态显示 */}\n {!isEmpty && (\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n }}\n >\n <Messages\n showFnCallDetail={showFnCallDetail}\n renderFunctionCall={renderFunctionCall}\n strategies={strategies}\n />\n </div>\n )}\n\n {/* 输入区域 - 始终存在,通过样式控制位置 */}\n <div\n style={{\n width: \"100%\",\n maxWidth: isEmpty ? \"600px\" : \"100%\",\n alignSelf: \"center\",\n padding: isEmpty ? \"0 24px\" : \"0\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n {footer || (\n <Sender allowUpload={allowUpload} clearBtnShow={clearBtnShow} />\n )}\n </div>\n\n {/* 下方弹性占位 - Welcome状态时占据更多空间,让内容偏上 */}\n <div\n style={{\n flex: isEmpty ? 1.5 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nDefaultLayout.displayName = \"XAdkProvider.DefaultLayout\";\n\nexport default DefaultLayout;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["React","useRef","useCallback","useState","Attachments","useChatState","Sidebar","Messages","Welcome","Sender","jsx","_jsx","jsxs","_jsxs","DefaultLayout","_ref","_ref$showSessionList","showSessionList","header","footer","_ref$allowUpload","allowUpload","_ref$draggable","draggable","_ref$clearBtnShow","clearBtnShow","showFnCallDetail","renderFunctionCall","strategies","_useChatState","appInfo","messages","prologue","suggestions","chatAreaRef","senderRef","_useState","_useState2","_slicedToArray","dropFileList","setDropFileList","enableDragUpload","handleDropFiles","info","rawFiles","fileList","map","f","originFileObj","filter","Boolean","length","_senderRef$current","current","addFiles","isEmpty","style","display","height","width","position","overflow","children","isNarrow","ref","flex","justifyContent","alignItems","flexDirection","maxWidth","padding","background","gap","appName","fontSize","fontWeight","color","transition","marginBottom","alignSelf","items","getDropContainer","multiple","beforeUpload","onChange","displayName"],"sources":["../../../../../src/components/XAdkProvider/compound/DefaultLayout.tsx"],"sourcesContent":["import React, { useRef, useCallback, useState } from \"react\";\nimport { Attachments } from \"@ant-design/x\";\nimport type { UploadFile } from \"antd\";\nimport { useChatState } from \"../context/ChatStateContext\";\nimport Sidebar from \"./Sidebar\";\nimport Messages from \"./Messages\";\nimport Welcome from \"./Welcome\";\nimport Sender from \"./Sender\";\nimport type { ChatStrategies } from \"@/types\";\nimport type { XAdkSenderHandle } from \"@/types/XAdkSender\";\n\n/**\n * XAdkProvider 默认布局\n *\n * 提供类似 ChatGPT/DeepSeek 的默认布局:\n * - 左侧: 会话列表侧边栏 (可选,支持展开/收起)\n * - 右侧: 聊天区域 (标题 + 消息 + 输入框,居中显示,最大宽度800px)\n */\nexport interface DefaultLayoutProps {\n /** 是否显示会话列表 */\n showSessionList?: boolean;\n /** 自定义头部 */\n header?: React.ReactNode;\n /** 自定义底部 (替代默认 Sender) */\n footer?: React.ReactNode;\n /** 是否允许上传文件 */\n allowUpload?: boolean;\n /** 是否启用拖拽上传,拖拽区域为整个聊天区域(不含侧边栏),需 allowUpload 为 true */\n draggable?: boolean;\n /** 是否显示清空按钮 */\n clearBtnShow?: boolean;\n /** 是否显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 自定义消息 Footer */\n messagesFooter?: (msg: any) => React.ReactNode;\n /** 自定义工具调用渲染函数,返回 null 则降级使用默认渲染 */\n renderFunctionCall?: (msg: import(\"@/types\").IMessage) => React.ReactNode | null;\n /** 局部策略覆盖,优先级高于 Provider preset/strategies */\n strategies?: ChatStrategies;\n}\n\nconst DefaultLayout: React.FC<DefaultLayoutProps> = ({\n showSessionList = false,\n header,\n footer,\n allowUpload = false,\n draggable = true,\n clearBtnShow = true,\n showFnCallDetail,\n renderFunctionCall,\n strategies,\n}) => {\n const { appInfo, messages, prologue, suggestions } = useChatState();\n const chatAreaRef = useRef<HTMLDivElement>(null);\n const senderRef = useRef<XAdkSenderHandle>(null);\n const [dropFileList, setDropFileList] = useState<UploadFile[]>([]);\n\n // 拖拽上传是否启用\n const enableDragUpload = allowUpload && draggable;\n\n // Attachments 拖拽文件后的回调\n const handleDropFiles = useCallback((info: { fileList: UploadFile[] }) => {\n const rawFiles = info.fileList\n .map((f) => f.originFileObj)\n .filter(Boolean) as File[];\n if (rawFiles.length > 0) {\n senderRef.current?.addFiles(rawFiles);\n }\n // 清空 Attachments 文件列表,避免累积\n setDropFileList([]);\n }, []);\n\n // 判断是否为空状态(展示Welcome)\n const isEmpty =\n messages.length === 0 &&\n !prologue &&\n (!suggestions || suggestions.length === 0);\n\n return (\n <div\n style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n {/* 左侧会话列表 - XAiConversations 组件会处理展开/收起 */}\n {showSessionList && <Sidebar isNarrow={false} />}\n\n {/* 右侧聊天区域 - 使用 flex: 1 自动占据剩余空间 */}\n <div\n ref={chatAreaRef}\n style={{\n flex: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n {/* 居中容器 - 最大宽度 800px */}\n <div\n style={{\n width: \"100%\",\n maxWidth: \"800px\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 头部 */}\n {header ||\n (appInfo && (\n <div\n style={{\n padding: \"16px 24px\",\n display: \"flex\",\n justifyContent: \"center\",\n background: \"white\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {appInfo.appName && (\n <div>\n <div\n style={{\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#000\",\n }}\n >\n {appInfo.appName}\n </div>\n </div>\n )}\n </div>\n </div>\n ))}\n\n {/* 消息区域或Welcome区域 */}\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 上方弹性占位 - Welcome状态时占据空间 */}\n <div\n style={{\n flex: isEmpty ? 1 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n\n {/* Welcome 组件 - 只在空状态显示 */}\n {isEmpty && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: \"0 24px\",\n marginBottom: \"24px\",\n }}\n >\n <Welcome />\n </div>\n )}\n\n {/* Messages 组件 - 只在非空状态显示 */}\n {!isEmpty && (\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n }}\n >\n <Messages\n showFnCallDetail={showFnCallDetail}\n renderFunctionCall={renderFunctionCall}\n strategies={strategies}\n />\n </div>\n )}\n\n {/* 输入区域 - 始终存在,通过样式控制位置 */}\n <div\n style={{\n width: \"100%\",\n maxWidth: isEmpty ? \"600px\" : \"100%\",\n alignSelf: \"center\",\n padding: isEmpty ? \"0 24px\" : \"0\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n {footer || (\n <Sender\n ref={senderRef}\n allowUpload={allowUpload}\n draggable={!enableDragUpload}\n clearBtnShow={clearBtnShow}\n />\n )}\n </div>\n\n {/* 下方弹性占位 - Welcome状态时占据更多空间,让内容偏上 */}\n <div\n style={{\n flex: isEmpty ? 1.5 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n </div>\n </div>\n\n {/* Attachments 拖拽遮罩 - 仅用于拖拽上传功能 */}\n {enableDragUpload && (\n <Attachments\n style={{ display: \"none\" }}\n items={dropFileList}\n getDropContainer={() => chatAreaRef.current}\n multiple\n beforeUpload={() => false}\n onChange={handleDropFiles}\n />\n )}\n </div>\n </div>\n );\n};\n\nDefaultLayout.displayName = \"XAdkProvider.DefaultLayout\";\n\nexport default DefaultLayout;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { XAdkSenderProps } from "../../../types
|
|
2
|
+
import type { XAdkSenderProps, XAdkSenderHandle } from "../../../types";
|
|
3
3
|
/**
|
|
4
4
|
* XAdkProvider.Sender - 输入框组件
|
|
5
5
|
*
|
|
@@ -23,5 +23,5 @@ export interface XAdkSenderCompoundProps extends Partial<Omit<XAdkSenderProps, '
|
|
|
23
23
|
/** 额外的类名 */
|
|
24
24
|
className?: string;
|
|
25
25
|
}
|
|
26
|
-
declare const Sender: React.
|
|
26
|
+
declare const Sender: React.ForwardRefExoticComponent<XAdkSenderCompoundProps & React.RefAttributes<XAdkSenderHandle>>;
|
|
27
27
|
export default Sender;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
-
import React from 'react';
|
|
2
|
+
import React, { forwardRef } from 'react';
|
|
3
3
|
import XAdkSender from "../../XAdkSender";
|
|
4
4
|
import { useChatState } from "../context/ChatStateContext";
|
|
5
5
|
import { useChatActions } from "../context/ChatActionContext";
|
|
@@ -22,7 +22,7 @@ import { useChatActions } from "../context/ChatActionContext";
|
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
24
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
25
|
-
var Sender = function
|
|
25
|
+
var Sender = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
26
26
|
var _useChatState = useChatState(),
|
|
27
27
|
loading = _useChatState.loading,
|
|
28
28
|
uploadRequest = _useChatState.uploadRequest;
|
|
@@ -31,13 +31,14 @@ var Sender = function Sender(props) {
|
|
|
31
31
|
stopChat = _useChatActions.stopChat,
|
|
32
32
|
clearChat = _useChatActions.clearChat;
|
|
33
33
|
return /*#__PURE__*/_jsx(XAdkSender, _objectSpread({
|
|
34
|
+
ref: ref,
|
|
34
35
|
loading: loading,
|
|
35
36
|
onSubmit: chat,
|
|
36
37
|
onStop: stopChat,
|
|
37
38
|
onClear: clearChat,
|
|
38
39
|
uploadRequest: uploadRequest
|
|
39
40
|
}, props));
|
|
40
|
-
};
|
|
41
|
+
});
|
|
41
42
|
Sender.displayName = 'XAdkProvider.Sender';
|
|
42
43
|
export default Sender;
|
|
43
44
|
//# sourceMappingURL=Sender.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","XAdkSender","useChatState","useChatActions","jsx","_jsx","Sender","props","_useChatState","loading","uploadRequest","_useChatActions","chat","stopChat","clearChat","_objectSpread","onSubmit","onStop","onClear","displayName"],"sources":["../../../../../src/components/XAdkProvider/compound/Sender.tsx"],"sourcesContent":["import React from 'react';\nimport XAdkSender from '@/components/XAdkSender';\nimport { useChatState } from '../context/ChatStateContext';\nimport { useChatActions } from '../context/ChatActionContext';\nimport type { XAdkSenderProps } from '@/types
|
|
1
|
+
{"version":3,"names":["React","forwardRef","XAdkSender","useChatState","useChatActions","jsx","_jsx","Sender","props","ref","_useChatState","loading","uploadRequest","_useChatActions","chat","stopChat","clearChat","_objectSpread","onSubmit","onStop","onClear","displayName"],"sources":["../../../../../src/components/XAdkProvider/compound/Sender.tsx"],"sourcesContent":["import React, { forwardRef } from 'react';\nimport XAdkSender from '@/components/XAdkSender';\nimport { useChatState } from '../context/ChatStateContext';\nimport { useChatActions } from '../context/ChatActionContext';\nimport type { XAdkSenderProps, XAdkSenderHandle } from '@/types';\n\n/**\n * XAdkProvider.Sender - 输入框组件\n *\n * 从 Context 获取聊天动作并提供输入界面\n * 基于 XAdkSender 组件实现\n *\n * @example\n * ```tsx\n * <XAdkProvider url=\"...\" token=\"...\">\n * <XAdkProvider.Sender\n * allowUpload={true}\n * clearBtnShow={true}\n * uploadRequest={myUploadHandler}\n * />\n * </XAdkProvider>\n * ```\n */\nexport interface XAdkSenderCompoundProps extends Partial<Omit<XAdkSenderProps, 'loading' | 'onSubmit' | 'onStop' | 'onClear'>> {\n /** 额外的样式 */\n style?: React.CSSProperties;\n /** 额外的类名 */\n className?: string;\n}\n\nconst Sender = forwardRef<XAdkSenderHandle, XAdkSenderCompoundProps>((props, ref) => {\n const { loading, uploadRequest } = useChatState();\n const { chat, stopChat, clearChat } = useChatActions();\n\n return (\n <XAdkSender\n ref={ref}\n loading={loading}\n onSubmit={chat}\n onStop={stopChat}\n onClear={clearChat}\n uploadRequest={uploadRequest}\n {...props}\n />\n );\n});\n\nSender.displayName = 'XAdkProvider.Sender';\n\nexport default Sender;\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;AACzC,OAAOC,UAAU;AACjB,SAASC,YAAY;AACrB,SAASC,cAAc;;AAGvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAhBA,SAAAC,GAAA,IAAAC,IAAA;AAwBA,IAAMC,MAAM,gBAAGN,UAAU,CAA4C,UAACO,KAAK,EAAEC,GAAG,EAAK;EACnF,IAAAC,aAAA,GAAmCP,YAAY,CAAC,CAAC;IAAzCQ,OAAO,GAAAD,aAAA,CAAPC,OAAO;IAAEC,aAAa,GAAAF,aAAA,CAAbE,aAAa;EAC9B,IAAAC,eAAA,GAAsCT,cAAc,CAAC,CAAC;IAA9CU,IAAI,GAAAD,eAAA,CAAJC,IAAI;IAAEC,QAAQ,GAAAF,eAAA,CAARE,QAAQ;IAAEC,SAAS,GAAAH,eAAA,CAATG,SAAS;EAEjC,oBACEV,IAAA,CAACJ,UAAU,EAAAe,aAAA;IACTR,GAAG,EAAEA,GAAI;IACTE,OAAO,EAAEA,OAAQ;IACjBO,QAAQ,EAAEJ,IAAK;IACfK,MAAM,EAAEJ,QAAS;IACjBK,OAAO,EAAEJ,SAAU;IACnBJ,aAAa,EAAEA;EAAc,GACzBJ,KAAK,CACV,CAAC;AAEN,CAAC,CAAC;AAEFD,MAAM,CAACc,WAAW,GAAG,qBAAqB;AAE1C,eAAed,MAAM"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
declare const XAdkSender: React.
|
|
2
|
+
import { XAdkSenderHandle } from "../../types";
|
|
3
|
+
declare const XAdkSender: React.ForwardRefExoticComponent<import("../../types").SenderUIProps & import("../../types").UploaderCoreProps & React.RefAttributes<XAdkSenderHandle>>;
|
|
4
4
|
export default XAdkSender;
|
|
@@ -4,7 +4,7 @@ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
|
4
4
|
import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
|
|
5
5
|
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
6
6
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
7
|
-
import React, { useState, useRef, useCallback } from "react";
|
|
7
|
+
import React, { useState, useRef, useCallback, forwardRef, useImperativeHandle } from "react";
|
|
8
8
|
import { Popconfirm, message, Tooltip, Input, Modal } from "antd";
|
|
9
9
|
import { ClearOutlined, LoadingOutlined, ArrowUpOutlined, PaperClipOutlined } from "@ant-design/icons";
|
|
10
10
|
import { useStyles } from "./styles";
|
|
@@ -12,11 +12,13 @@ import FileGallery from "../FileGallery";
|
|
|
12
12
|
import { getExt } from "../../utils/file";
|
|
13
13
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
14
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
|
-
var XAdkSender = function
|
|
15
|
+
var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
16
16
|
var _ref$clearBtnShow = _ref.clearBtnShow,
|
|
17
17
|
clearBtnShow = _ref$clearBtnShow === void 0 ? true : _ref$clearBtnShow,
|
|
18
18
|
_ref$allowUpload = _ref.allowUpload,
|
|
19
19
|
allowUpload = _ref$allowUpload === void 0 ? false : _ref$allowUpload,
|
|
20
|
+
_ref$draggable = _ref.draggable,
|
|
21
|
+
draggable = _ref$draggable === void 0 ? true : _ref$draggable,
|
|
20
22
|
_ref$loading = _ref.loading,
|
|
21
23
|
loading = _ref$loading === void 0 ? false : _ref$loading,
|
|
22
24
|
_ref$disabled = _ref.disabled,
|
|
@@ -200,6 +202,15 @@ var XAdkSender = function XAdkSender(_ref) {
|
|
|
200
202
|
}
|
|
201
203
|
}, [files, maxFiles, maxFileSize, allowedFileTypes]);
|
|
202
204
|
|
|
205
|
+
// 暴露 addFiles 方法供外层(如 DefaultLayout 拖拽上传)调用
|
|
206
|
+
useImperativeHandle(ref, function () {
|
|
207
|
+
return {
|
|
208
|
+
addFiles: function addFiles(rawFiles) {
|
|
209
|
+
handleFileSelect(rawFiles);
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
}, [handleFileSelect]);
|
|
213
|
+
|
|
203
214
|
// 上传文件
|
|
204
215
|
var uploadFiles = /*#__PURE__*/function () {
|
|
205
216
|
var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(fileList) {
|
|
@@ -476,7 +487,7 @@ var XAdkSender = function XAdkSender(_ref) {
|
|
|
476
487
|
});
|
|
477
488
|
var isDisabled = disabled || uploading || loading;
|
|
478
489
|
|
|
479
|
-
//
|
|
490
|
+
// 定义按钮组件(供外部 slot 函数通过 actionsComponents 使用)
|
|
480
491
|
var SendButton = function SendButton(props) {
|
|
481
492
|
return /*#__PURE__*/_jsx(Tooltip, {
|
|
482
493
|
title: loading ? "停止生成" : "发送消息",
|
|
@@ -486,7 +497,9 @@ var XAdkSender = function XAdkSender(_ref) {
|
|
|
486
497
|
disabled: uploading || disabled,
|
|
487
498
|
"aria-label": loading ? "停止生成" : "发送消息"
|
|
488
499
|
}, props), {}, {
|
|
489
|
-
children: loading ? /*#__PURE__*/_jsx(LoadingOutlined, {
|
|
500
|
+
children: loading ? /*#__PURE__*/_jsx(LoadingOutlined, {
|
|
501
|
+
spin: true
|
|
502
|
+
}) : /*#__PURE__*/_jsx(ArrowUpOutlined, {})
|
|
490
503
|
}))
|
|
491
504
|
});
|
|
492
505
|
};
|
|
@@ -539,17 +552,37 @@ var XAdkSender = function XAdkSender(_ref) {
|
|
|
539
552
|
return slot;
|
|
540
553
|
};
|
|
541
554
|
|
|
542
|
-
// 默认的后缀内容(操作按钮组)
|
|
555
|
+
// 默认的后缀内容(操作按钮组) - 直接内联渲染避免组件引用变化导致 unmount/remount
|
|
543
556
|
var defaultSuffix = /*#__PURE__*/_jsxs("div", {
|
|
544
557
|
className: styles.buttonGroup,
|
|
545
|
-
children: [allowUpload && /*#__PURE__*/_jsx(
|
|
558
|
+
children: [allowUpload && /*#__PURE__*/_jsx(Tooltip, {
|
|
559
|
+
title: "\u4E0A\u4F20\u6587\u4EF6",
|
|
560
|
+
children: /*#__PURE__*/_jsx("button", {
|
|
561
|
+
className: "".concat(styles.iconButton, " ").concat(styles.uploadButton),
|
|
562
|
+
onClick: triggerFileSelect,
|
|
563
|
+
disabled: isDisabled,
|
|
564
|
+
"aria-label": "\u4E0A\u4F20\u6587\u4EF6",
|
|
565
|
+
children: /*#__PURE__*/_jsx(PaperClipOutlined, {})
|
|
566
|
+
})
|
|
567
|
+
}), /*#__PURE__*/_jsx(Tooltip, {
|
|
568
|
+
title: loading ? "停止生成" : "发送消息",
|
|
569
|
+
children: /*#__PURE__*/_jsx("button", {
|
|
570
|
+
className: "".concat(styles.iconButton, " ").concat(styles.sendButton, " ").concat(loading ? "stop" : ""),
|
|
571
|
+
onClick: loading ? onStop : handleSubmit,
|
|
572
|
+
disabled: uploading || disabled,
|
|
573
|
+
"aria-label": loading ? "停止生成" : "发送消息",
|
|
574
|
+
children: loading ? /*#__PURE__*/_jsx(LoadingOutlined, {
|
|
575
|
+
spin: true
|
|
576
|
+
}) : /*#__PURE__*/_jsx(ArrowUpOutlined, {})
|
|
577
|
+
})
|
|
578
|
+
})]
|
|
546
579
|
});
|
|
547
580
|
return /*#__PURE__*/_jsxs("div", {
|
|
548
581
|
ref: containerRef,
|
|
549
582
|
className: containerClass,
|
|
550
|
-
onDragOver: allowUpload ? handleDragOver : undefined,
|
|
551
|
-
onDragLeave: allowUpload ? handleDragLeave : undefined,
|
|
552
|
-
onDrop: allowUpload ? handleDrop : undefined,
|
|
583
|
+
onDragOver: allowUpload && draggable ? handleDragOver : undefined,
|
|
584
|
+
onDragLeave: allowUpload && draggable ? handleDragLeave : undefined,
|
|
585
|
+
onDrop: allowUpload && draggable ? handleDrop : undefined,
|
|
553
586
|
children: [renderSlot(header, false), allowUpload && files.length > 0 && renderFileList(), allowUpload && /*#__PURE__*/_jsx("input", {
|
|
554
587
|
ref: fileInputRef,
|
|
555
588
|
type: "file",
|
|
@@ -598,6 +631,7 @@ var XAdkSender = function XAdkSender(_ref) {
|
|
|
598
631
|
}))]
|
|
599
632
|
})]
|
|
600
633
|
});
|
|
601
|
-
};
|
|
634
|
+
});
|
|
635
|
+
XAdkSender.displayName = 'XAdkSender';
|
|
602
636
|
export default XAdkSender;
|
|
603
637
|
//# sourceMappingURL=index.js.map
|