@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.
- 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 +13 -6
- package/dist/cjs/components/XAdkSender/index.js.map +2 -2
- package/dist/cjs/hooks/useADKChat.js +1 -0
- 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 +18 -6
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/hooks/useADKChat.js +8 -6
- 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 +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.
|
|
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:
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
122
|
+
children: appInfo.appName && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
123
|
+
"div",
|
|
160
124
|
{
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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 {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
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
|
|
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;
|
|
@@ -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
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
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 {
|
|
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;
|
|
@@ -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
|