@ai-group/chat-sdk 0.5.2 → 0.6.0
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/XAiChatbot/XAiChatbot.stories.js +14 -5
- package/dist/cjs/components/XAiChatbot/XAiChatbot.stories.js.map +2 -2
- package/dist/cjs/components/XAiChatbot/index.js +21 -102
- package/dist/cjs/components/XAiChatbot/index.js.map +3 -3
- package/dist/cjs/components/XAiChatbot/styles.d.ts +2 -14
- package/dist/cjs/components/XAiChatbot/styles.js +19 -161
- package/dist/cjs/components/XAiChatbot/styles.js.map +2 -2
- package/dist/cjs/components/XAiConversations/index.js +4 -3
- package/dist/cjs/components/XAiConversations/index.js.map +2 -2
- package/dist/cjs/components/XAiConversations/styles.d.ts +4 -0
- package/dist/cjs/components/XAiConversations/styles.js +23 -0
- package/dist/cjs/components/XAiConversations/styles.js.map +2 -2
- package/dist/cjs/components/XAiProvider/XAiProvider.stories.js +3 -3
- package/dist/cjs/components/XAiProvider/XAiProvider.stories.js.map +2 -2
- package/dist/cjs/components/XAiProvider/demo.styles.d.ts +2 -0
- package/dist/cjs/components/XAiProvider/index.d.ts +2 -2
- package/dist/cjs/components/XAiProvider/index.js +42 -12
- package/dist/cjs/components/XAiProvider/index.js.map +3 -3
- package/dist/cjs/components/XAiSender/XAiSender.stories.d.ts +6 -0
- package/dist/cjs/components/XAiSender/XAiSender.stories.js +86 -0
- package/dist/cjs/components/XAiSender/XAiSender.stories.js.map +7 -0
- package/dist/cjs/components/XAiSender/index.d.ts +4 -0
- package/dist/cjs/components/XAiSender/index.js +168 -0
- package/dist/cjs/components/XAiSender/index.js.map +7 -0
- package/dist/cjs/components/XAiSender/styles.d.ts +47 -0
- package/dist/cjs/components/XAiSender/styles.js +157 -0
- package/dist/cjs/components/XAiSender/styles.js.map +7 -0
- package/dist/cjs/constants/index.d.ts +1 -0
- package/dist/cjs/constants/index.js +3 -0
- package/dist/cjs/constants/index.js.map +2 -2
- package/dist/cjs/hooks/useAgentGenerator.js.map +1 -1
- package/dist/cjs/styles/common.d.ts +9 -0
- package/dist/cjs/styles/common.js +30 -0
- package/dist/cjs/styles/common.js.map +2 -2
- package/dist/cjs/types/XAiChatbot.d.ts +5 -17
- package/dist/cjs/types/XAiChatbot.js.map +1 -1
- package/dist/cjs/types/XAiConversations.d.ts +2 -0
- package/dist/cjs/types/XAiConversations.js.map +1 -1
- package/dist/cjs/types/XAiProvider.d.ts +6 -0
- package/dist/cjs/types/XAiProvider.js.map +2 -2
- package/dist/cjs/types/XAiSender.d.ts +13 -0
- package/dist/cjs/types/XAiSender.js +18 -0
- package/dist/cjs/types/XAiSender.js.map +7 -0
- package/dist/cjs/types/index.d.ts +1 -0
- package/dist/cjs/types/index.js +2 -0
- package/dist/cjs/types/index.js.map +2 -2
- package/dist/cjs/utils/umdEntry.js +2 -2
- package/dist/cjs/utils/umdEntry.js.map +2 -2
- package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js +17 -6
- package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js.map +1 -1
- package/dist/esm/components/XAiChatbot/index.js +37 -177
- package/dist/esm/components/XAiChatbot/index.js.map +1 -1
- package/dist/esm/components/XAiChatbot/styles.d.ts +2 -14
- package/dist/esm/components/XAiChatbot/styles.js +13 -33
- package/dist/esm/components/XAiChatbot/styles.js.map +1 -1
- package/dist/esm/components/XAiConversations/index.js +8 -3
- package/dist/esm/components/XAiConversations/index.js.map +1 -1
- package/dist/esm/components/XAiConversations/styles.d.ts +4 -0
- package/dist/esm/components/XAiConversations/styles.js +9 -7
- package/dist/esm/components/XAiConversations/styles.js.map +1 -1
- package/dist/esm/components/XAiProvider/XAiProvider.stories.js +14 -7
- package/dist/esm/components/XAiProvider/XAiProvider.stories.js.map +1 -1
- package/dist/esm/components/XAiProvider/demo.styles.d.ts +2 -0
- package/dist/esm/components/XAiProvider/index.d.ts +2 -2
- package/dist/esm/components/XAiProvider/index.js +50 -3
- package/dist/esm/components/XAiProvider/index.js.map +1 -1
- package/dist/esm/components/XAiSender/XAiSender.stories.d.ts +6 -0
- package/dist/esm/components/XAiSender/XAiSender.stories.js +66 -0
- package/dist/esm/components/XAiSender/XAiSender.stories.js.map +1 -0
- package/dist/esm/components/XAiSender/index.d.ts +4 -0
- package/dist/esm/components/XAiSender/index.js +211 -0
- package/dist/esm/components/XAiSender/index.js.map +1 -0
- package/dist/esm/components/XAiSender/styles.d.ts +47 -0
- package/dist/esm/components/XAiSender/styles.js +21 -0
- package/dist/esm/components/XAiSender/styles.js.map +1 -0
- package/dist/esm/constants/index.d.ts +1 -0
- package/dist/esm/constants/index.js +3 -0
- package/dist/esm/constants/index.js.map +1 -1
- package/dist/esm/hooks/useAgentGenerator.js +1 -1
- package/dist/esm/hooks/useAgentGenerator.js.map +1 -1
- package/dist/esm/styles/common.d.ts +9 -0
- package/dist/esm/styles/common.js +9 -2
- package/dist/esm/styles/common.js.map +1 -1
- package/dist/esm/types/XAiChatbot.d.ts +5 -17
- package/dist/esm/types/XAiChatbot.js.map +1 -1
- package/dist/esm/types/XAiConversations.d.ts +2 -0
- package/dist/esm/types/XAiConversations.js.map +1 -1
- package/dist/esm/types/XAiProvider.d.ts +6 -0
- package/dist/esm/types/XAiProvider.js.map +1 -1
- package/dist/esm/types/XAiSender.d.ts +13 -0
- package/dist/esm/types/XAiSender.js +2 -0
- package/dist/esm/types/XAiSender.js.map +1 -0
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/index.js +1 -0
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/utils/umdEntry.js +16 -2
- package/dist/esm/utils/umdEntry.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -32,13 +32,14 @@ __export(XAiProvider_exports, {
|
|
|
32
32
|
default: () => XAiProvider_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(XAiProvider_exports);
|
|
35
|
-
var import_react =
|
|
35
|
+
var import_react = require("react");
|
|
36
36
|
var import_antd = require("antd");
|
|
37
37
|
var import_copy_to_clipboard = __toESM(require("copy-to-clipboard"));
|
|
38
38
|
var import_x = require("@ant-design/x");
|
|
39
39
|
var import_icons = require("@ant-design/icons");
|
|
40
40
|
var import_AiProviderContext = require("../../context/AiProviderContext");
|
|
41
41
|
var import_useAgentGenerator = __toESM(require("../../hooks/useAgentGenerator"));
|
|
42
|
+
var import_constants = require("../../constants");
|
|
42
43
|
var import_user = __toESM(require("../../assets/user.png"));
|
|
43
44
|
var { confirm } = import_antd.Modal;
|
|
44
45
|
var XAiProvider = (0, import_react.forwardRef)(({
|
|
@@ -51,7 +52,7 @@ var XAiProvider = (0, import_react.forwardRef)(({
|
|
|
51
52
|
onMessage,
|
|
52
53
|
children
|
|
53
54
|
}, ref) => {
|
|
54
|
-
var _a, _b;
|
|
55
|
+
var _a, _b, _c;
|
|
55
56
|
const {
|
|
56
57
|
appInfo,
|
|
57
58
|
chat,
|
|
@@ -79,6 +80,25 @@ var XAiProvider = (0, import_react.forwardRef)(({
|
|
|
79
80
|
setMessages,
|
|
80
81
|
setCurrentSessionDetail
|
|
81
82
|
}), [appInfo, messages, chat, stopChat, reChat, setMessages, setCurrentSessionDetail]);
|
|
83
|
+
const [isNarrow, setIsNarrow] = (0, import_react.useState)(false);
|
|
84
|
+
const divRef = (0, import_react.useRef)(null);
|
|
85
|
+
(0, import_react.useEffect)(() => {
|
|
86
|
+
const div = divRef.current;
|
|
87
|
+
if (!div)
|
|
88
|
+
return;
|
|
89
|
+
const resizeObserver = new ResizeObserver((entries) => {
|
|
90
|
+
for (const entry of entries) {
|
|
91
|
+
const width = entry.contentRect.width;
|
|
92
|
+
setIsNarrow(width <= import_constants.MOBILE_MAX_WIDTH);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
resizeObserver.observe(div);
|
|
96
|
+
const initialWidth = div.offsetWidth;
|
|
97
|
+
setIsNarrow(initialWidth <= import_constants.MOBILE_MAX_WIDTH);
|
|
98
|
+
return () => {
|
|
99
|
+
resizeObserver.disconnect();
|
|
100
|
+
};
|
|
101
|
+
}, []);
|
|
82
102
|
const handleSendMessage = (_type, content) => {
|
|
83
103
|
chat(content);
|
|
84
104
|
};
|
|
@@ -143,7 +163,7 @@ var XAiProvider = (0, import_react.forwardRef)(({
|
|
|
143
163
|
confirm({
|
|
144
164
|
title: "编辑对话名称",
|
|
145
165
|
icon: null,
|
|
146
|
-
content: /* @__PURE__ */
|
|
166
|
+
content: /* @__PURE__ */ React.createElement(
|
|
147
167
|
import_antd.Input,
|
|
148
168
|
{
|
|
149
169
|
defaultValue: inputValue,
|
|
@@ -174,7 +194,7 @@ var XAiProvider = (0, import_react.forwardRef)(({
|
|
|
174
194
|
case "delete":
|
|
175
195
|
confirm({
|
|
176
196
|
title: "确认删除?",
|
|
177
|
-
icon: /* @__PURE__ */
|
|
197
|
+
icon: /* @__PURE__ */ React.createElement(import_icons.ExclamationCircleFilled, null),
|
|
178
198
|
content: "该对话内容将被删除无法恢复。",
|
|
179
199
|
okText: "确认删除",
|
|
180
200
|
okType: "danger",
|
|
@@ -199,15 +219,15 @@ var XAiProvider = (0, import_react.forwardRef)(({
|
|
|
199
219
|
const { cost, token: tokenCount } = finalResult.extra || {};
|
|
200
220
|
if (!cost && !token)
|
|
201
221
|
return null;
|
|
202
|
-
return /* @__PURE__ */
|
|
222
|
+
return /* @__PURE__ */ React.createElement("div", { style: { display: "flex", alignItems: "center", fontSize: "12px", color: "#949494", flex: 1, paddingRight: "40px" } }, cost !== void 0 && cost !== null && /* @__PURE__ */ React.createElement("div", null, cost, "s"), tokenCount && /* @__PURE__ */ React.createElement(import_antd.Divider, { type: "vertical" }), tokenCount && /* @__PURE__ */ React.createElement("div", null, tokenCount, " tokens"));
|
|
203
223
|
};
|
|
204
224
|
const clearBtnShow = typeof ((_a = config == null ? void 0 : config.chatProps) == null ? void 0 : _a.clearBtnShow) !== "undefined" ? config.chatProps.clearBtnShow : !((_b = config == null ? void 0 : config.session) == null ? void 0 : _b.showSessionList);
|
|
205
|
-
return /* @__PURE__ */
|
|
225
|
+
return /* @__PURE__ */ React.createElement(import_x.XProvider, null, /* @__PURE__ */ React.createElement(
|
|
206
226
|
import_AiProviderContext.XAiContext.Provider,
|
|
207
227
|
{
|
|
208
228
|
value: {
|
|
209
|
-
avatar: /* @__PURE__ */
|
|
210
|
-
userAvatar: /* @__PURE__ */
|
|
229
|
+
avatar: /* @__PURE__ */ React.createElement("img", { src: icon, alt: "智能体头像" }),
|
|
230
|
+
userAvatar: /* @__PURE__ */ React.createElement("img", { src: import_user.default, alt: "用户头像" }),
|
|
211
231
|
emptyStateImage: icon,
|
|
212
232
|
emptyStateText: appName,
|
|
213
233
|
footerTips: "内容由AI生成,无法确保真实准确,仅供参考",
|
|
@@ -220,6 +240,8 @@ var XAiProvider = (0, import_react.forwardRef)(({
|
|
|
220
240
|
error: null,
|
|
221
241
|
activeKey: currentSessionId,
|
|
222
242
|
clearBtnShow,
|
|
243
|
+
inputShow: ((_c = config == null ? void 0 : config.chatProps) == null ? void 0 : _c.inputShow) || true,
|
|
244
|
+
isNarrow,
|
|
223
245
|
messageTooltip: ToolTip,
|
|
224
246
|
onSend: handleSendMessage,
|
|
225
247
|
onClear: handleCreateNewMessage,
|
|
@@ -232,10 +254,18 @@ var XAiProvider = (0, import_react.forwardRef)(({
|
|
|
232
254
|
isInProvider: true
|
|
233
255
|
}
|
|
234
256
|
},
|
|
235
|
-
/* @__PURE__ */
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
257
|
+
/* @__PURE__ */ React.createElement(
|
|
258
|
+
"div",
|
|
259
|
+
{
|
|
260
|
+
ref: divRef,
|
|
261
|
+
style: {
|
|
262
|
+
display: "flex",
|
|
263
|
+
height: "100%",
|
|
264
|
+
position: "relative"
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
children
|
|
268
|
+
)
|
|
239
269
|
));
|
|
240
270
|
});
|
|
241
271
|
var XAiProvider_default = XAiProvider;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAiProvider/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
6
|
-
"names": ["useAgentGenerator", "copy", "
|
|
4
|
+
"sourcesContent": ["import { forwardRef, useImperativeHandle, useState, useRef, useEffect } from 'react';\nimport { message, Divider, Modal, Input } from 'antd';\nimport copy from 'copy-to-clipboard';\nimport { XProvider } from '@ant-design/x';\nimport type { ConversationsProps } from '@ant-design/x';\nimport { ExclamationCircleFilled } from '@ant-design/icons';\nimport { XAiContext } from '@/context/AiProviderContext';\nimport { XAiProviderProps, XAiProviderHandle } from '@/types/XAiProvider';\nimport useAgentGenerator from '@/hooks/useAgentGenerator';\nimport { MOBILE_MAX_WIDTH } from '@/constants';\nimport userIcon from '@/assets/user.png';\n\nconst { confirm } = Modal;\n\nconst XAiProvider = forwardRef<XAiProviderHandle, XAiProviderProps>(({\n url,\n token,\n config,\n providerId = 'defaultId',\n onSuccess,\n onError,\n onMessage,\n children,\n}, ref) => {\n // 使用 useAgentGenerator Hook 管理消息状态\n const {\n appInfo,\n chat,\n stopChat,\n reChat,\n createNewChat,\n deleteSession,\n updateSession,\n currentSessionId,\n sessionPagination,\n sessionList,\n messages,\n loading,\n setCurrentSessionDetail,\n setMessages\n } = useAgentGenerator({ url, token, config, onError, onSuccess, onMessage });\n\n const { appName, icon } = appInfo || {};\n\n useImperativeHandle(ref, () => ({\n chat,\n stopChat,\n reChat,\n getAppInfo: () => appInfo,\n getMessages: () => messages,\n getSessions: () => sessionList,\n setMessages,\n setCurrentSessionDetail,\n }), [appInfo, messages, chat, stopChat, reChat, setMessages, setCurrentSessionDetail]);\n\n const [isNarrow, setIsNarrow] = useState<boolean>(false);\n const divRef = useRef<HTMLDivElement>(null);\n\n // 监听容器宽度变化\n useEffect(() => {\n const div = divRef.current;\n if (!div) return;\n\n // 创建监听器\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const width = entry.contentRect.width;\n setIsNarrow(width <= MOBILE_MAX_WIDTH);\n }\n })\n\n // 开始监听\n resizeObserver.observe(div);\n\n // 初始化检查\n const initialWidth = div.offsetWidth;\n setIsNarrow(initialWidth <= MOBILE_MAX_WIDTH);\n\n // 清理函数\n return () => {\n resizeObserver.disconnect();\n }\n }, []);\n\n // 发送消息\n const handleSendMessage = (_type: string, content: string) => {\n chat(content);\n };\n\n // 清空消息\n const handleCreateNewMessage = () => {\n createNewChat();\n };\n \n // 工具栏按钮点击\n const handleActions = (index: number, actionData: any) => {\n const { content, id } = actionData || {};\n const { text = '' } = content;\n switch (index) {\n case 0:\n reChat();\n break;\n case 1:\n copy(text);\n message.success('复制成功');\n break;\n case 2: {\n const idx = messages.findIndex((item) => item.id === id);\n if (idx >= 0) {\n // 删除该条消息及建议类消息\n if (messages.length - idx <= 2) {\n setMessages((prev) => prev.filter((item) => item.id !== id && item.type !== 'SuggestionMessage'));\n } else {\n // 非最新消息 只删除该条消息\n setMessages((prev) => prev.filter((item) => item.id !== id));\n }\n message.success('删除成功');\n }\n break;\n }\n }\n };\n\n // 建议消息点击\n const handleSuggestMessageClick = (_item: any, id: string) => {\n setMessages((prev: any[]) => prev.filter((m: any) => m.id !== id));\n };\n\n // 切换会话\n const handleActiveChange = (key: string) => {\n setCurrentSessionDetail(key);\n };\n\n // 删除会话\n const handleDeleteSession = (sessionId: string) => {\n deleteSession(sessionId);\n };\n\n // 修改会话内容\n const handleUpdateSession = (sessionId: string, title: string) => {\n updateSession(sessionId, title);\n }\n\n // 会话操作菜单\n const menuConfig: ConversationsProps['menu'] = (conversation) => ({\n items: [\n {\n label: '重命名',\n key: 'edit',\n },\n {\n label: '删除',\n key: 'delete',\n danger: true,\n },\n ],\n onClick: (menuInfo) => {\n menuInfo.domEvent.stopPropagation();\n const { key } = menuInfo;\n switch (key) {\n case 'edit': {\n let inputValue = conversation.label as string || '';\n confirm({\n title: '编辑对话名称',\n icon: null,\n content: (\n <Input\n defaultValue={inputValue}\n autoFocus\n style={{ width: '100%' }}\n onChange={e => {\n inputValue = e.target.value;\n }}\n />\n ),\n okText: '确认',\n cancelText: '取消',\n okButtonProps: {\n style: { background: '#000', borderColor: '#000', color: '#fff' }\n },\n onOk: () => {\n if (!inputValue.trim()) {\n message.error('对话名称不能为空');\n return Promise.reject();\n }\n handleUpdateSession(conversation.key, inputValue);\n },\n onCancel: () => {\n // 静默处理\n },\n });\n break;\n }\n case 'delete':\n confirm({\n title: '确认删除?',\n icon: <ExclamationCircleFilled />,\n content: '该对话内容将被删除无法恢复。',\n okText: '确认删除',\n okType: 'danger',\n cancelText: '取消',\n okButtonProps: {\n style: { background: '#ff4d4f', borderColor: '#ff4d4f', color: '#fff' }\n },\n onOk() {\n handleDeleteSession(conversation.key);\n },\n onCancel() {\n //\n },\n });\n break;\n } \n },\n });\n\n const ToolTip = (messageData: any) => {\n const finalResult = (messageData?.think || []).find((item: any) => item.actionName === 'FINISHED');\n if (!finalResult) return null;\n const { cost, token: tokenCount } = finalResult.extra || {};\n if (!cost && !token) return null;\n return (\n <div style={{ display: 'flex', alignItems: 'center', fontSize: '12px', color: '#949494', flex: 1, paddingRight: '40px' }}>\n { (cost !== undefined && cost !== null) && <div>{cost}s</div> }\n { tokenCount && <Divider type=\"vertical\" /> }\n { tokenCount && <div>{ tokenCount } tokens</div> }\n </div>\n );\n };\n // 是否展示清空按钮\n const clearBtnShow = typeof config?.chatProps?.clearBtnShow !== 'undefined'\n ? config.chatProps.clearBtnShow\n : !config?.session?.showSessionList;\n \n\n return (\n <XProvider>\n <XAiContext.Provider value={{\n avatar: <img src={icon} alt=\"智能体头像\" />,\n userAvatar: <img src={userIcon} alt=\"用户头像\" />,\n emptyStateImage: icon,\n emptyStateText: appName,\n footerTips: '内容由AI生成,无法确保真实准确,仅供参考',\n providerId,\n sessionList,\n sessionTotal: sessionPagination.total, \n token,\n messages,\n loading,\n error: null,\n activeKey: currentSessionId,\n clearBtnShow,\n inputShow: config?.chatProps?.inputShow || true,\n isNarrow,\n messageTooltip: ToolTip,\n onSend: handleSendMessage,\n onClear: handleCreateNewMessage,\n onNewChat: handleCreateNewMessage,\n onStop: stopChat,\n menu: menuConfig,\n onActiveChange: handleActiveChange,\n onSuggestMessageClick: handleSuggestMessageClick,\n onMessagesActionsCallback: handleActions,\n isInProvider: true,\n }}\n >\n <div\n ref={divRef}\n style={{\n display: 'flex',\n height: '100%',\n position: 'relative',\n }}>\n {children}\n </div>\n </XAiContext.Provider>\n </XProvider>\n );\n});\n\nexport default XAiProvider;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA6E;AAC7E,kBAA+C;AAC/C,+BAAiB;AACjB,eAA0B;AAE1B,mBAAwC;AACxC,+BAA2B;AAE3B,+BAA8B;AAC9B,uBAAiC;AACjC,kBAAqB;AAErB,IAAM,EAAE,QAAQ,IAAI;AAEpB,IAAM,kBAAc,yBAAgD,CAAC;AAAA,EACnE;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG,QAAQ;AAvBX;AAyBE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,yBAAAA,SAAkB,EAAE,KAAK,OAAO,QAAQ,SAAS,WAAW,UAAU,CAAC;AAE3E,QAAM,EAAE,SAAS,KAAK,IAAI,WAAW,CAAC;AAEtC,wCAAoB,KAAK,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,MAAM;AAAA,IAClB,aAAa,MAAM;AAAA,IACnB,aAAa,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,EACF,IAAI,CAAC,SAAS,UAAU,MAAM,UAAU,QAAQ,aAAa,uBAAuB,CAAC;AAErF,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAkB,KAAK;AACvD,QAAM,aAAS,qBAAuB,IAAI;AAG1C,8BAAU,MAAM;AACd,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC;AAAK;AAGV,UAAM,iBAAiB,IAAI,eAAe,CAAC,YAAY;AACrD,iBAAW,SAAS,SAAS;AAC3B,cAAM,QAAQ,MAAM,YAAY;AAChC,oBAAY,SAAS,iCAAgB;AAAA,MACvC;AAAA,IACF,CAAC;AAGD,mBAAe,QAAQ,GAAG;AAG1B,UAAM,eAAe,IAAI;AACzB,gBAAY,gBAAgB,iCAAgB;AAG5C,WAAO,MAAM;AACX,qBAAe,WAAW;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,oBAAoB,CAAC,OAAe,YAAoB;AAC5D,SAAK,OAAO;AAAA,EACd;AAGA,QAAM,yBAAyB,MAAM;AACnC,kBAAc;AAAA,EAChB;AAGA,QAAM,gBAAgB,CAAC,OAAe,eAAoB;AACxD,UAAM,EAAE,SAAS,GAAG,IAAI,cAAc,CAAC;AACvC,UAAM,EAAE,OAAO,GAAG,IAAI;AACtB,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,qCAAAC,SAAK,IAAI;AACT,4BAAQ,QAAQ,MAAM;AACtB;AAAA,MACF,KAAK,GAAG;AACN,cAAM,MAAM,SAAS,UAAU,CAAC,SAAS,KAAK,OAAO,EAAE;AACvD,YAAI,OAAO,GAAG;AAEZ,cAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,wBAAY,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,KAAK,OAAO,MAAM,KAAK,SAAS,mBAAmB,CAAC;AAAA,UAClG,OAAO;AAEL,wBAAY,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;AAAA,UAC7D;AACA,8BAAQ,QAAQ,MAAM;AAAA,QACxB;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,4BAA4B,CAAC,OAAY,OAAe;AAC5D,gBAAY,CAAC,SAAgB,KAAK,OAAO,CAAC,MAAW,EAAE,OAAO,EAAE,CAAC;AAAA,EACnE;AAGA,QAAM,qBAAqB,CAAC,QAAgB;AAC1C,4BAAwB,GAAG;AAAA,EAC7B;AAGA,QAAM,sBAAsB,CAAC,cAAsB;AACjD,kBAAc,SAAS;AAAA,EACzB;AAGA,QAAM,sBAAsB,CAAC,WAAmB,UAAkB;AAChE,kBAAc,WAAW,KAAK;AAAA,EAChC;AAGA,QAAM,aAAyC,CAAC,kBAAkB;AAAA,IAChE,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,SAAS,CAAC,aAAa;AACrB,eAAS,SAAS,gBAAgB;AAClC,YAAM,EAAE,IAAI,IAAI;AAChB,cAAQ,KAAK;AAAA,QACX,KAAK,QAAQ;AACX,cAAI,aAAa,aAAa,SAAmB;AACjD,kBAAQ;AAAA,YACN,OAAO;AAAA,YACP,MAAM;AAAA,YACN,SACE;AAAA,cAAC;AAAA;AAAA,gBACC,cAAc;AAAA,gBACd,WAAS;AAAA,gBACT,OAAO,EAAE,OAAO,OAAO;AAAA,gBACvB,UAAU,OAAK;AACb,+BAAa,EAAE,OAAO;AAAA,gBACxB;AAAA;AAAA,YACF;AAAA,YAEF,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,eAAe;AAAA,cACb,OAAO,EAAE,YAAY,QAAQ,aAAa,QAAQ,OAAO,OAAO;AAAA,YAClE;AAAA,YACA,MAAM,MAAM;AACV,kBAAI,CAAC,WAAW,KAAK,GAAG;AACtB,oCAAQ,MAAM,UAAU;AACxB,uBAAO,QAAQ,OAAO;AAAA,cACxB;AACA,kCAAoB,aAAa,KAAK,UAAU;AAAA,YAClD;AAAA,YACA,UAAU,MAAM;AAAA,YAEhB;AAAA,UACF,CAAC;AACD;AAAA,QACF;AAAA,QACA,KAAK;AACH,kBAAQ;AAAA,YACN,OAAO;AAAA,YACP,MAAM,oCAAC,0CAAwB;AAAA,YAC/B,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,eAAe;AAAA,cACb,OAAO,EAAE,YAAY,WAAW,aAAa,WAAW,OAAO,OAAO;AAAA,YACxE;AAAA,YACA,OAAO;AACL,kCAAoB,aAAa,GAAG;AAAA,YACtC;AAAA,YACA,WAAW;AAAA,YAEX;AAAA,UACF,CAAC;AACD;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,gBAAqB;AACpC,UAAM,gBAAe,2CAAa,UAAS,CAAC,GAAG,KAAK,CAAC,SAAc,KAAK,eAAe,UAAU;AACjG,QAAI,CAAC;AAAa,aAAO;AACzB,UAAM,EAAE,MAAM,OAAO,WAAW,IAAI,YAAY,SAAS,CAAC;AAC1D,QAAI,CAAC,QAAQ,CAAC;AAAO,aAAO;AAC5B,WACE,oCAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,UAAU,QAAQ,OAAO,WAAW,MAAM,GAAG,cAAc,OAAO,KAClH,SAAS,UAAa,SAAS,QAAS,oCAAC,aAAK,MAAK,GAAC,GACrD,cAAc,oCAAC,uBAAQ,MAAK,YAAW,GACvC,cAAc,oCAAC,aAAM,YAAY,SAAO,CAC5C;AAAA,EAEJ;AAEA,QAAM,eAAe,SAAO,sCAAQ,cAAR,mBAAmB,kBAAiB,cAC5D,OAAO,UAAU,eACjB,GAAC,sCAAQ,YAAR,mBAAiB;AAGtB,SACE,oCAAC,0BACC;AAAA,IAAC,oCAAW;AAAA,IAAX;AAAA,MAAoB,OAAO;AAAA,QAC1B,QAAQ,oCAAC,SAAI,KAAK,MAAM,KAAI,SAAQ;AAAA,QACpC,YAAY,oCAAC,SAAI,KAAK,YAAAC,SAAU,KAAI,QAAO;AAAA,QAC3C,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,cAAc,kBAAkB;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,WAAW;AAAA,QACX;AAAA,QACA,aAAW,sCAAQ,cAAR,mBAAmB,cAAa;AAAA,QAC3C;AAAA,QACA,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,uBAAuB;AAAA,QACvB,2BAA2B;AAAA,QAC3B,cAAc;AAAA,MAChB;AAAA;AAAA,IAEE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ;AAAA;AAAA,MACG;AAAA,IACH;AAAA,EACF,CACF;AAEJ,CAAC;AAED,IAAO,sBAAQ;",
|
|
6
|
+
"names": ["useAgentGenerator", "copy", "userIcon"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
|
|
29
|
+
// src/components/XAiSender/XAiSender.stories.tsx
|
|
30
|
+
var XAiSender_stories_exports = {};
|
|
31
|
+
__export(XAiSender_stories_exports, {
|
|
32
|
+
default: () => XAiSender_stories_default,
|
|
33
|
+
基础用法: () => 基础用法
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(XAiSender_stories_exports);
|
|
36
|
+
var import_react = require("react");
|
|
37
|
+
var import__ = __toESM(require("."));
|
|
38
|
+
var meta = {
|
|
39
|
+
title: "AI组件/XAiSender 输入框",
|
|
40
|
+
component: import__.default,
|
|
41
|
+
parameters: {
|
|
42
|
+
layout: "centered"
|
|
43
|
+
},
|
|
44
|
+
tags: ["autodocs"],
|
|
45
|
+
argTypes: {}
|
|
46
|
+
};
|
|
47
|
+
var XAiSender_stories_default = meta;
|
|
48
|
+
var BasicUsageStory = (args) => {
|
|
49
|
+
const [content, setContent] = (0, import_react.useState)("");
|
|
50
|
+
const [loading, setLoading] = (0, import_react.useState)(false);
|
|
51
|
+
const handleClear = () => {
|
|
52
|
+
console.log("clear");
|
|
53
|
+
};
|
|
54
|
+
const handleChange = (content2) => {
|
|
55
|
+
setContent(content2);
|
|
56
|
+
};
|
|
57
|
+
const handleSendMessage = (type, content2) => {
|
|
58
|
+
setLoading(true);
|
|
59
|
+
console.log(type, content2);
|
|
60
|
+
setTimeout(() => {
|
|
61
|
+
setContent("");
|
|
62
|
+
setLoading(false);
|
|
63
|
+
}, 2e3);
|
|
64
|
+
};
|
|
65
|
+
return /* @__PURE__ */ React.createElement("div", { style: { width: 440, border: "1px solid #eee", padding: 20 } }, /* @__PURE__ */ React.createElement(
|
|
66
|
+
import__.default,
|
|
67
|
+
{
|
|
68
|
+
loading,
|
|
69
|
+
value: content,
|
|
70
|
+
onClear: handleClear,
|
|
71
|
+
onChange: handleChange,
|
|
72
|
+
onSubmit: handleSendMessage,
|
|
73
|
+
onStop: handleClear,
|
|
74
|
+
footerTips: "内容由AI生成,无法确保真实准确,仅供参考"
|
|
75
|
+
}
|
|
76
|
+
));
|
|
77
|
+
};
|
|
78
|
+
var 基础用法 = {
|
|
79
|
+
render: BasicUsageStory,
|
|
80
|
+
args: {}
|
|
81
|
+
};
|
|
82
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
83
|
+
0 && (module.exports = {
|
|
84
|
+
基础用法
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=XAiSender.stories.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/XAiSender/XAiSender.stories.tsx"],
|
|
4
|
+
"sourcesContent": ["import { useState } from 'react';\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport XAiSender from '.';\n\nconst meta: Meta<typeof XAiSender> = {\n title: 'AI组件/XAiSender 输入框',\n component: XAiSender,\n parameters: {\n layout: 'centered',\n },\n tags: ['autodocs'],\n argTypes: {},\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// 基础用法\nconst BasicUsageStory = (args: any) => {\n const [content, setContent] = useState('');\n const [loading, setLoading] = useState(false);\n\n // 模拟清空数据\n const handleClear = () => {\n console.log('clear');\n };\n\n // 模拟输入\n const handleChange = (content: string) => {\n setContent(content);\n }\n\n // 模拟快捷短语点击\n const handleSendMessage = (type: string, content: any) => {\n setLoading(true);\n console.log(type, content);\n setTimeout(() => {\n setContent('');\n setLoading(false);\n }, 2000);\n };\n\n\n return (\n <div style={{ width: 440, border: '1px solid #eee', padding: 20 }}>\n <XAiSender\n loading={loading}\n value={content}\n onClear={handleClear}\n onChange={handleChange}\n onSubmit={handleSendMessage}\n onStop={handleClear}\n footerTips='内容由AI生成,无法确保真实准确,仅供参考'\n />\n </div>\n );\n};\n\nexport const 基础用法: Story = {\n render: BasicUsageStory,\n args: {},\n};"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAyB;AAEzB,eAAsB;AAEtB,IAAM,OAA+B;AAAA,EACnC,OAAO;AAAA,EACP,WAAW,SAAAA;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,CAAC,UAAU;AAAA,EACjB,UAAU,CAAC;AACb;AAEA,IAAO,4BAAQ;AAIf,IAAM,kBAAkB,CAAC,SAAc;AACrC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,EAAE;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAG5C,QAAM,cAAc,MAAM;AACxB,YAAQ,IAAI,OAAO;AAAA,EACrB;AAGA,QAAM,eAAe,CAACC,aAAoB;AACxC,eAAWA,QAAO;AAAA,EACpB;AAGA,QAAM,oBAAoB,CAAC,MAAcA,aAAiB;AACxD,eAAW,IAAI;AACf,YAAQ,IAAI,MAAMA,QAAO;AACzB,eAAW,MAAM;AACf,iBAAW,EAAE;AACb,iBAAW,KAAK;AAAA,IAClB,GAAG,GAAI;AAAA,EACT;AAGA,SACE,oCAAC,SAAI,OAAO,EAAE,OAAO,KAAK,QAAQ,kBAAkB,SAAS,GAAG,KAC9D;AAAA,IAAC,SAAAD;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAW;AAAA;AAAA,EACb,CACF;AAEJ;AAEO,IAAM,OAAc;AAAA,EACzB,QAAQ;AAAA,EACR,MAAM,CAAC;AACT;",
|
|
6
|
+
"names": ["XAiSender", "content"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
|
|
29
|
+
// src/components/XAiSender/index.tsx
|
|
30
|
+
var XAiSender_exports = {};
|
|
31
|
+
__export(XAiSender_exports, {
|
|
32
|
+
default: () => XAiSender_default
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(XAiSender_exports);
|
|
35
|
+
var import_react = __toESM(require("react"));
|
|
36
|
+
var import_x = require("@ant-design/x");
|
|
37
|
+
var import_antd = require("antd");
|
|
38
|
+
var import_icons = require("@ant-design/icons");
|
|
39
|
+
var import_useProviderContext = require("../../hooks/useProviderContext");
|
|
40
|
+
var import_clsx = __toESM(require("clsx"));
|
|
41
|
+
var import_styles = require("./styles");
|
|
42
|
+
var XAiSender = (props) => {
|
|
43
|
+
const { mergedProps } = (0, import_useProviderContext.useChatbotContext)(props);
|
|
44
|
+
const {
|
|
45
|
+
footerTips,
|
|
46
|
+
clearBtnShow,
|
|
47
|
+
value,
|
|
48
|
+
onSend,
|
|
49
|
+
onChange,
|
|
50
|
+
onClear,
|
|
51
|
+
onStop,
|
|
52
|
+
onSubmit,
|
|
53
|
+
loading: propLoading = false,
|
|
54
|
+
...resetProps
|
|
55
|
+
} = mergedProps;
|
|
56
|
+
const loading = mergedProps.loading || propLoading;
|
|
57
|
+
const [disabled, _setDisabled] = (0, import_react.useState)(false);
|
|
58
|
+
const [mode, _setMode] = (0, import_react.useState)("");
|
|
59
|
+
const [fileUploading, setFileUploading] = (0, import_react.useState)(false);
|
|
60
|
+
const [clearPopoverVisible, setClearPopoverVisible] = (0, import_react.useState)(false);
|
|
61
|
+
const styles = (0, import_styles.useStyles)();
|
|
62
|
+
const handleSend = () => {
|
|
63
|
+
if (value.trim()) {
|
|
64
|
+
onSubmit == null ? void 0 : onSubmit("text", value);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const fileInputRef = (0, import_react.useRef)(null);
|
|
68
|
+
const handleFileSelect = () => {
|
|
69
|
+
};
|
|
70
|
+
const handleClear = () => {
|
|
71
|
+
setClearPopoverVisible(true);
|
|
72
|
+
};
|
|
73
|
+
const cancelClear = () => {
|
|
74
|
+
setClearPopoverVisible(false);
|
|
75
|
+
};
|
|
76
|
+
const confirmClear = () => {
|
|
77
|
+
onClear == null ? void 0 : onClear();
|
|
78
|
+
setClearPopoverVisible(false);
|
|
79
|
+
};
|
|
80
|
+
const clearConfirmContent = /* @__PURE__ */ import_react.default.createElement("div", { className: styles.p("2px") }, /* @__PURE__ */ import_react.default.createElement("p", { className: (0, import_clsx.default)(styles.mb(14), styles.mt(0)) }, "确认清除所有聊天记录并重置会话!"), /* @__PURE__ */ import_react.default.createElement("div", { className: styles.popoverFooter }, /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { size: "small", onClick: cancelClear }, "取消"), /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { size: "small", type: "primary", danger: true, onClick: confirmClear }, "确认")));
|
|
81
|
+
const uploadButton = /* @__PURE__ */ import_react.default.createElement("div", { className: styles.flexCenterGap2 }, /* @__PURE__ */ import_react.default.createElement(
|
|
82
|
+
import_antd.Tooltip,
|
|
83
|
+
{
|
|
84
|
+
placement: "top",
|
|
85
|
+
title: mode === "single_agent_skill_mode" ? "工作流模式不支持上传文件" : "支持图片、文档等上传"
|
|
86
|
+
},
|
|
87
|
+
fileUploading ? /* @__PURE__ */ import_react.default.createElement(import_antd.Spin, { size: "small" }) : /* @__PURE__ */ import_react.default.createElement(
|
|
88
|
+
"i",
|
|
89
|
+
{
|
|
90
|
+
className: mode === "single_agent_skill_mode" ? styles.iconZengjiaDisabled : styles.iconZengjiaNormal,
|
|
91
|
+
onClick: () => {
|
|
92
|
+
var _a;
|
|
93
|
+
if (mode !== "single_agent_skill_mode" && fileInputRef.current) {
|
|
94
|
+
(_a = fileInputRef.current) == null ? void 0 : _a.click();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
/* @__PURE__ */ import_react.default.createElement(
|
|
100
|
+
"input",
|
|
101
|
+
{
|
|
102
|
+
type: "file",
|
|
103
|
+
ref: fileInputRef,
|
|
104
|
+
onChange: handleFileSelect,
|
|
105
|
+
style: { display: "none" },
|
|
106
|
+
accept: "*/*",
|
|
107
|
+
disabled: fileUploading || mode === "single_agent_skill_mode"
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
));
|
|
111
|
+
return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: styles.chatFooter }, /* @__PURE__ */ import_react.default.createElement("div", { className: (0, import_clsx.default)(styles.flex, styles.gap(8)) }, clearBtnShow && /* @__PURE__ */ import_react.default.createElement(
|
|
112
|
+
import_antd.Popover,
|
|
113
|
+
{
|
|
114
|
+
content: clearConfirmContent,
|
|
115
|
+
title: "确认清空对话",
|
|
116
|
+
trigger: "click",
|
|
117
|
+
open: clearPopoverVisible,
|
|
118
|
+
onOpenChange: setClearPopoverVisible
|
|
119
|
+
},
|
|
120
|
+
/* @__PURE__ */ import_react.default.createElement(
|
|
121
|
+
"div",
|
|
122
|
+
{
|
|
123
|
+
className: styles.clearBtn,
|
|
124
|
+
style: { border: "1px solid #E4E7EC", borderRadius: "50%", height: "35px", width: "35px" },
|
|
125
|
+
onClick: handleClear
|
|
126
|
+
},
|
|
127
|
+
/* @__PURE__ */ import_react.default.createElement(import_icons.ClearOutlined, { className: styles.text(16) })
|
|
128
|
+
)
|
|
129
|
+
), /* @__PURE__ */ import_react.default.createElement(
|
|
130
|
+
import_x.Sender,
|
|
131
|
+
{
|
|
132
|
+
...resetProps,
|
|
133
|
+
value,
|
|
134
|
+
className: styles.sendWrapper,
|
|
135
|
+
placeholder: "继续对话...",
|
|
136
|
+
disabled,
|
|
137
|
+
loading,
|
|
138
|
+
actions: (_, info) => {
|
|
139
|
+
const { SendButton, LoadingButton } = info.components;
|
|
140
|
+
return /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { size: "small" }, /* @__PURE__ */ import_react.default.createElement("div", { className: styles.w(20) }), mode !== "single_agent_skill_mode" && uploadButton, mode === "meta_agent_mode" && /* @__PURE__ */ import_react.default.createElement(
|
|
141
|
+
"div",
|
|
142
|
+
{
|
|
143
|
+
className: styles.flexCenterGap2,
|
|
144
|
+
style: { visibility: "hidden" }
|
|
145
|
+
},
|
|
146
|
+
/* @__PURE__ */ import_react.default.createElement("i", { className: styles.iconHuihuarenqun })
|
|
147
|
+
), /* @__PURE__ */ import_react.default.createElement("div", { className: styles.divider }), loading ? /* @__PURE__ */ import_react.default.createElement(LoadingButton, { onClick: () => onStop == null ? void 0 : onStop(), className: styles.stopButton }) : /* @__PURE__ */ import_react.default.createElement(
|
|
148
|
+
SendButton,
|
|
149
|
+
{
|
|
150
|
+
className: styles.sendButton,
|
|
151
|
+
type: "primary",
|
|
152
|
+
icon: /* @__PURE__ */ import_react.default.createElement(import_icons.ArrowUpOutlined, { className: styles.text(20) }),
|
|
153
|
+
disabled
|
|
154
|
+
}
|
|
155
|
+
));
|
|
156
|
+
},
|
|
157
|
+
onChange: (v) => {
|
|
158
|
+
onChange == null ? void 0 : onChange(v);
|
|
159
|
+
},
|
|
160
|
+
onSubmit: handleSend,
|
|
161
|
+
onCancel: () => {
|
|
162
|
+
onStop == null ? void 0 : onStop();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
))), footerTips && /* @__PURE__ */ import_react.default.createElement("div", { className: styles.footerTips }, footerTips));
|
|
166
|
+
};
|
|
167
|
+
var XAiSender_default = XAiSender;
|
|
168
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/XAiSender/index.tsx"],
|
|
4
|
+
"sourcesContent": ["// 文件: components/XAiSender/index.tsx\nimport React, {\n useRef,\n useState,\n} from 'react';\nimport {\n Sender,\n} from '@ant-design/x';\nimport {\n Button,\n Popover,\n Space,\n Tooltip,\n Spin,\n} from 'antd';\nimport {\n ArrowUpOutlined,\n ClearOutlined,\n} from '@ant-design/icons';\nimport {\n XAiSenderProps\n} from '@/types';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport clsx from 'clsx';\nimport { useStyles } from './styles';\n\nconst XAiSender: React.FC<XAiSenderProps> = (props) => {\n // 使用新的 Hook 来处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n\n const {\n footerTips,\n clearBtnShow,\n value,\n onSend,\n onChange,\n onClear,\n onStop,\n onSubmit,\n loading: propLoading = false,\n ...resetProps\n } = mergedProps;\n\n // 如果在 Provider 中,使用 Provider 的状态\n const loading = mergedProps.loading || propLoading;\n\n const [disabled, _setDisabled] = useState<boolean>(false); // 是否禁止输入\n const [mode, _setMode] = useState<string>(''); // todo 模式\n const [fileUploading, setFileUploading] = useState(false); // 文件上传进度条\n const [clearPopoverVisible, setClearPopoverVisible] = useState(false); // 气泡卡片显隐藏\n const styles = useStyles();\n\n // 触发发送\n const handleSend = () => {\n if (value.trim()) {\n // 直接使用合并后的 onSend,自动处理 Provider 和独立模式\n onSubmit?.('text', value);\n }\n };\n\n // 文件上传按钮引用\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // 选择文件\n const handleFileSelect = () => {};\n\n // 点击清除按钮\n const handleClear = () => {\n setClearPopoverVisible(true);\n };\n\n // 取消清除\n const cancelClear = () => {\n setClearPopoverVisible(false);\n };\n\n // 确认清除\n const confirmClear = () => {\n onClear?.();\n setClearPopoverVisible(false);\n };\n\n // 清空按钮提示文案\n const clearConfirmContent = (\n <div className={styles.p('2px')}>\n <p className={clsx(styles.mb(14), styles.mt(0))}>确认清除所有聊天记录并重置会话!</p>\n <div className={styles.popoverFooter}>\n <Button size=\"small\" onClick={cancelClear}>\n 取消\n </Button>\n <Button size=\"small\" type=\"primary\" danger onClick={confirmClear}>\n 确认\n </Button>\n </div>\n </div>\n );\n\n // 自定义上传按钮\n const uploadButton = (\n <div className={styles.flexCenterGap2}>\n <Tooltip\n placement=\"top\"\n title={\n mode === 'single_agent_skill_mode' ? '工作流模式不支持上传文件' : '支持图片、文档等上传'\n }\n >\n {fileUploading\n ? (\n <Spin size=\"small\" />\n )\n : (\n <i\n className={\n mode === 'single_agent_skill_mode'\n ? styles.iconZengjiaDisabled\n : styles.iconZengjiaNormal\n }\n onClick={() => {\n if (mode !== 'single_agent_skill_mode' && fileInputRef.current) {\n fileInputRef.current?.click();\n }\n }}\n />\n )}\n <input\n type=\"file\"\n ref={fileInputRef}\n onChange={handleFileSelect}\n style={{ display: 'none' }}\n accept=\"*/*\"\n disabled={fileUploading || mode === 'single_agent_skill_mode'}\n />\n </Tooltip>\n </div>\n );\n\n return (\n <>\n <div className={styles.chatFooter}>\n <div className={clsx(styles.flex, styles.gap(8))}>\n {/* 清空按钮 */}\n { clearBtnShow && <Popover\n content={clearConfirmContent}\n title=\"确认清空对话\"\n trigger=\"click\"\n open={clearPopoverVisible}\n onOpenChange={setClearPopoverVisible}\n >\n <div\n className={styles.clearBtn}\n style={{ border: '1px solid #E4E7EC', borderRadius: '50%', height: '35px', width: '35px' }}\n onClick={handleClear}\n >\n <ClearOutlined className={styles.text(16)} />\n </div>\n </Popover> }\n {/* 普通文本输入 */}\n <Sender\n {...resetProps}\n value={value}\n className={styles.sendWrapper}\n placeholder=\"继续对话...\"\n disabled={disabled}\n loading={loading}\n actions={(_, info) => {\n const { SendButton, LoadingButton } = info.components;\n return (\n <Space size=\"small\">\n <div className={styles.w(20)} />\n\n {mode !== 'single_agent_skill_mode' && uploadButton}\n {mode === 'meta_agent_mode' && (\n <div\n className={styles.flexCenterGap2}\n style={{ visibility: 'hidden' }}\n >\n <i className={styles.iconHuihuarenqun} />\n </div>\n )}\n\n <div className={styles.divider} />\n\n {loading\n ? (\n <LoadingButton onClick={() => onStop?.()} className={styles.stopButton} />\n )\n : (\n <SendButton\n className={styles.sendButton}\n type=\"primary\"\n icon={<ArrowUpOutlined className={styles.text(20)} />}\n disabled={disabled}\n />\n )}\n </Space>\n );\n }}\n onChange={(v) => {\n onChange?.(v);\n }}\n onSubmit={handleSend}\n onCancel={() => {\n onStop?.();\n }}\n />\n </div>\n </div>\n { footerTips && <div className={styles.footerTips}>{footerTips}</div>}\n </>\n );\n};\n\nexport default XAiSender;"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAGO;AACP,eAEO;AACP,kBAMO;AACP,mBAGO;AAIP,gCAAkC;AAClC,kBAAiB;AACjB,oBAA0B;AAE1B,IAAM,YAAsC,CAAC,UAAU;AAErD,QAAM,EAAE,YAAY,QAAI,6CAAkB,KAAK;AAE/C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,cAAc;AAAA,IACvB,GAAG;AAAA,EACL,IAAI;AAGJ,QAAM,UAAU,YAAY,WAAW;AAEvC,QAAM,CAAC,UAAU,YAAY,QAAI,uBAAkB,KAAK;AACxD,QAAM,CAAC,MAAM,QAAQ,QAAI,uBAAiB,EAAE;AAC5C,QAAM,CAAC,eAAe,gBAAgB,QAAI,uBAAS,KAAK;AACxD,QAAM,CAAC,qBAAqB,sBAAsB,QAAI,uBAAS,KAAK;AACpE,QAAM,aAAS,yBAAU;AAGzB,QAAM,aAAa,MAAM;AACvB,QAAI,MAAM,KAAK,GAAG;AAEhB,2CAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AAGA,QAAM,mBAAe,qBAAyB,IAAI;AAGlD,QAAM,mBAAmB,MAAM;AAAA,EAAC;AAGhC,QAAM,cAAc,MAAM;AACxB,2BAAuB,IAAI;AAAA,EAC7B;AAGA,QAAM,cAAc,MAAM;AACxB,2BAAuB,KAAK;AAAA,EAC9B;AAGA,QAAM,eAAe,MAAM;AACzB;AACA,2BAAuB,KAAK;AAAA,EAC9B;AAGA,QAAM,sBACJ,6BAAAA,QAAA,cAAC,SAAI,WAAW,OAAO,EAAE,KAAK,KAC5B,6BAAAA,QAAA,cAAC,OAAE,eAAW,YAAAC,SAAK,OAAO,GAAG,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,KAAG,kBAAgB,GACjE,6BAAAD,QAAA,cAAC,SAAI,WAAW,OAAO,iBACrB,6BAAAA,QAAA,cAAC,sBAAO,MAAK,SAAQ,SAAS,eAAa,IAE3C,GACA,6BAAAA,QAAA,cAAC,sBAAO,MAAK,SAAQ,MAAK,WAAU,QAAM,MAAC,SAAS,gBAAc,IAElE,CACF,CACF;AAIF,QAAM,eACJ,6BAAAA,QAAA,cAAC,SAAI,WAAW,OAAO,kBACrB,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OACE,SAAS,4BAA4B,iBAAiB;AAAA;AAAA,IAGvD,gBAEG,6BAAAA,QAAA,cAAC,oBAAK,MAAK,SAAQ,IAGnB,6BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WACE,SAAS,4BACL,OAAO,sBACP,OAAO;AAAA,QAEb,SAAS,MAAM;AArH7B;AAsHgB,cAAI,SAAS,6BAA6B,aAAa,SAAS;AAC9D,+BAAa,YAAb,mBAAsB;AAAA,UACxB;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEJ,6BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO,EAAE,SAAS,OAAO;AAAA,QACzB,QAAO;AAAA,QACP,UAAU,iBAAiB,SAAS;AAAA;AAAA,IACtC;AAAA,EACF,CACF;AAGF,SACE,6BAAAA,QAAA,2BAAAA,QAAA,gBACE,6BAAAA,QAAA,cAAC,SAAI,WAAW,OAAO,cACrB,6BAAAA,QAAA,cAAC,SAAI,eAAW,YAAAC,SAAK,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,KAE3C,gBAAgB,6BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACjB,SAAS;AAAA,MACT,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAM;AAAA,MACN,cAAc;AAAA;AAAA,IAEd,6BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,OAAO;AAAA,QAClB,OAAO,EAAE,QAAQ,qBAAqB,cAAc,OAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,QACzF,SAAS;AAAA;AAAA,MAET,6BAAAA,QAAA,cAAC,8BAAc,WAAW,OAAO,KAAK,EAAE,GAAG;AAAA,IAC7C;AAAA,EACF,GAEA,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,aAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,SAAS,CAAC,GAAG,SAAS;AACpB,cAAM,EAAE,YAAY,cAAc,IAAI,KAAK;AAC3C,eACE,6BAAAA,QAAA,cAAC,qBAAM,MAAK,WACV,6BAAAA,QAAA,cAAC,SAAI,WAAW,OAAO,EAAE,EAAE,GAAG,GAE7B,SAAS,6BAA6B,cACtC,SAAS,qBACR,6BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,OAAO;AAAA,YAClB,OAAO,EAAE,YAAY,SAAS;AAAA;AAAA,UAE9B,6BAAAA,QAAA,cAAC,OAAE,WAAW,OAAO,kBAAkB;AAAA,QACzC,GAGF,6BAAAA,QAAA,cAAC,SAAI,WAAW,OAAO,SAAS,GAE/B,UAEG,6BAAAA,QAAA,cAAC,iBAAc,SAAS,MAAM,oCAAY,WAAW,OAAO,YAAY,IAGxE,6BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,OAAO;AAAA,YAClB,MAAK;AAAA,YACL,MAAM,6BAAAA,QAAA,cAAC,gCAAgB,WAAW,OAAO,KAAK,EAAE,GAAG;AAAA,YACnD;AAAA;AAAA,QACF,CAEN;AAAA,MAEJ;AAAA,MACA,UAAU,CAAC,MAAM;AACf,6CAAW;AAAA,MACb;AAAA,MACA,UAAU;AAAA,MACV,UAAU,MAAM;AACd;AAAA,MACF;AAAA;AAAA,EACF,CACF,CACF,GACE,cAAc,6BAAAA,QAAA,cAAC,SAAI,WAAW,OAAO,cAAa,UAAW,CACjE;AAEJ;AAEA,IAAO,oBAAQ;",
|
|
6
|
+
"names": ["React", "clsx"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare const useStyles: () => {
|
|
2
|
+
chatFooter: string;
|
|
3
|
+
footerTips: string;
|
|
4
|
+
popoverFooter: string;
|
|
5
|
+
sendButton: string;
|
|
6
|
+
uploadBtn: string;
|
|
7
|
+
clearBtn: string;
|
|
8
|
+
stopButton: string;
|
|
9
|
+
divider: string;
|
|
10
|
+
sendWrapper: string;
|
|
11
|
+
iconHuihuarenqun: string;
|
|
12
|
+
iconZengjiaDisabled: string;
|
|
13
|
+
iconZengjiaNormal: string;
|
|
14
|
+
} & {
|
|
15
|
+
w: (width: string | number) => string;
|
|
16
|
+
h: (height: string | number) => string;
|
|
17
|
+
p: (padding: string) => string;
|
|
18
|
+
pb: (padding: string | number) => string;
|
|
19
|
+
pt: (padding: string | number) => string;
|
|
20
|
+
pl: (padding: string | number) => string;
|
|
21
|
+
pr: (padding: string | number) => string;
|
|
22
|
+
m: (margin: string) => string;
|
|
23
|
+
mb: (margin: string | number) => string;
|
|
24
|
+
mt: (margin: string | number) => string;
|
|
25
|
+
ml: (margin: string | number) => string;
|
|
26
|
+
mr: (margin: string | number) => string;
|
|
27
|
+
text: (size: string | number) => string;
|
|
28
|
+
weight: (size: number) => string;
|
|
29
|
+
textColor: (c: string) => string;
|
|
30
|
+
bg: (c: string) => string;
|
|
31
|
+
rs: (radius: string | number) => string;
|
|
32
|
+
gap: (g: string | number) => string;
|
|
33
|
+
flex: string;
|
|
34
|
+
flexCenter: string;
|
|
35
|
+
flexBetween: string;
|
|
36
|
+
flexColumn: string;
|
|
37
|
+
flex1: string;
|
|
38
|
+
cursor: (type: string) => string;
|
|
39
|
+
border: (color: string, width?: string) => string;
|
|
40
|
+
boxShadow: (shadow: string) => string;
|
|
41
|
+
transition: (property?: string, duration?: string) => string;
|
|
42
|
+
overflow: (type: string) => string;
|
|
43
|
+
position: (type: string) => string;
|
|
44
|
+
zIndex: (index: number) => string;
|
|
45
|
+
flexCenterGap2: string;
|
|
46
|
+
flexCenterGap4: string;
|
|
47
|
+
};
|