@ai-group/chat-sdk 2.1.1 → 2.1.4

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 (117) hide show
  1. package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.d.ts +2 -2
  2. package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.js +3 -4
  3. package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.js.map +2 -2
  4. package/dist/cjs/components/XAdkChatbot/index.js +66 -99
  5. package/dist/cjs/components/XAdkChatbot/index.js.map +3 -3
  6. package/dist/cjs/components/XAdkSender/XAdkSender.stories.d.ts +6 -0
  7. package/dist/cjs/components/XAdkSender/XAdkSender.stories.js +119 -0
  8. package/dist/cjs/components/XAdkSender/XAdkSender.stories.js.map +7 -0
  9. package/dist/cjs/components/XAdkSender/index.d.ts +4 -0
  10. package/dist/cjs/components/XAdkSender/index.js +430 -0
  11. package/dist/cjs/components/XAdkSender/index.js.map +7 -0
  12. package/dist/cjs/components/XAdkSender/styles.d.ts +56 -0
  13. package/dist/cjs/components/XAdkSender/styles.js +340 -0
  14. package/dist/cjs/components/XAdkSender/styles.js.map +7 -0
  15. package/dist/cjs/components/XAdkWebProvider/XAdkWebProvider.stories.js +5 -5
  16. package/dist/cjs/components/XAdkWebProvider/XAdkWebProvider.stories.js.map +2 -2
  17. package/dist/cjs/components/XAdkWebProvider/index.js +12 -6
  18. package/dist/cjs/components/XAdkWebProvider/index.js.map +2 -2
  19. package/dist/cjs/components/XAiConversations/index.js +1 -1
  20. package/dist/cjs/components/XAiConversations/index.js.map +2 -2
  21. package/dist/cjs/components/XAiConversations/styles.d.ts +1 -0
  22. package/dist/cjs/components/XAiConversations/styles.js +3 -0
  23. package/dist/cjs/components/XAiConversations/styles.js.map +2 -2
  24. package/dist/cjs/components/XAiSender/XAiSender.stories.js +1 -1
  25. package/dist/cjs/components/XAiSender/XAiSender.stories.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 +7 -16
  29. package/dist/cjs/hooks/useADKChat.js +115 -32
  30. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  31. package/dist/cjs/hooks/useAgentGenerator.js +1 -1
  32. package/dist/cjs/hooks/useAgentGenerator.js.map +2 -2
  33. package/dist/cjs/services/api.d.ts +5 -5
  34. package/dist/cjs/services/api.js +6 -9
  35. package/dist/cjs/services/api.js.map +2 -2
  36. package/dist/cjs/types/XAdkChatbot.d.ts +21 -3
  37. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  38. package/dist/cjs/types/XAdkProvider.d.ts +35 -9
  39. package/dist/cjs/types/XAdkProvider.js.map +1 -1
  40. package/dist/cjs/types/XAdkSender.d.ts +49 -0
  41. package/dist/cjs/types/XAdkSender.js +18 -0
  42. package/dist/cjs/types/XAdkSender.js.map +7 -0
  43. package/dist/cjs/types/XAiProvider.d.ts +1 -28
  44. package/dist/cjs/types/XAiProvider.js.map +2 -2
  45. package/dist/cjs/types/XAiSender.d.ts +2 -0
  46. package/dist/cjs/types/XAiSender.js.map +1 -1
  47. package/dist/cjs/types/common.d.ts +6 -0
  48. package/dist/cjs/types/common.js +18 -0
  49. package/dist/cjs/types/common.js.map +7 -0
  50. package/dist/cjs/types/index.d.ts +2 -0
  51. package/dist/cjs/types/index.js +5 -1
  52. package/dist/cjs/types/index.js.map +2 -2
  53. package/dist/cjs/utils/chat.d.ts +1 -1
  54. package/dist/cjs/utils/umdEntry.d.ts +9 -9
  55. package/dist/cjs/utils/umdEntry.js +1 -0
  56. package/dist/cjs/utils/umdEntry.js.map +2 -2
  57. package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.d.ts +2 -2
  58. package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.js +3 -3
  59. package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.js.map +1 -1
  60. package/dist/esm/components/XAdkChatbot/index.js +80 -126
  61. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  62. package/dist/esm/components/XAdkSender/XAdkSender.stories.d.ts +6 -0
  63. package/dist/esm/components/XAdkSender/XAdkSender.stories.js +126 -0
  64. package/dist/esm/components/XAdkSender/XAdkSender.stories.js.map +1 -0
  65. package/dist/esm/components/XAdkSender/index.d.ts +4 -0
  66. package/dist/esm/components/XAdkSender/index.js +589 -0
  67. package/dist/esm/components/XAdkSender/index.js.map +1 -0
  68. package/dist/esm/components/XAdkSender/styles.d.ts +56 -0
  69. package/dist/esm/components/XAdkSender/styles.js +50 -0
  70. package/dist/esm/components/XAdkSender/styles.js.map +1 -0
  71. package/dist/esm/components/XAdkWebProvider/XAdkWebProvider.stories.js +10 -11
  72. package/dist/esm/components/XAdkWebProvider/XAdkWebProvider.stories.js.map +1 -1
  73. package/dist/esm/components/XAdkWebProvider/index.js +25 -10
  74. package/dist/esm/components/XAdkWebProvider/index.js.map +1 -1
  75. package/dist/esm/components/XAiConversations/index.js +1 -0
  76. package/dist/esm/components/XAiConversations/index.js.map +1 -1
  77. package/dist/esm/components/XAiConversations/styles.d.ts +1 -0
  78. package/dist/esm/components/XAiConversations/styles.js +15 -14
  79. package/dist/esm/components/XAiConversations/styles.js.map +1 -1
  80. package/dist/esm/components/XAiSender/XAiSender.stories.js +1 -1
  81. package/dist/esm/components/XAiSender/XAiSender.stories.js.map +1 -1
  82. package/dist/esm/components/XAiSender/index.js +16 -22
  83. package/dist/esm/components/XAiSender/index.js.map +1 -1
  84. package/dist/esm/hooks/useADKChat.d.ts +7 -16
  85. package/dist/esm/hooks/useADKChat.js +212 -88
  86. package/dist/esm/hooks/useADKChat.js.map +1 -1
  87. package/dist/esm/hooks/useAgentGenerator.js +1 -1
  88. package/dist/esm/hooks/useAgentGenerator.js.map +1 -1
  89. package/dist/esm/services/api.d.ts +5 -5
  90. package/dist/esm/services/api.js +8 -11
  91. package/dist/esm/services/api.js.map +1 -1
  92. package/dist/esm/types/XAdkChatbot.d.ts +21 -3
  93. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  94. package/dist/esm/types/XAdkProvider.d.ts +35 -9
  95. package/dist/esm/types/XAdkProvider.js.map +1 -1
  96. package/dist/esm/types/XAdkSender.d.ts +49 -0
  97. package/dist/esm/types/XAdkSender.js +2 -0
  98. package/dist/esm/types/XAdkSender.js.map +1 -0
  99. package/dist/esm/types/XAiProvider.d.ts +1 -28
  100. package/dist/esm/types/XAiProvider.js +0 -7
  101. package/dist/esm/types/XAiProvider.js.map +1 -1
  102. package/dist/esm/types/XAiSender.d.ts +2 -0
  103. package/dist/esm/types/XAiSender.js.map +1 -1
  104. package/dist/esm/types/common.d.ts +6 -0
  105. package/dist/esm/types/common.js +2 -0
  106. package/dist/esm/types/common.js.map +1 -0
  107. package/dist/esm/types/index.d.ts +2 -0
  108. package/dist/esm/types/index.js +2 -0
  109. package/dist/esm/types/index.js.map +1 -1
  110. package/dist/esm/utils/chat.d.ts +1 -1
  111. package/dist/esm/utils/chat.js +4 -4
  112. package/dist/esm/utils/chat.js.map +1 -1
  113. package/dist/esm/utils/umdEntry.d.ts +9 -9
  114. package/dist/esm/utils/umdEntry.js +1 -1
  115. package/dist/esm/utils/umdEntry.js.map +1 -1
  116. package/dist/umd/chat-sdk.min.js +1 -1
  117. package/package.json +1 -1
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
- import type { IMessage } from "../../../../types";
2
+ import type { IMessage, FunctionCall } from "../../../../types";
3
3
  export interface FunctionCallRenderProps {
4
4
  msg: IMessage;
5
5
  showDetail?: boolean;
6
- onConfirm?: (confirmed: boolean) => void;
6
+ onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;
7
7
  }
8
8
  declare const FunctionCallRender: React.FC<FunctionCallRenderProps>;
9
9
  export default FunctionCallRender;
@@ -54,12 +54,11 @@ var FunctionCallRender = ({ msg, showDetail, onConfirm }) => {
54
54
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.wrapper, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.confirm, children: [
55
55
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mb-4", children: [
56
56
  "请确认是否执行工具:",
57
- originalFn == null ? void 0 : originalFn.name,
58
- "?"
57
+ originalFn == null ? void 0 : originalFn.name
59
58
  ] }),
60
59
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_antd.Flex, { justify: "end", gap: 8, children: [
61
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Button, { type: "default", onClick: () => onConfirm == null ? void 0 : onConfirm(false), children: "取消" }),
62
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Button, { type: "primary", onClick: () => onConfirm == null ? void 0 : onConfirm(true), children: "确认" })
60
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Button, { type: "default", onClick: () => onConfirm == null ? void 0 : onConfirm(fnCall, false), children: "取消" }),
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Button, { type: "primary", onClick: () => onConfirm == null ? void 0 : onConfirm(fnCall, true), children: "确认" })
63
62
  ] })
64
63
  ] }) }, msg.id);
65
64
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/components/XAdkChatbot/components/FunctionCallRender/index.tsx"],
4
- "sourcesContent": ["import React from 'react';\nimport { Alert, Button, Flex, Form, Popover, Tooltip, Typography } from 'antd';\nimport { CopyOutlined, ToolOutlined, CheckCircleTwoTone, LoadingOutlined, UserSwitchOutlined, InfoCircleOutlined } from '@ant-design/icons';\nimport type { IMessage, FunctionCall } from '@/types';\nimport { useStyles } from './styles';\nimport JsonView from '@/components/XAiJsonView';\n\nexport interface FunctionCallRenderProps {\n msg: IMessage;\n showDetail?: boolean;\n onConfirm?: (confirmed: boolean) => void;\n}\n\nconst FunctionCallRender: React.FC<FunctionCallRenderProps> = ({ msg, showDetail, onConfirm }) => {\n const styles = useStyles();\n const fnCall = msg.functionCall as FunctionCall;\n const fnRes = msg.functionResponse;\n const name = fnCall?.name || fnRes?.name;\n if (name === 'adk_request_confirmation') {\n if (fnRes) {\n if (msg.role === 'bot') return null;\n const confirmed = fnRes.response?.confirmed;\n return (\n <div key={msg.id} className={styles.wrapper}>\n {confirmed\n ? <Alert message=\"已确认\" type=\"success\" showIcon className={styles.alert} />\n : <Alert message=\"已取消\" type=\"error\" showIcon className={styles.alert} />}\n </div>\n );\n }\n const originalFn = msg?.functionCall?.args?.originalFunctionCall;\n return (\n <div key={msg.id} className={styles.wrapper}>\n <div className={styles.confirm}>\n <div className=\"mb-4\">请确认是否执行工具:{originalFn?.name}?</div>\n <Flex justify=\"end\" gap={8}>\n <Button type=\"default\" onClick={() => onConfirm?.(false)}>取消</Button>\n <Button type=\"primary\" onClick={() => onConfirm?.(true)}>\n 确认\n </Button>\n </Flex>\n </div>\n </div>\n );\n }\n if (name === 'transferToAgent') {\n const agentName = fnCall.args?.agentName;\n return (\n <div key={msg.id} className={styles.wrapper}>\n <div className={styles.fnCall}>\n <UserSwitchOutlined style={{ color: '#888' }} />\n <Typography.Text\n ellipsis={{ tooltip: agentName }}\n style={{ maxWidth: 300, lineHeight: '16px' }}\n >\n 任务转交:{agentName}\n </Typography.Text>\n {msg.functionResponse\n ? <CheckCircleTwoTone twoToneColor=\"#52c41a\" />\n : <LoadingOutlined />}\n </div>\n </div>\n );\n }\n const renderItem = (obj: any, text: string) => {\n const str = JSON.stringify(obj, null, 2);\n return (\n <Form.Item\n label={(\n <Flex align=\"center\">\n <span className=\"mr-2\">{text}</span>\n <Typography.Text\n copyable={{\n text: str,\n icon: <CopyOutlined />,\n }}\n />\n </Flex>\n )}\n style={{ marginBottom: 12 }}\n >\n <JsonView value={str} />\n </Form.Item>\n );\n };\n const renderResponse = () => {\n const res = msg.functionResponse;\n if (res) {\n if (res.response?.error) {\n return (\n <Tooltip title={res.response.error}>\n <InfoCircleOutlined style={{ color: '#faad14' }} />\n </Tooltip>\n );\n }\n return <CheckCircleTwoTone twoToneColor=\"#52c41a\" />;\n }\n return <LoadingOutlined />;\n };\n return (\n <div key={msg.id} className={styles.wrapper}>\n {showDetail ? (\n <Popover\n placement=\"left\"\n content={(\n <Form style={{ width: 400 }} layout=\"vertical\">\n {renderItem(fnCall.args, '工具参数')}\n {renderItem(msg.functionResponse?.response, '工具响应')}\n </Form>\n )}\n >\n <div className={styles.fnCall}>\n <ToolOutlined style={{ color: '#888' }} />\n <Typography.Text\n ellipsis={{ tooltip: name }}\n style={{ maxWidth: 300, lineHeight: '16px' }}\n >\n 调用工具:{name}\n </Typography.Text>\n {renderResponse()}\n </div>\n </Popover>\n ) : (\n <div className={styles.fnCall}>\n <ToolOutlined style={{ color: '#888' }} />\n <Typography.Text\n ellipsis={{ tooltip: name }}\n style={{ maxWidth: 300, lineHeight: '16px' }}\n >\n 调用工具:{name}\n </Typography.Text>\n {renderResponse()}\n </div>\n )}\n </div>\n );\n};\n\nexport default FunctionCallRender;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React from 'react';\nimport { Alert, Button, Flex, Form, Popover, Tooltip, Typography } from 'antd';\nimport { CopyOutlined, ToolOutlined, CheckCircleTwoTone, LoadingOutlined, UserSwitchOutlined, InfoCircleOutlined } from '@ant-design/icons';\nimport type { IMessage, FunctionCall } from '@/types';\nimport { useStyles } from './styles';\nimport JsonView from '@/components/XAiJsonView';\n\nexport interface FunctionCallRenderProps {\n msg: IMessage;\n showDetail?: boolean;\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n}\n\nconst FunctionCallRender: React.FC<FunctionCallRenderProps> = ({ msg, showDetail, onConfirm }) => {\n const styles = useStyles();\n const fnCall = msg.functionCall as FunctionCall;\n const fnRes = msg.functionResponse;\n const name = fnCall?.name || fnRes?.name;\n if (name === 'adk_request_confirmation') {\n if (fnRes) {\n if (msg.role === 'bot') return null;\n const confirmed = fnRes.response?.confirmed;\n return (\n <div key={msg.id} className={styles.wrapper}>\n {confirmed\n ? <Alert message=\"已确认\" type=\"success\" showIcon className={styles.alert} />\n : <Alert message=\"已取消\" type=\"error\" showIcon className={styles.alert} />}\n </div>\n );\n }\n const originalFn = msg?.functionCall?.args?.originalFunctionCall;\n return (\n <div key={msg.id} className={styles.wrapper}>\n <div className={styles.confirm}>\n <div className=\"mb-4\">请确认是否执行工具:{originalFn?.name}</div>\n <Flex justify=\"end\" gap={8}>\n <Button type=\"default\" onClick={() => onConfirm?.(fnCall, false)}>取消</Button>\n <Button type=\"primary\" onClick={() => onConfirm?.(fnCall, true)}>\n 确认\n </Button>\n </Flex>\n </div>\n </div>\n );\n }\n if (name === 'transferToAgent') {\n const agentName = fnCall.args?.agentName;\n return (\n <div key={msg.id} className={styles.wrapper}>\n <div className={styles.fnCall}>\n <UserSwitchOutlined style={{ color: '#888' }} />\n <Typography.Text\n ellipsis={{ tooltip: agentName }}\n style={{ maxWidth: 300, lineHeight: '16px' }}\n >\n 任务转交:{agentName}\n </Typography.Text>\n {msg.functionResponse\n ? <CheckCircleTwoTone twoToneColor=\"#52c41a\" />\n : <LoadingOutlined />}\n </div>\n </div>\n );\n }\n const renderItem = (obj: any, text: string) => {\n const str = JSON.stringify(obj, null, 2);\n return (\n <Form.Item\n label={(\n <Flex align=\"center\">\n <span className=\"mr-2\">{text}</span>\n <Typography.Text\n copyable={{\n text: str,\n icon: <CopyOutlined />,\n }}\n />\n </Flex>\n )}\n style={{ marginBottom: 12 }}\n >\n <JsonView value={str} />\n </Form.Item>\n );\n };\n const renderResponse = () => {\n const res = msg.functionResponse;\n if (res) {\n if (res.response?.error) {\n return (\n <Tooltip title={res.response.error}>\n <InfoCircleOutlined style={{ color: '#faad14' }} />\n </Tooltip>\n );\n }\n return <CheckCircleTwoTone twoToneColor=\"#52c41a\" />;\n }\n return <LoadingOutlined />;\n };\n return (\n <div key={msg.id} className={styles.wrapper}>\n {showDetail ? (\n <Popover\n placement=\"left\"\n content={(\n <Form style={{ width: 400 }} layout=\"vertical\">\n {renderItem(fnCall.args, '工具参数')}\n {renderItem(msg.functionResponse?.response, '工具响应')}\n </Form>\n )}\n >\n <div className={styles.fnCall}>\n <ToolOutlined style={{ color: '#888' }} />\n <Typography.Text\n ellipsis={{ tooltip: name }}\n style={{ maxWidth: 300, lineHeight: '16px' }}\n >\n 调用工具:{name}\n </Typography.Text>\n {renderResponse()}\n </div>\n </Popover>\n ) : (\n <div className={styles.fnCall}>\n <ToolOutlined style={{ color: '#888' }} />\n <Typography.Text\n ellipsis={{ tooltip: name }}\n style={{ maxWidth: 300, lineHeight: '16px' }}\n >\n 调用工具:{name}\n </Typography.Text>\n {renderResponse()}\n </div>\n )}\n </div>\n );\n};\n\nexport default FunctionCallRender;\n"],
5
+ "mappings": "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",
6
6
  "names": ["JsonView", "_a"]
7
7
  }
@@ -32,70 +32,86 @@ __export(XAdkChatbot_exports, {
32
32
  default: () => XAdkChatbot_default
33
33
  });
34
34
  module.exports = __toCommonJS(XAdkChatbot_exports);
35
- var import_react = __toESM(require("react"));
35
+ var import_react = require("react");
36
36
  var import_antd = require("antd");
37
37
  var import_icons = require("@ant-design/icons");
38
38
  var import_styles = require("./styles");
39
39
  var import_MarkdownRender = __toESM(require("./components/MarkdownRender"));
40
40
  var import_FunctionCallRender = __toESM(require("./components/FunctionCallRender"));
41
41
  var import_ThinkRender = __toESM(require("./components/ThinkRender"));
42
+ var import_XAdkSender = __toESM(require("../XAdkSender"));
42
43
  var import_jsx_runtime = require("react/jsx-runtime");
44
+ var scrollThreshold = 10;
43
45
  var XAdkChatbot = ({
44
- loading,
46
+ allowUpload = false,
47
+ uploadRequest = () => {
48
+ },
49
+ loading = false,
45
50
  prologue,
46
51
  suggestions,
47
52
  messages,
53
+ initialized = true,
48
54
  footer,
49
55
  showFnCallDetail,
50
56
  clearBtnShow = true,
57
+ onConfirm,
51
58
  onSubmit,
52
59
  onSuggest,
53
60
  onStop,
54
61
  onClear
55
62
  }) => {
56
63
  const styles = (0, import_styles.useStyles)();
57
- const [inputValue, setInputValue] = import_react.default.useState("");
58
- const [showLog, setShowLog] = (0, import_react.useState)(false);
59
- const [invocation, setInvocation] = (0, import_react.useState)();
60
64
  const listRef = (0, import_react.useRef)(null);
61
- const scrollTimeoutRef = (0, import_react.useRef)(null);
62
- const isFirstLoadRef = (0, import_react.useRef)(true);
63
- const scrollToBottom = (0, import_react.useCallback)((smooth = false) => {
64
- if (!listRef.current)
65
+ const lastScrollTopRef = (0, import_react.useRef)(0);
66
+ const userHasScrolledRef = (0, import_react.useRef)(false);
67
+ const messagesEndRef = (0, import_react.useRef)(null);
68
+ (0, import_react.useEffect)(() => {
69
+ var _a;
70
+ if (!loading)
65
71
  return;
66
- if (scrollTimeoutRef.current) {
67
- clearTimeout(scrollTimeoutRef.current);
68
- }
69
- listRef.current.scrollTo({
70
- top: listRef.current.scrollHeight,
71
- behavior: smooth ? "smooth" : "instant"
72
+ if (userHasScrolledRef.current)
73
+ return;
74
+ (_a = messagesEndRef.current) == null ? void 0 : _a.scrollIntoView({
75
+ behavior: "smooth"
72
76
  });
73
- scrollTimeoutRef.current = setTimeout(() => {
74
- if (listRef.current) {
75
- listRef.current.scrollTo({
76
- top: listRef.current.scrollHeight,
77
- behavior: smooth ? "smooth" : "instant"
78
- });
79
- }
80
- }, 100);
77
+ }, [loading, messages]);
78
+ const handleScroll = (0, import_react.useCallback)(() => {
79
+ const el = listRef.current;
80
+ if (!el)
81
+ return;
82
+ const currentTop = el.scrollTop;
83
+ if (currentTop < lastScrollTopRef.current) {
84
+ userHasScrolledRef.current = true;
85
+ }
86
+ const isAtBottom = Math.abs(el.scrollHeight - currentTop - el.clientHeight) <= scrollThreshold;
87
+ if (isAtBottom) {
88
+ userHasScrolledRef.current = false;
89
+ }
90
+ lastScrollTopRef.current = currentTop;
81
91
  }, []);
82
92
  (0, import_react.useEffect)(() => {
83
- if (isFirstLoadRef.current) {
84
- scrollToBottom(false);
85
- isFirstLoadRef.current = false;
86
- } else {
87
- scrollToBottom(true);
88
- }
89
- }, [messages, suggestions, scrollToBottom]);
90
- const handleSubmit = (0, import_react.useCallback)((text) => {
93
+ const listElement = listRef.current;
94
+ if (!listElement)
95
+ return;
96
+ listElement.addEventListener("scroll", handleScroll);
97
+ return () => {
98
+ listElement.removeEventListener("scroll", handleScroll);
99
+ };
100
+ }, []);
101
+ const handleSubmit = ({ text, files }) => {
91
102
  if (loading)
92
103
  return;
93
104
  if (!(text == null ? void 0 : text.trim()))
94
105
  return;
95
- onSubmit == null ? void 0 : onSubmit(text);
96
- setInputValue("");
97
- scrollToBottom(true);
98
- }, [loading, scrollToBottom]);
106
+ onSubmit == null ? void 0 : onSubmit({ text, files });
107
+ queueMicrotask(() => {
108
+ var _a;
109
+ (_a = messagesEndRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "instant" });
110
+ });
111
+ setTimeout(() => {
112
+ userHasScrolledRef.current = false;
113
+ }, 0);
114
+ };
99
115
  const lastIndex = messages.length - 1;
100
116
  const lastMessageMap = (0, import_react.useMemo)(() => {
101
117
  const map = /* @__PURE__ */ new Map();
@@ -143,7 +159,7 @@ var XAdkChatbot = ({
143
159
  const fnCall = msg.functionCall;
144
160
  if (fnCall) {
145
161
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.botMsg, children: [
146
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_FunctionCallRender.default, { msg, showDetail: showFnCallDetail }),
162
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_FunctionCallRender.default, { msg, showDetail: showFnCallDetail, onConfirm }),
147
163
  !isLoading && (footer == null ? void 0 : footer({ message: msg, isLastMsg: isLast, isLastBotMsg }))
148
164
  ] }, `${msg.id}-${i}`);
149
165
  }
@@ -162,70 +178,21 @@ var XAdkChatbot = ({
162
178
  },
163
179
  children: item
164
180
  }
165
- ) }) }, item)) })
181
+ ) }) }, item)) }),
182
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ref: messagesEndRef })
166
183
  ] }),
167
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.footer, children: [
168
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.senderWrap, children: [
169
- clearBtnShow && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
170
- import_antd.Popconfirm,
171
- {
172
- title: "确定要清空聊天记录吗?",
173
- onConfirm: onClear,
174
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
175
- import_antd.Button,
176
- {
177
- shape: "circle",
178
- icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.ClearOutlined, {})
179
- }
180
- )
181
- }
182
- ),
183
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.sender, children: [
184
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
185
- import_antd.Input.TextArea,
186
- {
187
- className: styles.input,
188
- rows: 1,
189
- autoSize: { minRows: 1, maxRows: 4 },
190
- value: inputValue,
191
- onChange: (e) => {
192
- setInputValue(e.target.value);
193
- },
194
- onPressEnter: async (e) => {
195
- if (e.shiftKey) {
196
- return;
197
- }
198
- e.preventDefault();
199
- handleSubmit(inputValue);
200
- },
201
- placeholder: "请输入消息"
202
- }
203
- ),
204
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
205
- import_antd.Button,
206
- {
207
- type: "primary",
208
- shape: "circle",
209
- icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.LoadingOutlined, {}),
210
- onClick: () => {
211
- onStop == null ? void 0 : onStop();
212
- }
213
- }
214
- ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
215
- import_antd.Button,
216
- {
217
- type: "primary",
218
- shape: "circle",
219
- icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.ArrowUpOutlined, {}),
220
- onClick: () => {
221
- handleSubmit(inputValue);
222
- }
223
- }
224
- ) })
225
- ] })
226
- ] }),
227
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.tip, children: "内容由AI生成,无法确保真实准确,仅供参考" })
228
- ] })
184
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
185
+ import_XAdkSender.default,
186
+ {
187
+ allowUpload,
188
+ uploadRequest,
189
+ loading,
190
+ clearBtnShow,
191
+ onSubmit: handleSubmit,
192
+ onClear,
193
+ onStop
194
+ }
195
+ )
229
196
  ] });
230
197
  };
231
198
  var XAdkChatbot_default = XAdkChatbot;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAdkChatbot/index.tsx"],
4
- "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;"],
5
- "mappings": "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",
6
- "names": ["React", "FunctionCallRender", "ThinkRender", "MarkdownRender"]
4
+ "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 uploadRequest = () => {},\n loading = false,\n prologue,\n suggestions,\n messages,\n initialized = true,\n footer,\n showFnCallDetail,\n clearBtnShow = true,\n onConfirm,\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} onConfirm={onConfirm}/>\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 uploadRequest={uploadRequest}\n loading={loading}\n clearBtnShow={clearBtnShow}\n onSubmit={handleSubmit}\n onClear={onClear}\n onStop={onStop}\n />\n </div>\n );\n};\n\nexport default XAdkChatbot;"],
5
+ "mappings": "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",
6
+ "names": ["FunctionCallRender", "ThinkRender", "MarkdownRender", "XAdkSender"]
7
7
  }
@@ -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,119 @@
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/XAdkSender/XAdkSender.stories.tsx
30
+ var XAdkSender_stories_exports = {};
31
+ __export(XAdkSender_stories_exports, {
32
+ default: () => XAdkSender_stories_default,
33
+ 基础用法: () => 基础用法
34
+ });
35
+ module.exports = __toCommonJS(XAdkSender_stories_exports);
36
+ var import_react = require("react");
37
+ var import__ = __toESM(require("."));
38
+ var import_jsx_runtime = require("react/jsx-runtime");
39
+ var meta = {
40
+ title: "AI组件/XAdkSender 输入框",
41
+ component: import__.default,
42
+ parameters: {
43
+ layout: "centered"
44
+ },
45
+ tags: ["autodocs"],
46
+ argTypes: {}
47
+ };
48
+ var XAdkSender_stories_default = meta;
49
+ var BasicUsageStory = () => {
50
+ const [files, setFiles] = (0, import_react.useState)([]);
51
+ const [content, setContent] = (0, import_react.useState)("");
52
+ const [loading, setLoading] = (0, import_react.useState)(false);
53
+ const handleSubmit = (data) => {
54
+ console.info("submit", data);
55
+ };
56
+ const handleClear = () => {
57
+ console.info("clear");
58
+ };
59
+ const handleStop = () => {
60
+ console.info("stop");
61
+ };
62
+ const handleChange = (text) => {
63
+ setContent(text);
64
+ };
65
+ const handleSendMessage = (obj) => {
66
+ setLoading(true);
67
+ setTimeout(() => {
68
+ setContent("");
69
+ setFiles([]);
70
+ setLoading(false);
71
+ }, 2e3);
72
+ };
73
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { width: 800, border: "1px solid #eee", padding: 20 }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
74
+ import__.default,
75
+ {
76
+ loading,
77
+ clearBtnShow: true,
78
+ allowUpload: true,
79
+ uploadRequest: async ({ file, onProgress, onSuccess, onError }) => {
80
+ try {
81
+ const formData = new FormData();
82
+ formData.append("file", file);
83
+ let progress = 0;
84
+ const interval = setInterval(() => {
85
+ progress += 10;
86
+ onProgress == null ? void 0 : onProgress({ percent: progress });
87
+ if (progress >= 100) {
88
+ clearInterval(interval);
89
+ const mockResponse = {
90
+ code: 200,
91
+ data: {
92
+ fileId: Math.floor(Math.random() * 1e3) + 1,
93
+ tempUrl: `https://example.com/uploads/${file.name}`,
94
+ fileName: file.name,
95
+ fileType: file.name.split(".").pop() || ""
96
+ }
97
+ };
98
+ onSuccess == null ? void 0 : onSuccess(mockResponse);
99
+ }
100
+ }, 100);
101
+ } catch (error) {
102
+ onError == null ? void 0 : onError(error);
103
+ }
104
+ },
105
+ onSubmit: handleSubmit,
106
+ onClear: handleClear,
107
+ onStop: handleStop
108
+ }
109
+ ) });
110
+ };
111
+ var 基础用法 = {
112
+ render: BasicUsageStory,
113
+ args: {}
114
+ };
115
+ // Annotate the CommonJS export names for ESM import in node:
116
+ 0 && (module.exports = {
117
+ 基础用法
118
+ });
119
+ //# sourceMappingURL=XAdkSender.stories.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/components/XAdkSender/XAdkSender.stories.tsx"],
4
+ "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 = (data: any) => {\n console.info('submit', data);\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 uploadRequest={async ({ file, onProgress, onSuccess, onError }) => {\n try {\n // 创建 FormData\n const formData = new FormData();\n formData.append('file', file);\n \n // 模拟上传进度\n let progress = 0;\n const interval = setInterval(() => {\n progress += 10;\n onProgress?.({ percent: progress });\n \n if (progress >= 100) {\n clearInterval(interval);\n // 模拟成功响应\n const mockResponse = {\n code: 200,\n data: {\n fileId: Math.floor(Math.random() * 1000) + 1,\n tempUrl: `https://example.com/uploads/${file.name}`,\n fileName: file.name,\n fileType: file.name.split('.').pop() || ''\n }\n };\n onSuccess?.(mockResponse);\n }\n }, 100);\n \n } catch (error) {\n onError?.(error as Error);\n }\n }}\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"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAyB;AAGzB,eAAuB;AAoDjB;AAlDN,IAAM,OAAgC;AAAA,EACpC,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,6BAAQ;AAIf,IAAM,kBAAkB,MAAM;AAC5B,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,EAAE;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAG5C,QAAM,eAAe,CAAC,SAAc;AAClC,YAAQ,KAAK,UAAU,IAAI;AAAA,EAC7B;AAEA,QAAM,cAAc,MAAM;AACxB,YAAQ,KAAK,OAAO;AAAA,EACtB;AAGA,QAAM,aAAa,MAAM;AACvB,YAAQ,KAAK,MAAM;AAAA,EACrB;AAGA,QAAM,eAAe,CAAC,SAAiB;AACrC,eAAW,IAAI;AAAA,EACjB;AAGA,QAAM,oBAAoB,CAAC,QAAa;AACtC,eAAW,IAAI;AACf,eAAW,MAAM;AACf,iBAAW,EAAE;AACb,eAAS,CAAC,CAAC;AACX,iBAAW,KAAK;AAAA,IAClB,GAAG,GAAI;AAAA,EACT;AAEA,SACE,4CAAC,SAAI,OAAO,EAAE,OAAO,KAAK,QAAQ,kBAAkB,SAAS,GAAG,GAC9D;AAAA,IAAC,SAAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,MACb,eAAe,OAAO,EAAE,MAAM,YAAY,WAAW,QAAQ,MAAM;AACjE,YAAI;AAEF,gBAAM,WAAW,IAAI,SAAS;AAC9B,mBAAS,OAAO,QAAQ,IAAI;AAG5B,cAAI,WAAW;AACf,gBAAM,WAAW,YAAY,MAAM;AACjC,wBAAY;AACZ,qDAAa,EAAE,SAAS,SAAS;AAEjC,gBAAI,YAAY,KAAK;AACnB,4BAAc,QAAQ;AAEtB,oBAAM,eAAe;AAAA,gBACnB,MAAM;AAAA,gBACN,MAAM;AAAA,kBACJ,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,GAAI,IAAI;AAAA,kBAC3C,SAAS,+BAA+B,KAAK;AAAA,kBAC7C,UAAU,KAAK;AAAA,kBACf,UAAU,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,gBAC1C;AAAA,cACF;AACA,qDAAY;AAAA,YACd;AAAA,UACF,GAAG,GAAG;AAAA,QAER,SAAS,OAAP;AACA,6CAAU;AAAA,QACZ;AAAA,MACF;AAAA,MACA,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQ;AAAA;AAAA,EACV,GACF;AAEJ;AAEO,IAAM,OAAc;AAAA,EACzB,QAAQ;AAAA,EACR,MAAM,CAAC;AACT;",
6
+ "names": ["XAdkSender"]
7
+ }
@@ -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;