@ai-group/chat-sdk 3.3.3 → 3.3.5

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.
Files changed (36) hide show
  1. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +2 -0
  2. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +150 -112
  3. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
  4. package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +2 -2
  5. package/dist/cjs/components/XAdkProvider/compound/Sender.js +4 -2
  6. package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +2 -2
  7. package/dist/cjs/components/XAdkSender/index.d.ts +2 -2
  8. package/dist/cjs/components/XAdkSender/index.js +13 -6
  9. package/dist/cjs/components/XAdkSender/index.js.map +2 -2
  10. package/dist/cjs/hooks/useADKChat.js +1 -0
  11. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  12. package/dist/cjs/types/XAdkProvider.d.ts +6 -0
  13. package/dist/cjs/types/XAdkProvider.js.map +1 -1
  14. package/dist/cjs/types/XAdkSender.d.ts +5 -0
  15. package/dist/cjs/types/XAdkSender.js.map +1 -1
  16. package/dist/cjs/utils/umdEntry.js +3 -0
  17. package/dist/cjs/utils/umdEntry.js.map +2 -2
  18. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +2 -0
  19. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +48 -5
  20. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
  21. package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +2 -2
  22. package/dist/esm/components/XAdkProvider/compound/Sender.js +4 -3
  23. package/dist/esm/components/XAdkProvider/compound/Sender.js.map +1 -1
  24. package/dist/esm/components/XAdkSender/index.d.ts +2 -2
  25. package/dist/esm/components/XAdkSender/index.js +18 -6
  26. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  27. package/dist/esm/hooks/useADKChat.js +8 -6
  28. package/dist/esm/hooks/useADKChat.js.map +1 -1
  29. package/dist/esm/types/XAdkProvider.d.ts +6 -0
  30. package/dist/esm/types/XAdkProvider.js.map +1 -1
  31. package/dist/esm/types/XAdkSender.d.ts +5 -0
  32. package/dist/esm/types/XAdkSender.js.map +1 -1
  33. package/dist/esm/utils/umdEntry.js +4 -1
  34. package/dist/esm/utils/umdEntry.js.map +1 -1
  35. package/dist/umd/chat-sdk.min.js +1 -1
  36. package/package.json +12 -14
@@ -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
  /** 是否显示函数调用详情 */
@@ -32,6 +32,8 @@ __export(DefaultLayout_exports, {
32
32
  default: () => DefaultLayout_default
33
33
  });
34
34
  module.exports = __toCommonJS(DefaultLayout_exports);
35
+ var import_react = require("react");
36
+ var import_x = require("@ant-design/x");
35
37
  var import_ChatStateContext = require("../context/ChatStateContext");
36
38
  var import_Sidebar = __toESM(require("./Sidebar"));
37
39
  var import_Messages = __toESM(require("./Messages"));
@@ -43,12 +45,25 @@ var DefaultLayout = ({
43
45
  header,
44
46
  footer,
45
47
  allowUpload = false,
48
+ draggable = true,
46
49
  clearBtnShow = true,
47
50
  showFnCallDetail,
48
51
  renderFunctionCall,
49
52
  strategies
50
53
  }) => {
51
54
  const { appInfo, messages, prologue, suggestions } = (0, import_ChatStateContext.useChatState)();
55
+ const chatAreaRef = (0, import_react.useRef)(null);
56
+ const senderRef = (0, import_react.useRef)(null);
57
+ const [dropFileList, setDropFileList] = (0, import_react.useState)([]);
58
+ const enableDragUpload = allowUpload && draggable;
59
+ const handleDropFiles = (0, import_react.useCallback)((info) => {
60
+ var _a;
61
+ const rawFiles = info.fileList.map((f) => f.originFileObj).filter(Boolean);
62
+ if (rawFiles.length > 0) {
63
+ (_a = senderRef.current) == null ? void 0 : _a.addFiles(rawFiles);
64
+ }
65
+ setDropFileList([]);
66
+ }, []);
52
67
  const isEmpty = messages.length === 0 && !prologue && (!suggestions || suggestions.length === 0);
53
68
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
54
69
  "div",
@@ -62,137 +77,160 @@ var DefaultLayout = ({
62
77
  },
63
78
  children: [
64
79
  showSessionList && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Sidebar.default, { isNarrow: false }),
65
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
66
81
  "div",
67
82
  {
83
+ ref: chatAreaRef,
68
84
  style: {
69
85
  flex: 1,
70
86
  display: "flex",
71
87
  justifyContent: "center",
72
88
  alignItems: "center",
73
89
  flexDirection: "column",
74
- overflow: "hidden"
90
+ overflow: "hidden",
91
+ position: "relative"
75
92
  },
76
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
77
- "div",
78
- {
79
- style: {
80
- width: "100%",
81
- maxWidth: "800px",
82
- height: "100%",
83
- display: "flex",
84
- flexDirection: "column"
85
- },
86
- children: [
87
- header || appInfo && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
88
- "div",
89
- {
90
- style: {
91
- padding: "16px 24px",
92
- display: "flex",
93
- justifyContent: "center",
94
- background: "white"
95
- },
96
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
97
- "div",
98
- {
99
- style: {
100
- display: "flex",
101
- alignItems: "center",
102
- gap: "12px"
103
- },
104
- children: appInfo.appName && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
105
- "div",
106
- {
107
- style: {
108
- fontSize: "16px",
109
- fontWeight: 500,
110
- color: "#000"
111
- },
112
- children: appInfo.appName
113
- }
114
- ) })
115
- }
116
- )
117
- }
118
- ),
119
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
120
- "div",
121
- {
122
- style: {
123
- flex: 1,
124
- overflow: "hidden",
125
- display: "flex",
126
- flexDirection: "column"
127
- },
128
- children: [
129
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
130
- "div",
131
- {
132
- style: {
133
- flex: isEmpty ? 1 : 0,
134
- transition: "flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)"
135
- }
136
- }
137
- ),
138
- isEmpty && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
93
+ children: [
94
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
95
+ "div",
96
+ {
97
+ style: {
98
+ width: "100%",
99
+ maxWidth: "800px",
100
+ height: "100%",
101
+ display: "flex",
102
+ flexDirection: "column"
103
+ },
104
+ children: [
105
+ header || appInfo && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
106
+ "div",
107
+ {
108
+ style: {
109
+ padding: "16px 24px",
110
+ display: "flex",
111
+ justifyContent: "center",
112
+ background: "white"
113
+ },
114
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
139
115
  "div",
140
116
  {
141
117
  style: {
142
118
  display: "flex",
143
- flexDirection: "column",
144
119
  alignItems: "center",
145
- padding: "0 24px",
146
- marginBottom: "24px"
147
- },
148
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Welcome.default, {})
149
- }
150
- ),
151
- !isEmpty && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
152
- "div",
153
- {
154
- style: {
155
- flex: 1,
156
- overflow: "hidden"
120
+ gap: "12px"
157
121
  },
158
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
159
- import_Messages.default,
122
+ children: appInfo.appName && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
123
+ "div",
160
124
  {
161
- showFnCallDetail,
162
- renderFunctionCall,
163
- strategies
125
+ style: {
126
+ fontSize: "16px",
127
+ fontWeight: 500,
128
+ color: "#000"
129
+ },
130
+ children: appInfo.appName
164
131
  }
165
- )
166
- }
167
- ),
168
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
169
- "div",
170
- {
171
- style: {
172
- width: "100%",
173
- maxWidth: isEmpty ? "600px" : "100%",
174
- alignSelf: "center",
175
- padding: isEmpty ? "0 24px" : "0",
176
- transition: "all 0.4s cubic-bezier(0.4, 0, 0.2, 1)"
177
- },
178
- children: footer || /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Sender.default, { allowUpload, clearBtnShow })
179
- }
180
- ),
181
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
182
- "div",
183
- {
184
- style: {
185
- flex: isEmpty ? 1.5 : 0,
186
- transition: "flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)"
187
- }
132
+ ) })
188
133
  }
189
134
  )
190
- ]
191
- }
192
- )
193
- ]
194
- }
195
- )
135
+ }
136
+ ),
137
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
138
+ "div",
139
+ {
140
+ style: {
141
+ flex: 1,
142
+ overflow: "hidden",
143
+ display: "flex",
144
+ flexDirection: "column"
145
+ },
146
+ children: [
147
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
148
+ "div",
149
+ {
150
+ style: {
151
+ flex: isEmpty ? 1 : 0,
152
+ transition: "flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)"
153
+ }
154
+ }
155
+ ),
156
+ isEmpty && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
157
+ "div",
158
+ {
159
+ style: {
160
+ display: "flex",
161
+ flexDirection: "column",
162
+ alignItems: "center",
163
+ padding: "0 24px",
164
+ marginBottom: "24px"
165
+ },
166
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Welcome.default, {})
167
+ }
168
+ ),
169
+ !isEmpty && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
170
+ "div",
171
+ {
172
+ style: {
173
+ flex: 1,
174
+ overflow: "hidden"
175
+ },
176
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
177
+ import_Messages.default,
178
+ {
179
+ showFnCallDetail,
180
+ renderFunctionCall,
181
+ strategies
182
+ }
183
+ )
184
+ }
185
+ ),
186
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
187
+ "div",
188
+ {
189
+ style: {
190
+ width: "100%",
191
+ maxWidth: isEmpty ? "600px" : "100%",
192
+ alignSelf: "center",
193
+ padding: isEmpty ? "0 24px" : "0",
194
+ transition: "all 0.4s cubic-bezier(0.4, 0, 0.2, 1)"
195
+ },
196
+ children: footer || /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
197
+ import_Sender.default,
198
+ {
199
+ ref: senderRef,
200
+ allowUpload,
201
+ draggable: !enableDragUpload,
202
+ clearBtnShow
203
+ }
204
+ )
205
+ }
206
+ ),
207
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
208
+ "div",
209
+ {
210
+ style: {
211
+ flex: isEmpty ? 1.5 : 0,
212
+ transition: "flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)"
213
+ }
214
+ }
215
+ )
216
+ ]
217
+ }
218
+ )
219
+ ]
220
+ }
221
+ ),
222
+ enableDragUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
223
+ import_x.Attachments,
224
+ {
225
+ style: { display: "none" },
226
+ items: dropFileList,
227
+ getDropContainer: () => chatAreaRef.current,
228
+ multiple: true,
229
+ beforeUpload: () => false,
230
+ onChange: handleDropFiles
231
+ }
232
+ )
233
+ ]
196
234
  }
197
235
  )
198
236
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/components/XAdkProvider/compound/DefaultLayout.tsx"],
4
- "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"],
5
- "mappings": "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",
4
+ "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"],
5
+ "mappings": "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",
6
6
  "names": ["Sidebar", "Welcome", "Messages", "Sender"]
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { XAdkSenderProps } from "../../../types/XAdkSender";
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.FC<XAdkSenderCompoundProps>;
26
+ declare const Sender: React.ForwardRefExoticComponent<XAdkSenderCompoundProps & React.RefAttributes<XAdkSenderHandle>>;
27
27
  export default Sender;
@@ -32,16 +32,18 @@ __export(Sender_exports, {
32
32
  default: () => Sender_default
33
33
  });
34
34
  module.exports = __toCommonJS(Sender_exports);
35
+ var import_react = require("react");
35
36
  var import_XAdkSender = __toESM(require("../../XAdkSender"));
36
37
  var import_ChatStateContext = require("../context/ChatStateContext");
37
38
  var import_ChatActionContext = require("../context/ChatActionContext");
38
39
  var import_jsx_runtime = require("react/jsx-runtime");
39
- var Sender = (props) => {
40
+ var Sender = (0, import_react.forwardRef)((props, ref) => {
40
41
  const { loading, uploadRequest } = (0, import_ChatStateContext.useChatState)();
41
42
  const { chat, stopChat, clearChat } = (0, import_ChatActionContext.useChatActions)();
42
43
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
43
44
  import_XAdkSender.default,
44
45
  {
46
+ ref,
45
47
  loading,
46
48
  onSubmit: chat,
47
49
  onStop: stopChat,
@@ -50,7 +52,7 @@ var Sender = (props) => {
50
52
  ...props
51
53
  }
52
54
  );
53
- };
55
+ });
54
56
  Sender.displayName = "XAdkProvider.Sender";
55
57
  var Sender_default = Sender;
56
58
  //# sourceMappingURL=Sender.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/components/XAdkProvider/compound/Sender.tsx"],
4
- "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/XAdkSender';\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: React.FC<XAdkSenderCompoundProps> = (props) => {\n const { loading, uploadRequest } = useChatState();\n const { chat, stopChat, clearChat } = useChatActions();\n\n return (\n <XAdkSender\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"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAAuB;AACvB,8BAA6B;AAC7B,+BAA+B;AAgC3B;AALJ,IAAM,SAA4C,CAAC,UAAU;AAC3D,QAAM,EAAE,SAAS,cAAc,QAAI,sCAAa;AAChD,QAAM,EAAE,MAAM,UAAU,UAAU,QAAI,yCAAe;AAErD,SACE;AAAA,IAAC,kBAAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACA,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,OAAO,cAAc;AAErB,IAAO,iBAAQ;",
4
+ "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"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkC;AAClC,wBAAuB;AACvB,8BAA6B;AAC7B,+BAA+B;AAgC3B;AALJ,IAAM,aAAS,yBAAsD,CAAC,OAAO,QAAQ;AACnF,QAAM,EAAE,SAAS,cAAc,QAAI,sCAAa;AAChD,QAAM,EAAE,MAAM,UAAU,UAAU,QAAI,yCAAe;AAErD,SACE;AAAA,IAAC,kBAAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AAED,OAAO,cAAc;AAErB,IAAO,iBAAQ;",
6
6
  "names": ["XAdkSender"]
7
7
  }
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- import { XAdkSenderProps } from "../../types";
3
- declare const XAdkSender: React.FC<XAdkSenderProps>;
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;
@@ -39,9 +39,10 @@ var import_styles = require("./styles");
39
39
  var import_FileGallery = __toESM(require("../FileGallery"));
40
40
  var import_file = require("../../utils/file");
41
41
  var import_jsx_runtime = require("react/jsx-runtime");
42
- var XAdkSender = ({
42
+ var XAdkSender = (0, import_react.forwardRef)(({
43
43
  clearBtnShow = true,
44
44
  allowUpload = false,
45
+ draggable = true,
45
46
  loading = false,
46
47
  disabled = false,
47
48
  uploadRequest = () => {
@@ -75,7 +76,7 @@ var XAdkSender = ({
75
76
  header,
76
77
  prefix,
77
78
  footer
78
- }) => {
79
+ }, ref) => {
79
80
  const styles = (0, import_styles.useStyles)();
80
81
  const [value, setValue] = (0, import_react.useState)("");
81
82
  const [files, setFiles] = (0, import_react.useState)([]);
@@ -192,6 +193,11 @@ var XAdkSender = ({
192
193
  },
193
194
  [files, maxFiles, maxFileSize, allowedFileTypes]
194
195
  );
196
+ (0, import_react.useImperativeHandle)(ref, () => ({
197
+ addFiles: (rawFiles) => {
198
+ handleFileSelect(rawFiles);
199
+ }
200
+ }), [handleFileSelect]);
195
201
  const uploadFiles = async (fileList) => {
196
202
  for (const localFile of fileList) {
197
203
  setFiles(
@@ -464,9 +470,9 @@ var XAdkSender = ({
464
470
  {
465
471
  ref: containerRef,
466
472
  className: containerClass,
467
- onDragOver: allowUpload ? handleDragOver : void 0,
468
- onDragLeave: allowUpload ? handleDragLeave : void 0,
469
- onDrop: allowUpload ? handleDrop : void 0,
473
+ onDragOver: allowUpload && draggable ? handleDragOver : void 0,
474
+ onDragLeave: allowUpload && draggable ? handleDragLeave : void 0,
475
+ onDrop: allowUpload && draggable ? handleDrop : void 0,
470
476
  children: [
471
477
  renderSlot(header, false),
472
478
  allowUpload && files.length > 0 && renderFileList(),
@@ -520,6 +526,7 @@ var XAdkSender = ({
520
526
  ]
521
527
  }
522
528
  );
523
- };
529
+ });
530
+ XAdkSender.displayName = "XAdkSender";
524
531
  var XAdkSender_default = XAdkSender;
525
532
  //# sourceMappingURL=index.js.map