@ai-group/chat-sdk 2.1.0 → 2.1.3

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 (76) hide show
  1. package/dist/cjs/components/XAdkChatbot/index.js +61 -98
  2. package/dist/cjs/components/XAdkChatbot/index.js.map +3 -3
  3. package/dist/cjs/components/XAdkChatbot/styles.js +0 -1
  4. package/dist/cjs/components/XAdkChatbot/styles.js.map +2 -2
  5. package/dist/cjs/components/XAdkSender/XAdkSender.stories.d.ts +6 -0
  6. package/dist/cjs/components/XAdkSender/XAdkSender.stories.js +93 -0
  7. package/dist/cjs/components/XAdkSender/XAdkSender.stories.js.map +7 -0
  8. package/dist/cjs/components/XAdkSender/index.d.ts +4 -0
  9. package/dist/cjs/components/XAdkSender/index.js +444 -0
  10. package/dist/cjs/components/XAdkSender/index.js.map +7 -0
  11. package/dist/cjs/components/XAdkSender/styles.d.ts +56 -0
  12. package/dist/cjs/components/XAdkSender/styles.js +340 -0
  13. package/dist/cjs/components/XAdkSender/styles.js.map +7 -0
  14. package/dist/cjs/components/XAdkWebProvider/XAdkWebProvider.stories.js +2 -2
  15. package/dist/cjs/components/XAdkWebProvider/XAdkWebProvider.stories.js.map +2 -2
  16. package/dist/cjs/components/XAdkWebProvider/index.js +8 -5
  17. package/dist/cjs/components/XAdkWebProvider/index.js.map +2 -2
  18. package/dist/cjs/components/XAdkWebProvider/styles.d.ts +1 -0
  19. package/dist/cjs/components/XAdkWebProvider/styles.js +7 -1
  20. package/dist/cjs/components/XAdkWebProvider/styles.js.map +2 -2
  21. package/dist/cjs/components/XAiConversations/index.js +1 -1
  22. package/dist/cjs/components/XAiConversations/index.js.map +2 -2
  23. package/dist/cjs/components/XAiConversations/styles.d.ts +1 -0
  24. package/dist/cjs/components/XAiConversations/styles.js +3 -0
  25. package/dist/cjs/components/XAiConversations/styles.js.map +2 -2
  26. package/dist/cjs/components/XAiSender/index.js +17 -35
  27. package/dist/cjs/components/XAiSender/index.js.map +2 -2
  28. package/dist/cjs/hooks/useADKChat.d.ts +2 -2
  29. package/dist/cjs/hooks/useADKChat.js +10 -6
  30. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  31. package/dist/cjs/types/XAdkChatbot.d.ts +6 -1
  32. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  33. package/dist/cjs/types/XAdkProvider.d.ts +1 -0
  34. package/dist/cjs/types/XAdkProvider.js.map +1 -1
  35. package/dist/cjs/types/XAdkSender.d.ts +38 -0
  36. package/dist/cjs/types/XAdkSender.js +18 -0
  37. package/dist/cjs/types/XAdkSender.js.map +7 -0
  38. package/dist/esm/components/XAdkChatbot/index.js +74 -125
  39. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  40. package/dist/esm/components/XAdkChatbot/styles.js +1 -1
  41. package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
  42. package/dist/esm/components/XAdkSender/XAdkSender.stories.d.ts +6 -0
  43. package/dist/esm/components/XAdkSender/XAdkSender.stories.js +77 -0
  44. package/dist/esm/components/XAdkSender/XAdkSender.stories.js.map +1 -0
  45. package/dist/esm/components/XAdkSender/index.d.ts +4 -0
  46. package/dist/esm/components/XAdkSender/index.js +611 -0
  47. package/dist/esm/components/XAdkSender/index.js.map +1 -0
  48. package/dist/esm/components/XAdkSender/styles.d.ts +56 -0
  49. package/dist/esm/components/XAdkSender/styles.js +50 -0
  50. package/dist/esm/components/XAdkSender/styles.js.map +1 -0
  51. package/dist/esm/components/XAdkWebProvider/XAdkWebProvider.stories.js +3 -2
  52. package/dist/esm/components/XAdkWebProvider/XAdkWebProvider.stories.js.map +1 -1
  53. package/dist/esm/components/XAdkWebProvider/index.js +41 -31
  54. package/dist/esm/components/XAdkWebProvider/index.js.map +1 -1
  55. package/dist/esm/components/XAdkWebProvider/styles.d.ts +1 -0
  56. package/dist/esm/components/XAdkWebProvider/styles.js +4 -2
  57. package/dist/esm/components/XAdkWebProvider/styles.js.map +1 -1
  58. package/dist/esm/components/XAiConversations/index.js +1 -0
  59. package/dist/esm/components/XAiConversations/index.js.map +1 -1
  60. package/dist/esm/components/XAiConversations/styles.d.ts +1 -0
  61. package/dist/esm/components/XAiConversations/styles.js +15 -14
  62. package/dist/esm/components/XAiConversations/styles.js.map +1 -1
  63. package/dist/esm/components/XAiSender/index.js +16 -22
  64. package/dist/esm/components/XAiSender/index.js.map +1 -1
  65. package/dist/esm/hooks/useADKChat.d.ts +2 -2
  66. package/dist/esm/hooks/useADKChat.js +38 -30
  67. package/dist/esm/hooks/useADKChat.js.map +1 -1
  68. package/dist/esm/types/XAdkChatbot.d.ts +6 -1
  69. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  70. package/dist/esm/types/XAdkProvider.d.ts +1 -0
  71. package/dist/esm/types/XAdkProvider.js.map +1 -1
  72. package/dist/esm/types/XAdkSender.d.ts +38 -0
  73. package/dist/esm/types/XAdkSender.js +2 -0
  74. package/dist/esm/types/XAdkSender.js.map +1 -0
  75. package/dist/umd/chat-sdk.min.js +1 -1
  76. package/package.json +1 -1
@@ -0,0 +1,38 @@
1
+ import { UploadProps } from 'antd';
2
+ export interface ServerFile {
3
+ fileName: string;
4
+ fileId: number;
5
+ tempUrl: string;
6
+ type: string;
7
+ mimeType: string;
8
+ }
9
+ export interface LocalFile {
10
+ id: string;
11
+ uid: string;
12
+ name: string;
13
+ file: File;
14
+ size: number;
15
+ type: string;
16
+ progress: number;
17
+ status: 'pending' | 'uploading' | 'success' | 'error';
18
+ fileId?: number;
19
+ tempUrl?: string;
20
+ response?: any;
21
+ }
22
+ export interface XAdkSenderProps {
23
+ clearBtnShow?: boolean;
24
+ allowUpload?: boolean;
25
+ loading?: boolean;
26
+ onClear?: () => void;
27
+ onChange?: (value: string) => void;
28
+ onSubmit?: (data: {
29
+ text: string;
30
+ files: ServerFile[];
31
+ }) => void;
32
+ onStop?: () => void;
33
+ uploadProps?: UploadProps;
34
+ maxFileSize?: number;
35
+ allowedFileTypes?: string[];
36
+ maxFiles?: number;
37
+ onFilesChange?: (files: ServerFile[]) => void;
38
+ }
@@ -0,0 +1,18 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __copyProps = (to, from, except, desc) => {
6
+ if (from && typeof from === "object" || typeof from === "function") {
7
+ for (let key of __getOwnPropNames(from))
8
+ if (!__hasOwnProp.call(to, key) && key !== except)
9
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
10
+ }
11
+ return to;
12
+ };
13
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
14
+
15
+ // src/types/XAdkSender.ts
16
+ var XAdkSender_exports = {};
17
+ module.exports = __toCommonJS(XAdkSender_exports);
18
+ //# sourceMappingURL=XAdkSender.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/XAdkSender.ts"],
4
+ "sourcesContent": ["// types/XAdkSender.ts\nimport { UploadProps } from 'antd';\n\nexport interface ServerFile {\n fileName: string;\n fileId: number;\n tempUrl: string;\n type: string;\n mimeType: string; \n}\n\nexport interface LocalFile {\n id: string;\n uid: string;\n name: string;\n file: File;\n size: number;\n type: string;\n progress: number;\n status: 'pending' | 'uploading' | 'success' | 'error';\n // 服务器返回字段\n fileId?: number;\n tempUrl?: string;\n response?: any;\n}\n\nexport interface XAdkSenderProps {\n clearBtnShow?: boolean;\n allowUpload?: boolean;\n loading?: boolean;\n onClear?: () => void;\n onChange?: (value: string) => void;\n onSubmit?: (data: {\n text: string;\n files: ServerFile[];\n }) => void;\n onStop?: () => void;\n \n // 上传相关配置\n uploadProps?: UploadProps;\n maxFileSize?: number; // 最大文件大小(MB)\n allowedFileTypes?: string[]; // 允许的文件类型\n maxFiles?: number; // 最大文件数量\n \n // 文件状态回调\n onFilesChange?: (files: ServerFile[]) => void;\n}"],
5
+ "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -1,21 +1,26 @@
1
- import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
- import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
1
  import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
4
- import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
5
- import React, { useMemo, useCallback, useEffect, useRef, useState } from 'react';
6
- import { Button, Input, Popconfirm } from 'antd';
7
- import { SwapRightOutlined, ArrowUpOutlined, ClearOutlined, LoadingOutlined } from '@ant-design/icons';
2
+ import React, { useMemo, useCallback, useEffect, useRef } from 'react';
3
+ import { Button } from 'antd';
4
+ import { SwapRightOutlined } from '@ant-design/icons';
8
5
  import { useStyles } from "./styles";
9
6
  import MarkdownRender from "./components/MarkdownRender";
10
7
  import FunctionCallRender from "./components/FunctionCallRender";
11
8
  import ThinkRender from "./components/ThinkRender";
9
+ import XAdkSender from "../XAdkSender";
12
10
  import { jsx as _jsx } from "react/jsx-runtime";
13
11
  import { jsxs as _jsxs } from "react/jsx-runtime";
12
+ var scrollThreshold = 10; // 滚动阈值
13
+
14
14
  var XAdkChatbot = function XAdkChatbot(_ref) {
15
- var loading = _ref.loading,
15
+ var _ref$allowUpload = _ref.allowUpload,
16
+ allowUpload = _ref$allowUpload === void 0 ? false : _ref$allowUpload,
17
+ _ref$loading = _ref.loading,
18
+ loading = _ref$loading === void 0 ? false : _ref$loading,
16
19
  prologue = _ref.prologue,
17
20
  suggestions = _ref.suggestions,
18
21
  messages = _ref.messages,
22
+ _ref$initialized = _ref.initialized,
23
+ initialized = _ref$initialized === void 0 ? true : _ref$initialized,
19
24
  footer = _ref.footer,
20
25
  showFnCallDetail = _ref.showFnCallDetail,
21
26
  _ref$clearBtnShow = _ref.clearBtnShow,
@@ -25,65 +30,70 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
25
30
  onStop = _ref.onStop,
26
31
  onClear = _ref.onClear;
27
32
  var styles = useStyles();
28
- var _React$useState = React.useState(''),
29
- _React$useState2 = _slicedToArray(_React$useState, 2),
30
- inputValue = _React$useState2[0],
31
- setInputValue = _React$useState2[1];
32
- var _useState = useState(false),
33
- _useState2 = _slicedToArray(_useState, 2),
34
- showLog = _useState2[0],
35
- setShowLog = _useState2[1];
36
- var _useState3 = useState(),
37
- _useState4 = _slicedToArray(_useState3, 2),
38
- invocation = _useState4[0],
39
- setInvocation = _useState4[1];
40
33
  var listRef = useRef(null);
41
- var scrollTimeoutRef = useRef(null);
42
- var isFirstLoadRef = useRef(true);
34
+ var lastScrollTopRef = useRef(0);
35
+ var userHasScrolledRef = useRef(false);
36
+ var messagesEndRef = useRef(null);
37
+ useEffect(function () {
38
+ var _messagesEndRef$curre;
39
+ if (!loading) return;
40
+ if (userHasScrolledRef.current) return;
41
+ (_messagesEndRef$curre = messagesEndRef.current) === null || _messagesEndRef$curre === void 0 || _messagesEndRef$curre.scrollIntoView({
42
+ behavior: 'smooth'
43
+ });
44
+ }, [loading, messages]);
43
45
 
44
- // 滚动到底部函数
45
- var scrollToBottom = useCallback(function () {
46
- var smooth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
47
- if (!listRef.current) return;
48
- if (scrollTimeoutRef.current) {
49
- clearTimeout(scrollTimeoutRef.current);
46
+ // 处理滚动事件 - 检测用户是否手动滚动
47
+ var handleScroll = useCallback(function () {
48
+ var el = listRef.current;
49
+ if (!el) return;
50
+ var currentTop = el.scrollTop;
51
+ // 如果向上滚动,说明是手动干预
52
+ if (currentTop < lastScrollTopRef.current) {
53
+ userHasScrolledRef.current = true;
50
54
  }
51
- // 首次尝试
52
- listRef.current.scrollTo({
53
- top: listRef.current.scrollHeight,
54
- behavior: smooth ? 'smooth' : 'instant'
55
- });
56
- // 重试机制:确保滚动生效
57
- scrollTimeoutRef.current = setTimeout(function () {
58
- if (listRef.current) {
59
- listRef.current.scrollTo({
60
- top: listRef.current.scrollHeight,
61
- behavior: smooth ? 'smooth' : 'instant'
62
- });
63
- }
64
- }, 100);
55
+ // 如果向下并且已经到了底部,则恢复自动
56
+ var isAtBottom = Math.abs(el.scrollHeight - currentTop - el.clientHeight) <= scrollThreshold;
57
+ if (isAtBottom) {
58
+ userHasScrolledRef.current = false;
59
+ }
60
+
61
+ // 更新上次位置
62
+ lastScrollTopRef.current = currentTop;
65
63
  }, []);
66
64
 
67
- // 消息更新时滚动
65
+ // 监听滚动事件
68
66
  useEffect(function () {
69
- if (isFirstLoadRef.current) {
70
- // 初始化
71
- scrollToBottom(false);
72
- isFirstLoadRef.current = false;
73
- } else {
74
- // 消息更新
75
- scrollToBottom(true);
76
- }
77
- }, [messages, suggestions, scrollToBottom]);
67
+ var listElement = listRef.current;
68
+ if (!listElement) return;
69
+ listElement.addEventListener('scroll', handleScroll);
70
+ return function () {
71
+ listElement.removeEventListener('scroll', handleScroll);
72
+ };
73
+ }, []);
78
74
 
79
75
  // 发送消息
80
- var handleSubmit = useCallback(function (text) {
76
+ var handleSubmit = function handleSubmit(_ref2) {
77
+ var text = _ref2.text,
78
+ files = _ref2.files;
81
79
  if (loading) return;
82
80
  if (!(text !== null && text !== void 0 && text.trim())) return;
83
- onSubmit === null || onSubmit === void 0 || onSubmit(text);
84
- setInputValue('');
85
- scrollToBottom(true);
86
- }, [loading, scrollToBottom]);
81
+ onSubmit === null || onSubmit === void 0 || onSubmit({
82
+ text: text,
83
+ files: files
84
+ });
85
+ // 滚动
86
+ queueMicrotask(function () {
87
+ var _messagesEndRef$curre2;
88
+ (_messagesEndRef$curre2 = messagesEndRef.current) === null || _messagesEndRef$curre2 === void 0 || _messagesEndRef$curre2.scrollIntoView({
89
+ behavior: 'instant'
90
+ });
91
+ });
92
+ // 重置用户滚动状态
93
+ setTimeout(function () {
94
+ userHasScrolledRef.current = false;
95
+ }, 0);
96
+ };
87
97
  var lastIndex = messages.length - 1;
88
98
  var lastMessageMap = useMemo(function () {
89
99
  var map = new Map();
@@ -202,77 +212,16 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
202
212
  })
203
213
  }, item);
204
214
  })
205
- })]
206
- }), /*#__PURE__*/_jsxs("div", {
207
- className: styles.footer,
208
- children: [/*#__PURE__*/_jsxs("div", {
209
- className: styles.senderWrap,
210
- children: [clearBtnShow && /*#__PURE__*/_jsx(Popconfirm, {
211
- title: "\u786E\u5B9A\u8981\u6E05\u7A7A\u804A\u5929\u8BB0\u5F55\u5417\uFF1F",
212
- onConfirm: onClear,
213
- children: /*#__PURE__*/_jsx(Button, {
214
- shape: "circle",
215
- icon: /*#__PURE__*/_jsx(ClearOutlined, {})
216
- })
217
- }), /*#__PURE__*/_jsxs("div", {
218
- className: styles.sender,
219
- children: [/*#__PURE__*/_jsx(Input.TextArea, {
220
- className: styles.input,
221
- rows: 1,
222
- autoSize: {
223
- minRows: 1,
224
- maxRows: 4
225
- },
226
- value: inputValue,
227
- onChange: function onChange(e) {
228
- setInputValue(e.target.value);
229
- },
230
- onPressEnter: ( /*#__PURE__*/function () {
231
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(e) {
232
- return _regeneratorRuntime().wrap(function _callee$(_context) {
233
- while (1) switch (_context.prev = _context.next) {
234
- case 0:
235
- if (!e.shiftKey) {
236
- _context.next = 2;
237
- break;
238
- }
239
- return _context.abrupt("return");
240
- case 2:
241
- e.preventDefault();
242
- handleSubmit(inputValue);
243
- case 4:
244
- case "end":
245
- return _context.stop();
246
- }
247
- }, _callee);
248
- }));
249
- return function (_x) {
250
- return _ref2.apply(this, arguments);
251
- };
252
- }()),
253
- placeholder: "\u8BF7\u8F93\u5165\u6D88\u606F"
254
- }), /*#__PURE__*/_jsx("div", {
255
- children: loading ? /*#__PURE__*/_jsx(Button, {
256
- type: "primary",
257
- shape: "circle",
258
- icon: /*#__PURE__*/_jsx(LoadingOutlined, {}),
259
- onClick: function onClick() {
260
- onStop === null || onStop === void 0 || onStop();
261
- }
262
- }) : /*#__PURE__*/_jsx(Button, {
263
- type: "primary",
264
- shape: "circle",
265
- icon: /*#__PURE__*/_jsx(ArrowUpOutlined, {}),
266
- onClick: function onClick() {
267
- handleSubmit(inputValue);
268
- }
269
- })
270
- })]
271
- })]
272
215
  }), /*#__PURE__*/_jsx("div", {
273
- className: styles.tip,
274
- children: "\u5185\u5BB9\u7531AI\u751F\u6210\uFF0C\u65E0\u6CD5\u786E\u4FDD\u771F\u5B9E\u51C6\u786E\uFF0C\u4EC5\u4F9B\u53C2\u8003"
216
+ ref: messagesEndRef
275
217
  })]
218
+ }), /*#__PURE__*/_jsx(XAdkSender, {
219
+ allowUpload: allowUpload,
220
+ loading: loading,
221
+ clearBtnShow: clearBtnShow,
222
+ onSubmit: handleSubmit,
223
+ onClear: onClear,
224
+ onStop: onStop
276
225
  })]
277
226
  });
278
227
  };
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","useState","Button","Input","Popconfirm","SwapRightOutlined","ArrowUpOutlined","ClearOutlined","LoadingOutlined","useStyles","MarkdownRender","FunctionCallRender","ThinkRender","jsx","_jsx","jsxs","_jsxs","XAdkChatbot","_ref","loading","prologue","suggestions","messages","footer","showFnCallDetail","_ref$clearBtnShow","clearBtnShow","onSubmit","onSuggest","onStop","onClear","styles","_React$useState","_React$useState2","_slicedToArray","inputValue","setInputValue","_useState","_useState2","showLog","setShowLog","_useState3","_useState4","invocation","setInvocation","listRef","scrollTimeoutRef","isFirstLoadRef","scrollToBottom","smooth","arguments","length","undefined","current","clearTimeout","scrollTo","top","scrollHeight","behavior","setTimeout","handleSubmit","text","trim","lastIndex","lastMessageMap","map","Map","_iterator","_createForOfIteratorHelper","_step","s","n","done","msg","value","role","invocationId","set","id","err","e","f","className","wrapper","children","list","ref","i","userMsg","card","concat","functionResponse","showDetail","isLast","isLoading","isLastBotMsg","get","thought","botMsg","message","isLastMsg","fnCall","functionCall","item","suggestion","suggestContent","type","icon","iconPosition","onClick","senderWrap","title","onConfirm","shape","sender","TextArea","input","rows","autoSize","minRows","maxRows","onChange","target","onPressEnter","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","wrap","_callee$","_context","prev","next","shiftKey","abrupt","preventDefault","stop","_x","apply","placeholder","tip"],"sources":["../../../../src/components/XAdkChatbot/index.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useRef, useState } from 'react';\nimport { Button, Input, Popconfirm } from 'antd';\nimport { SwapRightOutlined, ArrowUpOutlined, ClearOutlined, LoadingOutlined } from '@ant-design/icons';\nimport { useStyles } from './styles';\nimport MarkdownRender from './components/MarkdownRender';\nimport FunctionCallRender from './components/FunctionCallRender';\nimport ThinkRender from './components/ThinkRender';\nimport type { IInvocation, IMessage, XAdkChatbotProps } from '@/types';\n\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({ \n loading,\n prologue,\n suggestions,\n messages,\n footer,\n showFnCallDetail,\n clearBtnShow = true,\n onSubmit,\n onSuggest,\n onStop,\n onClear,\n }) => {\n const styles = useStyles();\n const [inputValue, setInputValue] = React.useState<string>('');\n const [showLog, setShowLog] = useState(false);\n const [invocation, setInvocation] = useState<Partial<IInvocation>>();\n const listRef = useRef<HTMLDivElement>(null);\n const scrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isFirstLoadRef = useRef(true);\n\n // 滚动到底部函数\n const scrollToBottom = useCallback((smooth = false) => {\n if (!listRef.current) return;\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n // 首次尝试\n listRef.current.scrollTo({\n top: listRef.current.scrollHeight,\n behavior: smooth ? 'smooth' : 'instant',\n });\n // 重试机制:确保滚动生效\n scrollTimeoutRef.current = setTimeout(() => {\n if (listRef.current) {\n listRef.current.scrollTo({\n top: listRef.current.scrollHeight,\n behavior: smooth ? 'smooth' : 'instant',\n });\n }\n }, 100);\n }, []);\n\n // 消息更新时滚动\n useEffect(() => {\n if (isFirstLoadRef.current) {\n // 初始化\n scrollToBottom(false);\n isFirstLoadRef.current = false;\n } else {\n // 消息更新\n scrollToBottom(true);\n }\n }, [messages, suggestions, scrollToBottom]);\n\n // 发送消息\n const handleSubmit = useCallback((text: string) => {\n if (loading) return;\n if (!text?.trim()) return;\n onSubmit?.(text);\n setInputValue('');\n scrollToBottom(true);\n }, [loading, scrollToBottom]);\n\n const lastIndex = messages.length - 1;\n\n const lastMessageMap = useMemo(() => {\n const map = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === 'bot' && msg.invocationId) {\n map.set(msg.invocationId, msg.id);\n }\n }\n return map;\n }, [messages]);\n\n return (\n <div className={styles.wrapper}>\n <div className={styles.list} ref={listRef}>\n <div className={styles.prologue}>\n {prologue}\n </div>\n {messages.map((msg, i) => {\n if (msg.role === 'user') {\n if (msg.text) {\n return (\n <div key={`${msg.id}-${i}`} className={styles.userMsg}>\n <div className={styles.card}>{msg.text}</div>\n </div>\n );\n }\n if (msg.functionResponse) {\n return (\n <div key={`${msg.id}-${i}`} className={styles.userMsg}>\n <FunctionCallRender msg={msg} showDetail={showFnCallDetail} />\n </div>\n );\n }\n return null;\n }\n const isLast = i === lastIndex;\n const isLoading = isLast && loading;\n const isLastBotMsg = lastMessageMap.get(msg?.invocationId || '') === msg.id;\n \n if (msg.text) {\n if (msg.thought) {\n return (\n <div key={`${msg.id}-${i}`} className={styles.botMsg}>\n <ThinkRender\n msg={msg}\n loading={isLoading}\n />\n {!isLoading && footer?.({ message: msg as IMessage, isLastMsg: isLast, isLastBotMsg })}\n </div>\n );\n }\n return (\n <div key={`${msg.id}-${i}`} className={styles.botMsg}>\n <MarkdownRender text={msg.text} />\n {!isLoading && footer?.({ message: msg as IMessage, isLastMsg: isLast, isLastBotMsg })}\n </div>\n );\n }\n const fnCall = msg.functionCall;\n if (fnCall) {\n return (\n <div key={`${msg.id}-${i}`} className={styles.botMsg}>\n <FunctionCallRender msg={msg} showDetail={showFnCallDetail} />\n {!isLoading && footer?.({ message: msg as IMessage, isLastMsg: isLast, isLastBotMsg })}\n </div>\n );\n }\n return (\n <div key={`${msg.id}-${i}`} className={styles.botMsg}>\n {!isLoading && footer?.({ message: msg as IMessage, isLastMsg: isLast, isLastBotMsg })}\n </div>\n );\n })}\n <div>\n {suggestions?.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition='end'\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n </div>\n <div className={styles.footer}>\n <div className={styles.senderWrap}>\n { clearBtnShow && <Popconfirm\n title=\"确定要清空聊天记录吗?\"\n onConfirm={onClear}\n >\n <Button\n shape=\"circle\"\n icon={<ClearOutlined />}\n />\n </Popconfirm> }\n <div className={styles.sender}>\n <Input.TextArea\n className={styles.input}\n rows={1}\n autoSize={{ minRows: 1, maxRows: 4 }}\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n }}\n onPressEnter={async (e) => {\n if (e.shiftKey) {\n return;\n }\n e.preventDefault();\n handleSubmit(inputValue);\n }}\n placeholder=\"请输入消息\"\n />\n <div>\n {loading\n ? (\n <Button\n type=\"primary\"\n shape=\"circle\"\n icon={<LoadingOutlined />}\n onClick={() => {\n onStop?.();\n }}\n />\n )\n : (\n <Button\n type=\"primary\"\n shape=\"circle\"\n icon={<ArrowUpOutlined />}\n onClick={() => {\n handleSubmit(inputValue);\n }}\n />\n )}\n </div>\n </div>\n </div>\n <div className={styles.tip}>内容由AI生成,无法确保真实准确,仅供参考</div>\n </div>\n {/* 智能体日志详情 */}\n {/* <AgentLogDetail\n show={showLog}\n data={invocation}\n onClose={() => setShowLog(false)}\n /> */}\n </div>\n );\n};\n\nexport default XAdkChatbot;"],"mappings":"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"}
1
+ {"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","Button","SwapRightOutlined","useStyles","MarkdownRender","FunctionCallRender","ThinkRender","XAdkSender","jsx","_jsx","jsxs","_jsxs","scrollThreshold","XAdkChatbot","_ref","_ref$allowUpload","allowUpload","_ref$loading","loading","prologue","suggestions","messages","_ref$initialized","initialized","footer","showFnCallDetail","_ref$clearBtnShow","clearBtnShow","onSubmit","onSuggest","onStop","onClear","styles","listRef","lastScrollTopRef","userHasScrolledRef","messagesEndRef","_messagesEndRef$curre","current","scrollIntoView","behavior","handleScroll","el","currentTop","scrollTop","isAtBottom","Math","abs","scrollHeight","clientHeight","listElement","addEventListener","removeEventListener","handleSubmit","_ref2","text","files","trim","queueMicrotask","_messagesEndRef$curre2","setTimeout","lastIndex","length","lastMessageMap","map","Map","_iterator","_createForOfIteratorHelper","_step","s","n","done","msg","value","role","invocationId","set","id","err","e","f","className","wrapper","children","list","ref","i","userMsg","card","concat","functionResponse","showDetail","isLast","isLoading","isLastBotMsg","get","thought","botMsg","message","isLastMsg","fnCall","functionCall","item","suggestion","suggestContent","type","icon","iconPosition","onClick"],"sources":["../../../../src/components/XAdkChatbot/index.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useRef } from 'react';\nimport { Button } from 'antd';\nimport { SwapRightOutlined } from '@ant-design/icons';\nimport { useStyles } from './styles';\nimport MarkdownRender from './components/MarkdownRender';\nimport FunctionCallRender from './components/FunctionCallRender';\nimport ThinkRender from './components/ThinkRender';\nimport XAdkSender from '../XAdkSender';\nimport type { IMessage, XAdkChatbotProps, SendContent } from '@/types';\n\nconst scrollThreshold = 10; // 滚动阈值\n\n\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({ \n allowUpload = false,\n loading = false,\n prologue,\n suggestions,\n messages,\n initialized = true,\n footer,\n showFnCallDetail,\n clearBtnShow = true,\n onSubmit,\n onSuggest,\n onStop,\n onClear,\n }) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({\n behavior: 'smooth',\n });\n }, [loading, messages]);\n\n // 处理滚动事件 - 检测用户是否手动滚动\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n // 如果向上滚动,说明是手动干预\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n // 如果向下并且已经到了底部,则恢复自动\n const isAtBottom = \n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <= scrollThreshold;\n\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n // 更新上次位置\n lastScrollTopRef.current = currentTop;\n }, []);\n\n // 监听滚动事件\n useEffect(() => {\n const listElement = listRef.current\n if (!listElement) return;\n\n listElement.addEventListener('scroll', handleScroll);\n return () => {\n listElement.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\n // 发送消息\n const handleSubmit = ({ text, files }: SendContent) => {\n if (loading) return;\n if (!text?.trim()) return;\n onSubmit?.({ text, files });\n // 滚动\n queueMicrotask(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'instant' });\n });\n // 重置用户滚动状态\n setTimeout(() => {\n userHasScrolledRef.current = false;\n }, 0);\n };\n\n const lastIndex = messages.length - 1;\n\n const lastMessageMap = useMemo(() => {\n const map = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === 'bot' && msg.invocationId) {\n map.set(msg.invocationId, msg.id);\n }\n }\n return map;\n }, [messages]);\n\n return (\n <div className={styles.wrapper}>\n <div className={styles.list} ref={listRef}>\n <div className={styles.prologue}>\n {prologue}\n </div>\n {messages.map((msg, i) => {\n if (msg.role === 'user') {\n if (msg.text) {\n return (\n <div key={`${msg.id}-${i}`} className={styles.userMsg}>\n <div className={styles.card}>{msg.text}</div>\n </div>\n );\n }\n if (msg.functionResponse) {\n return (\n <div key={`${msg.id}-${i}`} className={styles.userMsg}>\n <FunctionCallRender msg={msg} showDetail={showFnCallDetail} />\n </div>\n );\n }\n return null;\n }\n const isLast = i === lastIndex;\n const isLoading = isLast && loading;\n const isLastBotMsg = lastMessageMap.get(msg?.invocationId || '') === msg.id;\n \n if (msg.text) {\n if (msg.thought) {\n return (\n <div key={`${msg.id}-${i}`} className={styles.botMsg}>\n <ThinkRender\n msg={msg}\n loading={isLoading}\n />\n {!isLoading && footer?.({ message: msg as IMessage, isLastMsg: isLast, isLastBotMsg })}\n </div>\n );\n }\n return (\n <div key={`${msg.id}-${i}`} className={styles.botMsg}>\n <MarkdownRender text={msg.text} />\n {!isLoading && footer?.({ message: msg as IMessage, isLastMsg: isLast, isLastBotMsg })}\n </div>\n );\n }\n const fnCall = msg.functionCall;\n if (fnCall) {\n return (\n <div key={`${msg.id}-${i}`} className={styles.botMsg}>\n <FunctionCallRender msg={msg} showDetail={showFnCallDetail} />\n {!isLoading && footer?.({ message: msg as IMessage, isLastMsg: isLast, isLastBotMsg })}\n </div>\n );\n }\n return (\n <div key={`${msg.id}-${i}`} className={styles.botMsg}>\n {!isLoading && footer?.({ message: msg as IMessage, isLastMsg: isLast, isLastBotMsg })}\n </div>\n );\n })}\n <div>\n {suggestions?.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition='end'\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n <div ref={messagesEndRef} />\n </div>\n <XAdkSender\n allowUpload={allowUpload}\n loading={loading}\n clearBtnShow={clearBtnShow}\n onSubmit={handleSubmit}\n onClear={onClear}\n onStop={onStop}\n />\n </div>\n );\n};\n\nexport default XAdkChatbot;"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { css } from '@emotion/css';
4
4
  import { withBasicStyles } from "../../styles/common";
5
5
  export var useStyles = withBasicStyles(function () {
6
6
  return {
7
- wrapper: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n padding: 0 16px;\n min-height: 300px;\n width: 100%;\n height: 100%;\n border: 1px solid #e7e7e7;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n\n .x-markdown {\n --margin-ul-ol: 0 0 1em 1em;\n\n code {\n background: rgba(150, 150, 150, 0.2);\n border-radius: 3px;\n }\n\n .ant-highlightCode-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--ant-highlight-code-color-text-title);\n background: var(--ant-highlight-code-color-bg-title);\n padding: var(--ant-padding-sm);\n border-top-left-radius: var(--ant-border-radius);\n border-top-right-radius: var(--ant-border-radius);\n }\n }\n "]))),
7
+ wrapper: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n padding: 0 16px;\n min-height: 300px;\n width: 100%;\n height: 100%;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n\n .x-markdown {\n --margin-ul-ol: 0 0 1em 1em;\n\n code {\n background: rgba(150, 150, 150, 0.2);\n border-radius: 3px;\n }\n\n .ant-highlightCode-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--ant-highlight-code-color-text-title);\n background: var(--ant-highlight-code-color-bg-title);\n padding: var(--ant-padding-sm);\n border-top-left-radius: var(--ant-border-radius);\n border-top-right-radius: var(--ant-border-radius);\n }\n }\n "]))),
8
8
  list: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n flex: 1;\n margin: 16px 0;\n padding: 0 16px;\n overflow-y: auto;\n /* Chrome, Safari, Edge, Opera */\n &::-webkit-scrollbar {\n display: none;\n }\n /* Firefox */\n scrollbar-width: none;\n /* IE 10+ */\n -ms-overflow-style: none;\n "]))),
9
9
  prologue: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n margin-bottom: 12px;\n "]))),
10
10
  suggestion: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n margin-bottom: 12px;\n "]))),
@@ -1 +1 @@
1
- {"version":3,"names":["css","withBasicStyles","useStyles","wrapper","_templateObject","_taggedTemplateLiteral","list","_templateObject2","prologue","_templateObject3","suggestion","_templateObject4","suggestContent","_templateObject5","userMsg","_templateObject6","card","_templateObject7","botMsg","_templateObject8","fnCall","_templateObject9","confirm","_templateObject10","footer","_templateObject11","sender","_templateObject12","senderWrap","_templateObject13","tip","_templateObject14","input","_templateObject15"],"sources":["../../../../src/components/XAdkChatbot/styles.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { withBasicStyles } from '@/styles/common';\n\nexport const useStyles = withBasicStyles(() => ({\n wrapper: css`\n padding: 0 16px;\n min-height: 300px;\n width: 100%;\n height: 100%;\n border: 1px solid #e7e7e7;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n\n .x-markdown {\n --margin-ul-ol: 0 0 1em 1em;\n\n code {\n background: rgba(150, 150, 150, 0.2);\n border-radius: 3px;\n }\n\n .ant-highlightCode-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--ant-highlight-code-color-text-title);\n background: var(--ant-highlight-code-color-bg-title);\n padding: var(--ant-padding-sm);\n border-top-left-radius: var(--ant-border-radius);\n border-top-right-radius: var(--ant-border-radius);\n }\n }\n `,\n\n list: css`\n flex: 1;\n margin: 16px 0;\n padding: 0 16px;\n overflow-y: auto;\n /* Chrome, Safari, Edge, Opera */\n &::-webkit-scrollbar {\n display: none;\n }\n /* Firefox */\n scrollbar-width: none;\n /* IE 10+ */\n -ms-overflow-style: none;\n `,\n\n prologue: css`\n margin-bottom: 12px;\n `,\n\n suggestion: css`\n margin-bottom: 12px;\n `,\n\n suggestContent: css`\n display: inline-flex;\n border: 2px solid #E7E7E7;\n border-radius: 8px;\n `,\n\n userMsg: css`\n display: flex;\n justify-content: flex-end;\n margin-bottom: 24px;\n `,\n\n card: css`\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 80%;\n white-space: pre-line;\n word-break: break-all;\n `,\n\n botMsg: css`\n margin-bottom: 12px;\n `,\n\n fnCall: css`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 11px;\n border-radius: 24px;\n line-height: 16px;\n border: 1px solid #e7e7e7;\n cursor: pointer;\n `,\n\n confirm: css`\n padding: 12px;\n border-radius: 12px;\n border: 1px solid #e7e7e7;\n `,\n\n \n\n footer: css`\n /* senderWrap and tip moved to top-level keys so they are\n accessible as styles.senderWrap and styles.tip in the component */\n `,\n\n sender: css`\n width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 8px 8px 12px;\n border: 1px solid #e7e7e7;\n border-radius: 24px;\n\n /* .input moved to top-level key so component can use styles.input */\n `,\n\n senderWrap: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n `,\n\n tip: css`\n padding: 4px;\n font-size: 12px;\n text-align: center;\n color: rgba(0, 0, 0, 0.4);\n `,\n\n input: css`\n padding: 0;\n margin: 5px 0;\n line-height: 22px;\n font-size: 15px;\n border-radius: 0;\n border: none;\n\n &:focus {\n box-shadow: none;\n }\n `,\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,OAAO,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,sxBA6BX;IAEDC,IAAI,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,4RAaR;IAEDG,QAAQ,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,sCAEZ;IAEDK,UAAU,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,sCAEd;IAEDO,cAAc,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,gGAIlB;IAEDS,OAAO,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,0FAIX;IAEDW,IAAI,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,sKAOR;IAEDa,MAAM,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,sCAEV;IAEDe,MAAM,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,yMASV;IAEDiB,OAAO,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,0FAIX;IAIDmB,MAAM,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,sJAGV;IAEDqB,MAAM,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,kQAUV;IAEDuB,UAAU,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,8GAKd;IAEDyB,GAAG,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA,8GAKP;IAED2B,KAAK,EAAEhC,GAAG,CAAAiC,iBAAA,KAAAA,iBAAA,GAAA5B,sBAAA;EAYZ,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
1
+ {"version":3,"names":["css","withBasicStyles","useStyles","wrapper","_templateObject","_taggedTemplateLiteral","list","_templateObject2","prologue","_templateObject3","suggestion","_templateObject4","suggestContent","_templateObject5","userMsg","_templateObject6","card","_templateObject7","botMsg","_templateObject8","fnCall","_templateObject9","confirm","_templateObject10","footer","_templateObject11","sender","_templateObject12","senderWrap","_templateObject13","tip","_templateObject14","input","_templateObject15"],"sources":["../../../../src/components/XAdkChatbot/styles.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { withBasicStyles } from '@/styles/common';\n\nexport const useStyles = withBasicStyles(() => ({\n wrapper: css`\n padding: 0 16px;\n min-height: 300px;\n width: 100%;\n height: 100%;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n\n .x-markdown {\n --margin-ul-ol: 0 0 1em 1em;\n\n code {\n background: rgba(150, 150, 150, 0.2);\n border-radius: 3px;\n }\n\n .ant-highlightCode-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--ant-highlight-code-color-text-title);\n background: var(--ant-highlight-code-color-bg-title);\n padding: var(--ant-padding-sm);\n border-top-left-radius: var(--ant-border-radius);\n border-top-right-radius: var(--ant-border-radius);\n }\n }\n `,\n\n list: css`\n flex: 1;\n margin: 16px 0;\n padding: 0 16px;\n overflow-y: auto;\n /* Chrome, Safari, Edge, Opera */\n &::-webkit-scrollbar {\n display: none;\n }\n /* Firefox */\n scrollbar-width: none;\n /* IE 10+ */\n -ms-overflow-style: none;\n `,\n\n prologue: css`\n margin-bottom: 12px;\n `,\n\n suggestion: css`\n margin-bottom: 12px;\n `,\n\n suggestContent: css`\n display: inline-flex;\n border: 2px solid #E7E7E7;\n border-radius: 8px;\n `,\n\n userMsg: css`\n display: flex;\n justify-content: flex-end;\n margin-bottom: 24px;\n `,\n\n card: css`\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 80%;\n white-space: pre-line;\n word-break: break-all;\n `,\n\n botMsg: css`\n margin-bottom: 12px;\n `,\n\n fnCall: css`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 11px;\n border-radius: 24px;\n line-height: 16px;\n border: 1px solid #e7e7e7;\n cursor: pointer;\n `,\n\n confirm: css`\n padding: 12px;\n border-radius: 12px;\n border: 1px solid #e7e7e7;\n `,\n\n \n\n footer: css`\n /* senderWrap and tip moved to top-level keys so they are\n accessible as styles.senderWrap and styles.tip in the component */\n `,\n\n sender: css`\n width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 8px 8px 12px;\n border: 1px solid #e7e7e7;\n border-radius: 24px;\n\n /* .input moved to top-level key so component can use styles.input */\n `,\n\n senderWrap: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n `,\n\n tip: css`\n padding: 4px;\n font-size: 12px;\n text-align: center;\n color: rgba(0, 0, 0, 0.4);\n `,\n\n input: css`\n padding: 0;\n margin: 5px 0;\n line-height: 22px;\n font-size: 15px;\n border-radius: 0;\n border: none;\n\n &:focus {\n box-shadow: none;\n }\n `,\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,OAAO,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,svBA4BX;IAEDC,IAAI,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,4RAaR;IAEDG,QAAQ,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,sCAEZ;IAEDK,UAAU,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,sCAEd;IAEDO,cAAc,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,gGAIlB;IAEDS,OAAO,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,0FAIX;IAEDW,IAAI,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,sKAOR;IAEDa,MAAM,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,sCAEV;IAEDe,MAAM,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,yMASV;IAEDiB,OAAO,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,0FAIX;IAIDmB,MAAM,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,sJAGV;IAEDqB,MAAM,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,kQAUV;IAEDuB,UAAU,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,8GAKd;IAEDyB,GAAG,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA,8GAKP;IAED2B,KAAK,EAAEhC,GAAG,CAAAiC,iBAAA,KAAAA,iBAAA,GAAA5B,sBAAA;EAYZ,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
@@ -0,0 +1,6 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import XAdkSender from '.';
3
+ declare const meta: Meta<typeof XAdkSender>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof meta>;
6
+ export declare const 基础用法: Story;
@@ -0,0 +1,77 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { useState } from 'react';
3
+ import XAdkSender from '.';
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ var meta = {
6
+ title: 'AI组件/XAdkSender 输入框',
7
+ component: XAdkSender,
8
+ parameters: {
9
+ layout: 'centered'
10
+ },
11
+ tags: ['autodocs'],
12
+ argTypes: {}
13
+ };
14
+ export default meta;
15
+ // 基础用法
16
+ var BasicUsageStory = function BasicUsageStory() {
17
+ var _useState = useState([]),
18
+ _useState2 = _slicedToArray(_useState, 2),
19
+ files = _useState2[0],
20
+ setFiles = _useState2[1];
21
+ var _useState3 = useState(''),
22
+ _useState4 = _slicedToArray(_useState3, 2),
23
+ content = _useState4[0],
24
+ setContent = _useState4[1];
25
+ var _useState5 = useState(false),
26
+ _useState6 = _slicedToArray(_useState5, 2),
27
+ loading = _useState6[0],
28
+ setLoading = _useState6[1];
29
+
30
+ // 模拟清空数据
31
+ var handleSubmit = function handleSubmit() {
32
+ console.info('submit', content);
33
+ };
34
+ var handleClear = function handleClear() {
35
+ console.info('clear');
36
+ };
37
+
38
+ // 模拟停止发送
39
+ var handleStop = function handleStop() {
40
+ console.info('stop');
41
+ };
42
+
43
+ // 模拟输入
44
+ var handleChange = function handleChange(text) {
45
+ setContent(text);
46
+ };
47
+
48
+ // 模拟快捷短语点击
49
+ var handleSendMessage = function handleSendMessage(obj) {
50
+ setLoading(true);
51
+ setTimeout(function () {
52
+ setContent('');
53
+ setFiles([]);
54
+ setLoading(false);
55
+ }, 2000);
56
+ };
57
+ return /*#__PURE__*/_jsx("div", {
58
+ style: {
59
+ width: 800,
60
+ border: '1px solid #eee',
61
+ padding: 20
62
+ },
63
+ children: /*#__PURE__*/_jsx(XAdkSender, {
64
+ loading: loading,
65
+ clearBtnShow: true,
66
+ allowUpload: true,
67
+ onSubmit: handleSubmit,
68
+ onClear: handleClear,
69
+ onStop: handleStop
70
+ })
71
+ });
72
+ };
73
+ export var 基础用法 = {
74
+ render: BasicUsageStory,
75
+ args: {}
76
+ };
77
+ //# sourceMappingURL=XAdkSender.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useState","XAdkSender","jsx","_jsx","meta","title","component","parameters","layout","tags","argTypes","BasicUsageStory","_useState","_useState2","_slicedToArray","files","setFiles","_useState3","_useState4","content","setContent","_useState5","_useState6","loading","setLoading","handleSubmit","console","info","handleClear","handleStop","handleChange","text","handleSendMessage","obj","setTimeout","style","width","border","padding","children","clearBtnShow","allowUpload","onSubmit","onClear","onStop","基础用法","render","args"],"sources":["../../../../src/components/XAdkSender/XAdkSender.stories.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport type { Attachment } from '@ant-design/x/es/attachments';\nimport XAdkSender from '.';\n\nconst meta: Meta<typeof XAdkSender> = {\n title: 'AI组件/XAdkSender 输入框',\n component: XAdkSender,\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 = () => {\n const [files, setFiles] = useState<Attachment[]>([]);\n const [content, setContent] = useState('');\n const [loading, setLoading] = useState(false);\n\n // 模拟清空数据\n const handleSubmit = () => {\n console.info('submit', content);\n };\n\n const handleClear = () => {\n console.info('clear');\n };\n\n // 模拟停止发送\n const handleStop = () => {\n console.info('stop');\n };\n\n // 模拟输入\n const handleChange = (text: string) => {\n setContent(text);\n };\n\n // 模拟快捷短语点击\n const handleSendMessage = (obj: any) => {\n setLoading(true);\n setTimeout(() => {\n setContent('');\n setFiles([]);\n setLoading(false);\n }, 2000);\n };\n\n return (\n <div style={{ width: 800, border: '1px solid #eee', padding: 20 }}>\n <XAdkSender\n loading={loading}\n clearBtnShow={true}\n allowUpload={true}\n onSubmit={handleSubmit}\n onClear={handleClear}\n onStop={handleStop}\n />\n </div>\n );\n};\n\nexport const 基础用法: Story = {\n render: BasicUsageStory,\n args: {},\n};\n"],"mappings":";AAAA,SAASA,QAAQ,QAAQ,OAAO;AAGhC,OAAOC,UAAU,MAAM,GAAG;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAE3B,IAAMC,IAA6B,GAAG;EACpCC,KAAK,EAAE,qBAAqB;EAC5BC,SAAS,EAAEL,UAAU;EACrBM,UAAU,EAAE;IACVC,MAAM,EAAE;EACV,CAAC;EACDC,IAAI,EAAE,CAAC,UAAU,CAAC;EAClBC,QAAQ,EAAE,CAAC;AACb,CAAC;AAED,eAAeN,IAAI;AAGnB;AACA,IAAMO,eAAe,GAAG,SAAlBA,eAAeA,CAAA,EAAS;EAC5B,IAAAC,SAAA,GAA0BZ,QAAQ,CAAe,EAAE,CAAC;IAAAa,UAAA,GAAAC,cAAA,CAAAF,SAAA;IAA7CG,KAAK,GAAAF,UAAA;IAAEG,QAAQ,GAAAH,UAAA;EACtB,IAAAI,UAAA,GAA8BjB,QAAQ,CAAC,EAAE,CAAC;IAAAkB,UAAA,GAAAJ,cAAA,CAAAG,UAAA;IAAnCE,OAAO,GAAAD,UAAA;IAAEE,UAAU,GAAAF,UAAA;EAC1B,IAAAG,UAAA,GAA8BrB,QAAQ,CAAC,KAAK,CAAC;IAAAsB,UAAA,GAAAR,cAAA,CAAAO,UAAA;IAAtCE,OAAO,GAAAD,UAAA;IAAEE,UAAU,GAAAF,UAAA;;EAE1B;EACA,IAAMG,YAAY,GAAG,SAAfA,YAAYA,CAAA,EAAS;IACzBC,OAAO,CAACC,IAAI,CAAC,QAAQ,EAAER,OAAO,CAAC;EACjC,CAAC;EAED,IAAMS,WAAW,GAAG,SAAdA,WAAWA,CAAA,EAAS;IACxBF,OAAO,CAACC,IAAI,CAAC,OAAO,CAAC;EACvB,CAAC;;EAED;EACA,IAAME,UAAU,GAAG,SAAbA,UAAUA,CAAA,EAAS;IACvBH,OAAO,CAACC,IAAI,CAAC,MAAM,CAAC;EACtB,CAAC;;EAED;EACA,IAAMG,YAAY,GAAG,SAAfA,YAAYA,CAAIC,IAAY,EAAK;IACrCX,UAAU,CAACW,IAAI,CAAC;EAClB,CAAC;;EAED;EACA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAIC,GAAQ,EAAK;IACtCT,UAAU,CAAC,IAAI,CAAC;IAChBU,UAAU,CAAC,YAAM;MACfd,UAAU,CAAC,EAAE,CAAC;MACdJ,QAAQ,CAAC,EAAE,CAAC;MACZQ,UAAU,CAAC,KAAK,CAAC;IACnB,CAAC,EAAE,IAAI,CAAC;EACV,CAAC;EAED,oBACErB,IAAA;IAAKgC,KAAK,EAAE;MAAEC,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE,gBAAgB;MAAEC,OAAO,EAAE;IAAG,CAAE;IAAAC,QAAA,eAChEpC,IAAA,CAACF,UAAU;MACTsB,OAAO,EAAEA,OAAQ;MACjBiB,YAAY,EAAE,IAAK;MACnBC,WAAW,EAAE,IAAK;MAClBC,QAAQ,EAAEjB,YAAa;MACvBkB,OAAO,EAAEf,WAAY;MACrBgB,MAAM,EAAEf;IAAW,CACpB;EAAC,CACC,CAAC;AAEV,CAAC;AAED,OAAO,IAAMgB,IAAW,GAAG;EACzBC,MAAM,EAAEnC,eAAe;EACvBoC,IAAI,EAAE,CAAC;AACT,CAAC"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { XAdkSenderProps } from '../../types/XAdkSender';
3
+ declare const XAdkSender: React.FC<XAdkSenderProps>;
4
+ export default XAdkSender;