@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,5 +1,6 @@
1
1
  import React from 'react';
2
2
  export declare const useStyles: () => {
3
+ conversationsWrapper: string;
3
4
  capWrapper: string;
4
5
  capShape: string;
5
6
  capIcon: string;
@@ -38,6 +38,9 @@ var slideOutRight = import_css.keyframes`
38
38
  `;
39
39
  var useStyles = (0, import_common.withBasicStyles)(() => ({
40
40
  // 静态样式
41
+ conversationsWrapper: import_css.css`
42
+ overflow: hidden;
43
+ `,
41
44
  capWrapper: import_css.css`
42
45
  padding: 12px 16px;
43
46
  display: flex;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiConversations/styles.tsx"],
4
- "sourcesContent": ["import React from 'react';\nimport { css, keyframes } from '@emotion/css';\nimport { css as globalCss, Global } from '@emotion/react';\nimport { withBasicStyles } from '@/styles/common';\n\nconst primaryBlue = '#0078FF'; // 主蓝色\nconst lightBlue = '#E6F0FF'; // 浅蓝色气泡背景\nconst darkGray = '#333'; // 深灰色文本\nconst lightGray = '#888'; // 浅灰文本\nconst borderGray = '#ddd'; // 边框灰色\n\nconst slideInRight = keyframes`\n from { transform: translateX(-100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideOutRight = keyframes`\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(-100%); opacity: 0; }\n`;\n\nexport const useStyles = withBasicStyles(() => ({\n // 静态样式\n capWrapper: css`\n padding: 12px 16px;\n display: flex;\n align-items: center;\n `,\n\n capShape: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 80px;\n height: 40px;\n margin-left: 16px;\n background: #FFFFFF;\n box-shadow: 0px 4px 16px 0px rgba(127,135,166,0.08);\n border-radius: 24px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n transition: box-shadow 0.2s, border-color 0.2s;\n cursor: pointer;\n /* &:hover {\n box-shadow: 0px 4px 24px 0px rgba(127,135,166,0.16);\n border-color: ${primaryBlue};\n } */\n `,\n\n capIcon: css`\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n\n img {\n width: 17px;\n }\n\n &:hover {\n background: #F2F2F2;\n border-radius: 50%;\n }\n `,\n\n addChatBtn: css`\n width: 256px;\n height: 40px;\n margin: 17px auto 24px;\n background: #FFFFFF;\n border-radius: 20px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #343434;\n\n &:hover {\n color: #3961F2;\n }\n\n &:active {\n color: #0A3BEE;\n }\n `,\n\n tipTitle: css`\n font-size: 12px;\n color: #949494;\n padding-left: 24px;\n `,\n\n fWrapper: css`\n background: #F8FBFF;\n padding: 16px 0 13px;\n width: 280px;\n height: 100%;\n box-sizing: border-box;\n position: relative;\n `,\n\n nWrapper: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 280px;\n height: 100%;\n z-index: 1000;\n transition: left 0.3s ease;\n background: #F8FBFF;\n padding: 16px 0 13px;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n `,\n\n mask: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.15);\n z-index: 999;\n cursor: pointer;\n `,\n\n fheaderWrapper: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 11px 0 16px;\n `,\n\n scrollList: css`\n max-height: calc(100vh - 120px); /* 120px为头部高度,可根据实际调整 */\n padding-bottom: 15px;\n overflow-y: auto;\n\n /* 隐藏滚动条(Chrome, Edge, Safari) */\n &::-webkit-scrollbar {\n width: 0;\n height: 0;\n display: none;\n background: transparent;\n }\n\n /* 隐藏滚动条(Firefox) */\n scrollbar-width: none;\n\n /* 隐藏滚动条(IE/Edge) */\n -ms-overflow-style: none;\n `,\n\n slideIn: css`\n animation: ${slideInRight} 0.3s forwards;\n `,\n slideOut: css`\n animation: ${slideOutRight} 0.3s forwards;\n `,\n\n}));\n\nexport const GlobalStyle: React.FC = () => (\n <Global\n styles={globalCss`\n .ant-conversations .ant-conversations-item-active {\n background: rgba(57,97,242,0.08);\n }\n\n .ant-conversations .ant-conversations-item-active .ant-conversations-label {\n color: #3961F2;\n }\n `}\n />\n);\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA+B;AAC/B,mBAAyC;AACzC,oBAAgC;AAmK9B;AAjKF,IAAM,cAAc;AAMpB,IAAM,eAAe;AAAA;AAAA;AAAA;AAKrB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAKf,IAAM,gBAAY,+BAAgB,OAAO;AAAA;AAAA,EAE9C,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAgBU;AAAA;AAAA;AAAA,EAIpB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBT,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaV,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWN,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBZ,SAAS;AAAA,iBACM;AAAA;AAAA,EAEf,UAAU;AAAA,iBACK;AAAA;AAGjB,EAAE;AAEK,IAAM,cAAwB,MACnC;AAAA,EAAC;AAAA;AAAA,IACC,QAAQ,aAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV;",
4
+ "sourcesContent": ["import React from 'react';\nimport { css, keyframes } from '@emotion/css';\nimport { css as globalCss, Global } from '@emotion/react';\nimport { withBasicStyles } from '@/styles/common';\n\nconst primaryBlue = '#0078FF'; // 主蓝色\nconst lightBlue = '#E6F0FF'; // 浅蓝色气泡背景\nconst darkGray = '#333'; // 深灰色文本\nconst lightGray = '#888'; // 浅灰文本\nconst borderGray = '#ddd'; // 边框灰色\n\nconst slideInRight = keyframes`\n from { transform: translateX(-100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideOutRight = keyframes`\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(-100%); opacity: 0; }\n`;\n\nexport const useStyles = withBasicStyles(() => ({\n // 静态样式\n conversationsWrapper: css`\n overflow: hidden;\n `,\n\n capWrapper: css`\n padding: 12px 16px;\n display: flex;\n align-items: center;\n `,\n\n capShape: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 80px;\n height: 40px;\n margin-left: 16px;\n background: #FFFFFF;\n box-shadow: 0px 4px 16px 0px rgba(127,135,166,0.08);\n border-radius: 24px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n transition: box-shadow 0.2s, border-color 0.2s;\n cursor: pointer;\n /* &:hover {\n box-shadow: 0px 4px 24px 0px rgba(127,135,166,0.16);\n border-color: ${primaryBlue};\n } */\n `,\n\n capIcon: css`\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n\n img {\n width: 17px;\n }\n\n &:hover {\n background: #F2F2F2;\n border-radius: 50%;\n }\n `,\n\n addChatBtn: css`\n width: 256px;\n height: 40px;\n margin: 17px auto 24px;\n background: #FFFFFF;\n border-radius: 20px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #343434;\n\n &:hover {\n color: #3961F2;\n }\n\n &:active {\n color: #0A3BEE;\n }\n `,\n\n tipTitle: css`\n font-size: 12px;\n color: #949494;\n padding-left: 24px;\n `,\n\n fWrapper: css`\n background: #F8FBFF;\n padding: 16px 0 13px;\n width: 280px;\n height: 100%;\n box-sizing: border-box;\n position: relative;\n `,\n\n nWrapper: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 280px;\n height: 100%;\n z-index: 1000;\n transition: left 0.3s ease;\n background: #F8FBFF;\n padding: 16px 0 13px;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n `,\n\n mask: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.15);\n z-index: 999;\n cursor: pointer;\n `,\n\n fheaderWrapper: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 11px 0 16px;\n `,\n\n scrollList: css`\n max-height: calc(100vh - 120px); /* 120px为头部高度,可根据实际调整 */\n padding-bottom: 15px;\n overflow-y: auto;\n\n /* 隐藏滚动条(Chrome, Edge, Safari) */\n &::-webkit-scrollbar {\n width: 0;\n height: 0;\n display: none;\n background: transparent;\n }\n\n /* 隐藏滚动条(Firefox) */\n scrollbar-width: none;\n\n /* 隐藏滚动条(IE/Edge) */\n -ms-overflow-style: none;\n `,\n\n slideIn: css`\n animation: ${slideInRight} 0.3s forwards;\n `,\n slideOut: css`\n animation: ${slideOutRight} 0.3s forwards;\n `,\n\n}));\n\nexport const GlobalStyle: React.FC = () => (\n <Global\n styles={globalCss`\n .ant-conversations .ant-conversations-item-active {\n background: rgba(57,97,242,0.08);\n }\n\n .ant-conversations .ant-conversations-item-active .ant-conversations-label {\n color: #3961F2;\n }\n `}\n />\n);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA+B;AAC/B,mBAAyC;AACzC,oBAAgC;AAuK9B;AArKF,IAAM,cAAc;AAMpB,IAAM,eAAe;AAAA;AAAA;AAAA;AAKrB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAKf,IAAM,gBAAY,+BAAgB,OAAO;AAAA;AAAA,EAE9C,sBAAsB;AAAA;AAAA;AAAA,EAItB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAgBU;AAAA;AAAA;AAAA,EAIpB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBT,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaV,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWN,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBZ,SAAS;AAAA,iBACM;AAAA;AAAA,EAEf,UAAU;AAAA,iBACK;AAAA;AAGjB,EAAE;AAEK,IAAM,cAAwB,MACnC;AAAA,EAAC;AAAA;AAAA,IACC,QAAQ,aAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV;",
6
6
  "names": ["globalCss"]
7
7
  }
@@ -57,8 +57,8 @@ var BasicUsageStory = () => {
57
57
  setContent(text);
58
58
  };
59
59
  const handleSendMessage = (obj) => {
60
+ console.log(obj);
60
61
  setLoading(true);
61
- console.info(obj);
62
62
  setTimeout(() => {
63
63
  setContent("");
64
64
  setFiles([]);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiSender/XAiSender.stories.tsx"],
4
- "sourcesContent": ["import React, { useState } from 'react';\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport type { Attachment } from '@ant-design/x/es/attachments';\nimport XAiSender from '.';\n\nconst meta: Meta<typeof XAiSender> = {\n title: 'AI组件/XAiSender 输入框',\n component: XAiSender,\n parameters: {\n layout: 'centered',\n },\n tags: ['autodocs'],\n argTypes: {},\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// 基础用法\nconst BasicUsageStory = () => {\n const [files, setFiles] = useState<Attachment[]>([]);\n const [content, setContent] = useState('');\n const [loading, setLoading] = useState(false);\n\n // 模拟清空数据\n const handleClear = () => {\n console.info('clear');\n };\n\n // 模拟输入\n const handleChange = (text: string) => {\n setContent(text);\n };\n\n // 模拟快捷短语点击\n const handleSendMessage = (obj: any) => {\n setLoading(true);\n console.info(obj);\n setTimeout(() => {\n setContent('');\n setFiles([]);\n setLoading(false);\n }, 2000);\n };\n\n return (\n <div style={{ width: 440, border: '1px solid #eee', padding: 20 }}>\n <XAiSender\n loading={loading}\n value={content}\n enableUpload\n files={files}\n onChangeFiles={setFiles}\n uploadRequest={({ file, onProgress, onSuccess }) => {\n console.info(file);\n onProgress?.({\n percent: 50,\n });\n setTimeout(() => {\n onSuccess?.({});\n }, 1000);\n }}\n onClear={handleClear}\n onChange={handleChange}\n onSubmit={handleSendMessage}\n onStop={handleClear}\n footerTips=\"内容由AI生成,无法确保真实准确,仅供参考\"\n />\n </div>\n );\n};\n\nexport const 基础用法: Story = {\n render: BasicUsageStory,\n args: {},\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAgC;AAGhC,eAAsB;AA4ChB;AA1CN,IAAM,OAA+B;AAAA,EACnC,OAAO;AAAA,EACP,WAAW,SAAAA;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,CAAC,UAAU;AAAA,EACjB,UAAU,CAAC;AACb;AAEA,IAAO,4BAAQ;AAIf,IAAM,kBAAkB,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,cAAc,MAAM;AACxB,YAAQ,KAAK,OAAO;AAAA,EACtB;AAGA,QAAM,eAAe,CAAC,SAAiB;AACrC,eAAW,IAAI;AAAA,EACjB;AAGA,QAAM,oBAAoB,CAAC,QAAa;AACtC,eAAW,IAAI;AACf,YAAQ,KAAK,GAAG;AAChB,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,OAAO;AAAA,MACP,cAAY;AAAA,MACZ;AAAA,MACA,eAAe;AAAA,MACf,eAAe,CAAC,EAAE,MAAM,YAAY,UAAU,MAAM;AAClD,gBAAQ,KAAK,IAAI;AACjB,iDAAa;AAAA,UACX,SAAS;AAAA,QACX;AACA,mBAAW,MAAM;AACf,iDAAY,CAAC;AAAA,QACf,GAAG,GAAI;AAAA,MACT;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAW;AAAA;AAAA,EACb,GACF;AAEJ;AAEO,IAAM,OAAc;AAAA,EACzB,QAAQ;AAAA,EACR,MAAM,CAAC;AACT;",
4
+ "sourcesContent": ["import React, { useState } from 'react';\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport type { Attachment } from '@ant-design/x/es/attachments';\nimport XAiSender from '.';\n\nconst meta: Meta<typeof XAiSender> = {\n title: 'AI组件/XAiSender 输入框',\n component: XAiSender,\n parameters: {\n layout: 'centered',\n },\n tags: ['autodocs'],\n argTypes: {},\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// 基础用法\nconst BasicUsageStory = () => {\n const [files, setFiles] = useState<Attachment[]>([]);\n const [content, setContent] = useState('');\n const [loading, setLoading] = useState(false);\n\n // 模拟清空数据\n const handleClear = () => {\n console.info('clear');\n };\n\n // 模拟输入\n const handleChange = (text: string) => {\n setContent(text);\n };\n\n // 模拟快捷短语点击\n const handleSendMessage = (obj: any) => {\n console.log(obj);\n setLoading(true);\n setTimeout(() => {\n setContent('');\n setFiles([]);\n setLoading(false);\n }, 2000);\n };\n\n return (\n <div style={{ width: 440, border: '1px solid #eee', padding: 20 }}>\n <XAiSender\n loading={loading}\n value={content}\n enableUpload\n files={files}\n onChangeFiles={setFiles}\n uploadRequest={({ file, onProgress, onSuccess }) => {\n console.info(file);\n onProgress?.({\n percent: 50,\n });\n setTimeout(() => {\n onSuccess?.({});\n }, 1000);\n }}\n onClear={handleClear}\n onChange={handleChange}\n onSubmit={handleSendMessage}\n onStop={handleClear}\n footerTips=\"内容由AI生成,无法确保真实准确,仅供参考\"\n />\n </div>\n );\n};\n\nexport const 基础用法: Story = {\n render: BasicUsageStory,\n args: {},\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAgC;AAGhC,eAAsB;AA4ChB;AA1CN,IAAM,OAA+B;AAAA,EACnC,OAAO;AAAA,EACP,WAAW,SAAAA;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,CAAC,UAAU;AAAA,EACjB,UAAU,CAAC;AACb;AAEA,IAAO,4BAAQ;AAIf,IAAM,kBAAkB,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,cAAc,MAAM;AACxB,YAAQ,KAAK,OAAO;AAAA,EACtB;AAGA,QAAM,eAAe,CAAC,SAAiB;AACrC,eAAW,IAAI;AAAA,EACjB;AAGA,QAAM,oBAAoB,CAAC,QAAa;AACtC,YAAQ,IAAI,GAAG;AACf,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,OAAO;AAAA,MACP,cAAY;AAAA,MACZ;AAAA,MACA,eAAe;AAAA,MACf,eAAe,CAAC,EAAE,MAAM,YAAY,UAAU,MAAM;AAClD,gBAAQ,KAAK,IAAI;AACjB,iDAAa;AAAA,UACX,SAAS;AAAA,QACX;AACA,mBAAW,MAAM;AACf,iDAAY,CAAC;AAAA,QACf,GAAG,GAAI;AAAA,MACT;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAW;AAAA;AAAA,EACb,GACF;AAEJ;AAEO,IAAM,OAAc;AAAA,EACzB,QAAQ;AAAA,EACR,MAAM,CAAC;AACT;",
6
6
  "names": ["XAiSender"]
7
7
  }
@@ -63,18 +63,11 @@ var XAiSender = (props) => {
63
63
  const loading = mergedProps.loading || propLoading;
64
64
  const [clearPopoverVisible, setClearPopoverVisible] = (0, import_react.useState)(false);
65
65
  const styles = (0, import_styles.useStyles)();
66
- const uploading = files == null ? void 0 : files.some((file) => file.status === "uploading");
67
66
  const handleSend = () => {
68
- if (uploading) {
69
- import_antd.message.warning("文件正在上传中");
70
- return;
71
- }
72
- const hasText = value && value.trim();
73
- const hasFiles = files == null ? void 0 : files.length;
74
- if (hasText || hasFiles) {
67
+ if (value && value.trim()) {
75
68
  onSubmit == null ? void 0 : onSubmit({
76
69
  text: value,
77
- files
70
+ files: files || []
78
71
  });
79
72
  }
80
73
  };
@@ -170,7 +163,7 @@ var XAiSender = (props) => {
170
163
  value,
171
164
  className: styles.sendWrapper,
172
165
  placeholder: "继续对话...",
173
- disabled: disabled || uploading,
166
+ disabled,
174
167
  loading,
175
168
  ref: senderRef,
176
169
  header: enableUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -185,40 +178,29 @@ var XAiSender = (props) => {
185
178
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
186
179
  import_x.Attachments,
187
180
  {
188
- ...{
189
- ref: attachmentsRef,
190
- customRequest: uploadRequest,
191
- multiple: true,
192
- items: files,
193
- imageProps: {
194
- preview: { mask: true }
195
- },
196
- onChange: ({ fileList }) => {
197
- onChangeFiles == null ? void 0 : onChangeFiles(fileList);
198
- },
199
- getDropContainer: () => {
200
- var _a;
201
- return (_a = senderRef.current) == null ? void 0 : _a.nativeElement;
202
- }
181
+ ref: attachmentsRef,
182
+ customRequest: uploadRequest,
183
+ multiple: true,
184
+ items: files,
185
+ onChange: ({ fileList }) => {
186
+ onChangeFiles == null ? void 0 : onChangeFiles(fileList);
187
+ },
188
+ getDropContainer: () => {
189
+ var _a;
190
+ return (_a = senderRef.current) == null ? void 0 : _a.nativeElement;
203
191
  }
204
192
  }
205
193
  )
206
194
  }
207
195
  ),
208
- footer: (_origNode, info) => {
209
- const { SendButton, LoadingButton } = info == null ? void 0 : info.components;
210
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_antd.Space, { size: "small", children: [
196
+ suffix: (_, info) => {
197
+ const { SendButton, LoadingButton } = info.components;
198
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_antd.Space, { size: "small", style: { paddingBottom: "5px" }, children: [
211
199
  enableUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
212
200
  uploadButton,
213
201
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.divider })
214
202
  ] }),
215
- loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
216
- LoadingButton,
217
- {
218
- onClick: () => onStop == null ? void 0 : onStop(),
219
- className: styles.stopButton
220
- }
221
- ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
203
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoadingButton, { onClick: () => onStop == null ? void 0 : onStop(), className: styles.stopButton }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
222
204
  SendButton,
223
205
  {
224
206
  className: styles.sendButton,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiSender/index.tsx"],
4
- "sourcesContent": ["// 文件: components/XAiSender/index.tsx\nimport React, {\n useRef,\n useState,\n} from 'react';\nimport {\n Attachments,\n Sender,\n type AttachmentsProps\n} from '@ant-design/x';\nimport {\n Button,\n GetRef,\n message,\n Popover,\n Space,\n Tooltip,\n} from 'antd';\nimport {\n ArrowUpOutlined,\n ClearOutlined,\n PlusCircleOutlined,\n} from '@ant-design/icons';\nimport clsx from 'clsx';\nimport { AttachmentsRef } from '@ant-design/x/es/attachments';\nimport {\n XAiSenderProps,\n} from '@/types';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { useStyles } from './styles';\n\nconst XAiSender: React.FC<XAiSenderProps> = (props) => {\n // 使用新的 Hook 来处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n const {\n footerTips,\n clearBtnShow,\n value,\n onChange,\n onClear,\n onStop,\n onSubmit,\n files,\n enableUpload,\n onChangeFiles,\n uploadRequest,\n loading: propLoading = false,\n disabled,\n ...resetProps\n } = mergedProps as XAiSenderProps;\n const senderRef = useRef<GetRef<typeof Sender>>(null);\n const attachmentsRef = useRef<AttachmentsRef>(null);\n\n // 如果在 Provider 中,使用 Provider 的状态\n const loading = mergedProps.loading || propLoading;\n const [clearPopoverVisible, setClearPopoverVisible] = useState(false); // 气泡卡片显隐藏\n const styles = useStyles();\n const uploading = files?.some((file) => file.status === 'uploading');\n\n // 触发发送\n const handleSend = () => {\n if (uploading) {\n message.warning('文件正在上传中');\n return;\n }\n const hasText = value && value.trim();\n const hasFiles = files?.length;\n if (hasText || hasFiles) {\n // 直接使用合并后的 onSend,自动处理 Provider 和独立模式\n onSubmit?.({\n text: value,\n files,\n });\n }\n };\n\n // 文件上传按钮引用\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // 点击清除按钮\n const handleClear = () => {\n setClearPopoverVisible(true);\n };\n\n // 取消清除\n const cancelClear = () => {\n setClearPopoverVisible(false);\n };\n\n // 确认清除\n const confirmClear = () => {\n onClear?.();\n setClearPopoverVisible(false);\n };\n\n // 清空按钮提示文案\n const clearConfirmContent = (\n <div className={styles.p('2px')}>\n <p className={clsx(styles.mb(14), styles.mt(0))}>确认清除所有聊天记录并重置会话!</p>\n <div className={styles.popoverFooter}>\n <Button size=\"small\" onClick={cancelClear}>\n 取消\n </Button>\n <Button size=\"small\" type=\"primary\" danger onClick={confirmClear}>\n 确认\n </Button>\n </div>\n </div>\n );\n\n // 自定义上传按钮\n const uploadButton = (\n <div className={styles.flexCenterGap2}>\n <Tooltip\n placement=\"top\"\n title=\"支持图片、文档等上传\"\n >\n <Button\n color=\"default\"\n variant=\"text\"\n shape=\"circle\"\n size=\"small\"\n icon={<PlusCircleOutlined style={{ fontSize: 20, color: '#949494' }} />}\n onClick={() => {\n if (fileInputRef.current) {\n fileInputRef.current?.click();\n }\n }}\n />\n <input\n type=\"file\"\n ref={fileInputRef}\n multiple\n onChange={(e) => {\n const fileList = e.target.files || [];\n if (!fileList.length) return;\n for (let i = 0; i < fileList.length; i++) {\n const file = fileList[i];\n attachmentsRef.current?.upload(file);\n }\n e.target.value = '';\n }}\n style={{ display: 'none' }}\n accept=\"*/*\"\n />\n </Tooltip>\n </div>\n );\n\n return (\n <>\n <div className={styles.chatFooter}>\n <div className={clsx(styles.flex, styles.gap(8))}>\n {/* 清空按钮 */}\n {clearBtnShow && (\n <Popover\n content={clearConfirmContent}\n title=\"确认清空对话\"\n trigger=\"click\"\n open={clearPopoverVisible}\n onOpenChange={setClearPopoverVisible}\n >\n <div\n className={styles.clearBtn}\n style={{ border: '1px solid #E4E7EC', borderRadius: '50%', height: '35px', width: '35px' }}\n onClick={handleClear}\n >\n <ClearOutlined className={styles.text(16)} />\n </div>\n </Popover>\n )}\n {/* 普通文本输入 */}\n <Sender\n {...resetProps}\n value={value}\n className={styles.sendWrapper}\n placeholder=\"继续对话...\"\n disabled={disabled || uploading}\n loading={loading}\n ref={senderRef}\n header={enableUpload && (\n <Sender.Header\n closable={false}\n forceRender\n open={!!files?.length}\n styles={{\n content: { padding: 0 },\n }}\n >\n <Attachments\n {...({\n ref: attachmentsRef,\n customRequest: uploadRequest,\n multiple: true,\n items: files,\n imageProps: {\n preview: { mask: true }\n },\n onChange: ({ fileList }) => {\n onChangeFiles?.(fileList);\n },\n getDropContainer: () => senderRef.current?.nativeElement,\n } as AttachmentsProps)}\n />\n </Sender.Header>\n )}\n footer={(_origNode, info) => {\n const { SendButton, LoadingButton } = info?.components;\n return (\n <Space size=\"small\">\n {enableUpload && (\n <>\n {uploadButton}\n <div className={styles.divider} />\n </>\n )}\n {loading\n ? (\n <LoadingButton\n onClick={() => onStop?.()}\n className={styles.stopButton}\n />\n )\n : (\n <SendButton\n className={styles.sendButton}\n type=\"primary\"\n icon={<ArrowUpOutlined className={styles.text(20)} />}\n disabled={disabled}\n />\n )}\n </Space>\n );\n }}\n onChange={(v) => {\n onChange?.(v);\n }}\n onSubmit={handleSend}\n onCancel={() => {\n onStop?.();\n }}\n />\n </div>\n </div>\n { footerTips && <div className={styles.footerTips}>{footerTips}</div>}\n </>\n );\n};\n\nexport default XAiSender;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAGO;AACP,eAIO;AACP,kBAOO;AACP,mBAIO;AACP,kBAAiB;AAKjB,gCAAkC;AAClC,oBAA0B;AAqEpB;AAnEN,IAAM,YAAsC,CAAC,UAAU;AAErD,QAAM,EAAE,YAAY,QAAI,6CAAkB,KAAK;AAC/C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,cAAc;AAAA,IACvB;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,gBAAY,qBAA8B,IAAI;AACpD,QAAM,qBAAiB,qBAAuB,IAAI;AAGlD,QAAM,UAAU,YAAY,WAAW;AACvC,QAAM,CAAC,qBAAqB,sBAAsB,QAAI,uBAAS,KAAK;AACpE,QAAM,aAAS,yBAAU;AACzB,QAAM,YAAY,+BAAO,KAAK,CAAC,SAAS,KAAK,WAAW;AAGxD,QAAM,aAAa,MAAM;AACvB,QAAI,WAAW;AACb,0BAAQ,QAAQ,SAAS;AACzB;AAAA,IACF;AACA,UAAM,UAAU,SAAS,MAAM,KAAK;AACpC,UAAM,WAAW,+BAAO;AACxB,QAAI,WAAW,UAAU;AAEvB,2CAAW;AAAA,QACT,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAAe,qBAAyB,IAAI;AAGlD,QAAM,cAAc,MAAM;AACxB,2BAAuB,IAAI;AAAA,EAC7B;AAGA,QAAM,cAAc,MAAM;AACxB,2BAAuB,KAAK;AAAA,EAC9B;AAGA,QAAM,eAAe,MAAM;AACzB;AACA,2BAAuB,KAAK;AAAA,EAC9B;AAGA,QAAM,sBACJ,6CAAC,SAAI,WAAW,OAAO,EAAE,KAAK,GAC5B;AAAA,gDAAC,OAAE,eAAW,YAAAA,SAAK,OAAO,GAAG,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,8BAAgB;AAAA,IACjE,6CAAC,SAAI,WAAW,OAAO,eACrB;AAAA,kDAAC,sBAAO,MAAK,SAAQ,SAAS,aAAa,gBAE3C;AAAA,MACA,4CAAC,sBAAO,MAAK,SAAQ,MAAK,WAAU,QAAM,MAAC,SAAS,cAAc,gBAElE;AAAA,OACF;AAAA,KACF;AAIF,QAAM,eACJ,4CAAC,SAAI,WAAW,OAAO,gBACrB;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAM;AAAA,MAEN;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAK;AAAA,YACL,MAAM,4CAAC,mCAAmB,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,GAAG;AAAA,YACrE,SAAS,MAAM;AA3HzB;AA4HY,kBAAI,aAAa,SAAS;AACxB,mCAAa,YAAb,mBAAsB;AAAA,cACxB;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,UAAQ;AAAA,YACR,UAAU,CAAC,MAAM;AArI3B;AAsIY,oBAAM,WAAW,EAAE,OAAO,SAAS,CAAC;AACpC,kBAAI,CAAC,SAAS;AAAQ;AACtB,uBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,sBAAM,OAAO,SAAS,CAAC;AACvB,qCAAe,YAAf,mBAAwB,OAAO;AAAA,cACjC;AACA,gBAAE,OAAO,QAAQ;AAAA,YACnB;AAAA,YACA,OAAO,EAAE,SAAS,OAAO;AAAA,YACzB,QAAO;AAAA;AAAA,QACT;AAAA;AAAA;AAAA,EACF,GACF;AAGF,SACE,4EACE;AAAA,gDAAC,SAAI,WAAW,OAAO,YACrB,uDAAC,SAAI,eAAW,YAAAA,SAAK,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,GAE5C;AAAA,sBACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,OAAM;AAAA,UACN,SAAQ;AAAA,UACR,MAAM;AAAA,UACN,cAAc;AAAA,UAEd;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,OAAO;AAAA,cAClB,OAAO,EAAE,QAAQ,qBAAqB,cAAc,OAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,cACzF,SAAS;AAAA,cAET,sDAAC,8BAAc,WAAW,OAAO,KAAK,EAAE,GAAG;AAAA;AAAA,UAC7C;AAAA;AAAA,MACF;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA,WAAW,OAAO;AAAA,UAClB,aAAY;AAAA,UACZ,UAAU,YAAY;AAAA,UACtB;AAAA,UACA,KAAK;AAAA,UACL,QAAQ,gBACN;AAAA,YAAC,gBAAO;AAAA,YAAP;AAAA,cACC,UAAU;AAAA,cACV,aAAW;AAAA,cACX,MAAM,CAAC,EAAC,+BAAO;AAAA,cACf,QAAQ;AAAA,gBACN,SAAS,EAAE,SAAS,EAAE;AAAA,cACxB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACE,GAAI;AAAA,oBACH,KAAK;AAAA,oBACL,eAAe;AAAA,oBACf,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,YAAY;AAAA,sBACV,SAAS,EAAE,MAAM,KAAK;AAAA,oBACxB;AAAA,oBACA,UAAU,CAAC,EAAE,SAAS,MAAM;AAC1B,qEAAgB;AAAA,oBAClB;AAAA,oBACA,kBAAkB,MAAG;AAzMzC;AAyM4C,6CAAU,YAAV,mBAAmB;AAAA;AAAA,kBAC7C;AAAA;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UAEF,QAAQ,CAAC,WAAW,SAAS;AAC3B,kBAAM,EAAE,YAAY,cAAc,IAAI,6BAAM;AAC5C,mBACE,6CAAC,qBAAM,MAAK,SACT;AAAA,8BACC,4EACG;AAAA;AAAA,gBACD,4CAAC,SAAI,WAAW,OAAO,SAAS;AAAA,iBAClC;AAAA,cAED,UAEG;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM;AAAA,kBACf,WAAW,OAAO;AAAA;AAAA,cACpB,IAGA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,OAAO;AAAA,kBAClB,MAAK;AAAA,kBACL,MAAM,4CAAC,gCAAgB,WAAW,OAAO,KAAK,EAAE,GAAG;AAAA,kBACnD;AAAA;AAAA,cACF;AAAA,eAEN;AAAA,UAEJ;AAAA,UACA,UAAU,CAAC,MAAM;AACf,iDAAW;AAAA,UACb;AAAA,UACA,UAAU;AAAA,UACV,UAAU,MAAM;AACd;AAAA,UACF;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,IACE,cAAc,4CAAC,SAAI,WAAW,OAAO,YAAa,sBAAW;AAAA,KACjE;AAEJ;AAEA,IAAO,oBAAQ;",
4
+ "sourcesContent": ["import React, {\n useRef,\n useState,\n} from 'react';\nimport {\n Attachments,\n Sender,\n} from '@ant-design/x';\nimport {\n Button,\n GetRef,\n Popover,\n Space,\n Tooltip,\n} from 'antd';\nimport {\n ArrowUpOutlined,\n ClearOutlined,\n PlusCircleOutlined,\n} from '@ant-design/icons';\nimport clsx from 'clsx';\nimport { AttachmentsRef } from '@ant-design/x/es/attachments';\nimport {\n XAiSenderProps,\n} from '@/types';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { useStyles } from './styles';\n\nconst XAiSender: React.FC<XAiSenderProps> = (props) => {\n // 使用新的 Hook 来处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n const {\n footerTips,\n clearBtnShow,\n value,\n onChange,\n onClear,\n onStop,\n onSubmit,\n files,\n enableUpload,\n onChangeFiles,\n uploadRequest,\n loading: propLoading = false,\n disabled,\n ...resetProps\n } = mergedProps as XAiSenderProps;\n const senderRef = useRef<GetRef<typeof Sender>>(null);\n const attachmentsRef = useRef<AttachmentsRef>(null);\n\n // 如果在 Provider 中,使用 Provider 的状态\n const loading = mergedProps.loading || propLoading;\n const [clearPopoverVisible, setClearPopoverVisible] = useState(false); // 气泡卡片显隐藏\n const styles = useStyles();\n\n // 触发发送\n const handleSend = () => {\n if (value && value.trim()) {\n // 直接使用合并后的 onSend,自动处理 Provider 和独立模式\n onSubmit?.({\n text: value,\n files: files || [],\n });\n }\n };\n\n // 文件上传按钮引用\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // 点击清除按钮\n const handleClear = () => {\n setClearPopoverVisible(true);\n };\n\n // 取消清除\n const cancelClear = () => {\n setClearPopoverVisible(false);\n };\n\n // 确认清除\n const confirmClear = () => {\n onClear?.();\n setClearPopoverVisible(false);\n };\n\n // 清空按钮提示文案\n const clearConfirmContent = (\n <div className={styles.p('2px')}>\n <p className={clsx(styles.mb(14), styles.mt(0))}>确认清除所有聊天记录并重置会话!</p>\n <div className={styles.popoverFooter}>\n <Button size=\"small\" onClick={cancelClear}>\n 取消\n </Button>\n <Button size=\"small\" type=\"primary\" danger onClick={confirmClear}>\n 确认\n </Button>\n </div>\n </div>\n );\n\n // 自定义上传按钮\n const uploadButton = (\n <div className={styles.flexCenterGap2}>\n <Tooltip\n placement=\"top\"\n title=\"支持图片、文档等上传\"\n >\n <Button\n color=\"default\"\n variant=\"text\"\n shape=\"circle\"\n size=\"small\"\n icon={<PlusCircleOutlined style={{ fontSize: 20, color: '#949494' }} />}\n onClick={() => {\n if (fileInputRef.current) {\n fileInputRef.current?.click();\n }\n }}\n />\n <input\n type=\"file\"\n ref={fileInputRef}\n multiple\n onChange={(e) => {\n const fileList = e.target.files || [];\n if (!fileList.length) return;\n for (let i = 0; i < fileList.length; i++) {\n const file = fileList[i];\n attachmentsRef.current?.upload(file);\n }\n e.target.value = '';\n }}\n style={{ display: 'none' }}\n accept=\"*/*\"\n />\n </Tooltip>\n </div>\n );\n\n return (\n <>\n <div className={styles.chatFooter}>\n <div className={clsx(styles.flex, styles.gap(8))}>\n {/* 清空按钮 */}\n {clearBtnShow && (\n <Popover\n content={clearConfirmContent}\n title=\"确认清空对话\"\n trigger=\"click\"\n open={clearPopoverVisible}\n onOpenChange={setClearPopoverVisible}\n >\n <div\n className={styles.clearBtn}\n style={{ border: '1px solid #E4E7EC', borderRadius: '50%', height: '35px', width: '35px' }}\n onClick={handleClear}\n >\n <ClearOutlined className={styles.text(16)} />\n </div>\n </Popover>\n )}\n {/* 普通文本输入 */}\n <Sender\n {...resetProps}\n value={value}\n className={styles.sendWrapper}\n placeholder=\"继续对话...\"\n disabled={disabled}\n loading={loading}\n ref={senderRef}\n header={enableUpload && (\n <Sender.Header\n closable={false}\n forceRender\n open={!!files?.length}\n styles={{\n content: { padding: 0 },\n }}\n >\n <Attachments\n ref={attachmentsRef}\n customRequest={uploadRequest}\n multiple\n items={files}\n // imageProps={{\n // preview: {\n // mask: true,\n // },\n // }}\n onChange={({ fileList }) => {\n onChangeFiles?.(fileList);\n }}\n getDropContainer={() => senderRef.current?.nativeElement}\n />\n </Sender.Header>\n )}\n suffix={(_, info) => {\n const { SendButton, LoadingButton } = info.components;\n return (\n <Space size=\"small\" style={{ paddingBottom: '5px' }}>\n {enableUpload && (\n <>\n {uploadButton}\n <div className={styles.divider} />\n </>\n )}\n {loading\n ? (\n <LoadingButton onClick={() => onStop?.()} className={styles.stopButton} />\n )\n : (\n <SendButton\n className={styles.sendButton}\n type=\"primary\"\n icon={<ArrowUpOutlined className={styles.text(20)} />}\n disabled={disabled}\n />\n )}\n </Space>\n );\n }}\n onChange={(v) => {\n onChange?.(v);\n }}\n onSubmit={handleSend}\n onCancel={() => {\n onStop?.();\n }}\n />\n </div>\n </div>\n { footerTips && <div className={styles.footerTips}>{footerTips}</div>}\n </>\n );\n};\n\nexport default XAiSender;\n"],
5
+ "mappings": "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",
6
6
  "names": ["clsx"]
7
7
  }
@@ -1,24 +1,15 @@
1
1
  /// <reference types="react" />
2
- import { Messages } from "../types/XAiMessage";
3
- import type { Event, IMessage, Part } from "../types";
4
- import { type Error, type Success, type SessionData } from "../types";
2
+ import { DebugOptions, FunctionCall, SendContent, SessionData, Event, IMessage, Part } from "../types";
5
3
  import { type ChatConfig } from "../services/api";
6
- export interface DebugOptions {
7
- url: string;
8
- sessionId?: string;
9
- config: any;
10
- token: string;
11
- type?: 'agentDebug' | 'appDebug';
12
- onError?: (error: Error) => void;
13
- onSuccess?: (data: Success) => void;
14
- onMessage?: (content: string, data: Messages) => void;
15
- }
16
- declare function useADKChat({ url, token, config, type, onError, onMessage, onSuccess, }: DebugOptions): {
17
- appInfo: ChatConfig;
18
- startChat: (text: string) => Promise<void>;
4
+ declare function useADKChat({ url, token, config, type, onError, onMessage, onSuccess, onStream, }: DebugOptions): {
5
+ appInfo: ChatConfig | null;
6
+ startChat: ({ text, files, functionResponse }: SendContent) => Promise<void>;
7
+ reChat: () => void;
19
8
  stopChat: () => void;
20
9
  clearChat: () => void;
21
10
  suggestChat: (text: string) => void;
11
+ confirmFnCall: (fnCall: FunctionCall, confirmed: boolean) => void;
12
+ initialized: boolean;
22
13
  currentSessionId: string;
23
14
  sessionList: SessionData[];
24
15
  prologue: string;
@@ -55,22 +55,14 @@ function useADKChat({
55
55
  type = "agentDebug",
56
56
  onError,
57
57
  onMessage,
58
- onSuccess
58
+ onSuccess,
59
+ onStream
59
60
  }) {
60
61
  const [loading, setLoading] = (0, import_react.useState)(false);
61
62
  const ctrl = (0, import_react.useRef)(null);
62
63
  const { appNo } = config || {};
63
- const [appInfo, setAppInfo] = (0, import_react.useState)({
64
- appNo,
65
- appVersionNo: "",
66
- appTheme: "",
67
- appName: "",
68
- onboardingInfo: {
69
- prologue: "",
70
- questionFiles: [],
71
- suggested_questions: []
72
- }
73
- });
64
+ const [appInfo, setAppInfo] = (0, import_react.useState)(null);
65
+ const [initialized, setInitialized] = (0, import_react.useState)(false);
74
66
  const [sessionList, setSessionList] = (0, import_react.useState)([]);
75
67
  const [currentSessionId, setCurrentSessionId] = (0, import_react.useState)("");
76
68
  const [sessionPagination, setSessionPagination] = (0, import_react.useState)({ total: 0, pageNum: 1, pageSize: import_constants.SESSION_PAGE_SIZE });
@@ -178,6 +170,8 @@ function useADKChat({
178
170
  if ((_b = (_a = event == null ? void 0 : event.groundingMetadata) == null ? void 0 : _a.searchEntryPoint) == null ? void 0 : _b.renderedContent) {
179
171
  msg.renderedContent = event.groundingMetadata.searchEntryPoint.renderedContent;
180
172
  }
173
+ } else if (part.fileData) {
174
+ msg.fileData = [part.fileData];
181
175
  } else if (part.functionCall) {
182
176
  msg.functionCall = part.functionCall;
183
177
  } else if (part.functionResponse) {
@@ -298,6 +292,7 @@ function useADKChat({
298
292
  import_antd.message.warning(chunkJson.error);
299
293
  return;
300
294
  }
295
+ onStream == null ? void 0 : onStream(chunkJson);
301
296
  if (chunkJson.content) {
302
297
  if (chunkJson.content.role === "followup") {
303
298
  processFollowupPart(chunkJson);
@@ -313,7 +308,11 @@ function useADKChat({
313
308
  }
314
309
  },
315
310
  onclose: () => {
311
+ var _a;
316
312
  setLoading(false);
313
+ if (textMsgRef.current) {
314
+ onMessage == null ? void 0 : onMessage(((_a = textMsgRef.current) == null ? void 0 : _a.text) || "", textMsgRef.current);
315
+ }
317
316
  textMsgRef.current = null;
318
317
  resolve();
319
318
  },
@@ -326,18 +325,43 @@ function useADKChat({
326
325
  });
327
326
  });
328
327
  }, [type, currentSessionId, processActionArtifact, processErrorMessage, processPart]);
329
- const startChat = async (text) => {
328
+ const startChat = async ({ text = "", files = [], functionResponse }) => {
330
329
  if (loading)
331
330
  return;
332
- if (!text.trim())
331
+ if (!text.trim() && !functionResponse)
333
332
  return;
334
333
  setSuggestedQuestions([]);
335
334
  setMessages((prev) => {
336
- return [...prev, {
337
- id: (0, import_uuid.v4)(),
338
- role: "user",
339
- text
340
- }];
335
+ let temp = [...prev];
336
+ if (text.trim()) {
337
+ temp.push({
338
+ id: (0, import_uuid.v4)(),
339
+ role: "user",
340
+ text
341
+ });
342
+ }
343
+ if (files.length > 0) {
344
+ temp.push({
345
+ id: (0, import_uuid.v4)(),
346
+ role: "user",
347
+ fileData: files.map((file) => {
348
+ var _a, _b;
349
+ return {
350
+ displayName: file.name,
351
+ mimeType: (_a = file.response) == null ? void 0 : _a.mimeType,
352
+ fileUri: (_b = file.response) == null ? void 0 : _b.fileUrl
353
+ };
354
+ })
355
+ });
356
+ }
357
+ if (functionResponse) {
358
+ temp.push({
359
+ id: (0, import_uuid.v4)(),
360
+ role: "user",
361
+ functionResponse
362
+ });
363
+ }
364
+ return temp;
341
365
  });
342
366
  await sendMessageRequest({
343
367
  stream: true,
@@ -347,17 +371,69 @@ function useADKChat({
347
371
  parts: [{
348
372
  text
349
373
  }]
350
- }
374
+ },
375
+ files: files.map((file) => {
376
+ var _a, _b, _c, _d, _e;
377
+ return {
378
+ fileName: (_a = file.response) == null ? void 0 : _a.fileName,
379
+ fileId: (_b = file.response) == null ? void 0 : _b.fileId,
380
+ tempUrl: (_c = file.response) == null ? void 0 : _c.fileUrl,
381
+ type: (_d = file.response) == null ? void 0 : _d.fileType,
382
+ mimeType: (_e = file.response) == null ? void 0 : _e.mimeType
383
+ };
384
+ })
351
385
  });
352
386
  initAppConversations();
353
387
  };
388
+ const reChat = () => {
389
+ if (loading)
390
+ return;
391
+ if (messages.length === 0)
392
+ return;
393
+ setMessages((prev) => {
394
+ const newMessages = [...prev];
395
+ const lastAIIndex = newMessages.findLastIndex((msg) => msg.role === "bot");
396
+ if (lastAIIndex !== -1) {
397
+ newMessages.splice(lastAIIndex, 1);
398
+ }
399
+ setSuggestedQuestions([]);
400
+ const lastUserMessage = newMessages.findLast((msg) => msg.role === "user");
401
+ if (lastUserMessage) {
402
+ const { text = "", fileData = [] } = lastUserMessage;
403
+ sendMessageRequest({
404
+ stream: true,
405
+ sessionId: currentSessionId,
406
+ content: {
407
+ role: "user",
408
+ parts: [{
409
+ text
410
+ }]
411
+ },
412
+ files: fileData == null ? void 0 : fileData.map((file) => ({
413
+ fileName: file.displayName,
414
+ tempUrl: file.fileUri,
415
+ mimeType: file.mimeType
416
+ }))
417
+ });
418
+ }
419
+ return newMessages;
420
+ });
421
+ };
422
+ const confirmFnCall = (fnCall, confirmed) => {
423
+ const functionResponse = {
424
+ id: fnCall.id,
425
+ name: fnCall.name,
426
+ response: { confirmed }
427
+ };
428
+ startChat({ functionResponse });
429
+ };
354
430
  const suggestChat = (text) => {
355
431
  if (loading)
356
432
  return;
357
433
  if (!text.trim())
358
434
  return;
359
435
  setSuggestedQuestions([]);
360
- startChat(text);
436
+ startChat({ text });
361
437
  };
362
438
  const stopChat = (0, import_react.useCallback)(() => {
363
439
  var _a;
@@ -366,11 +442,12 @@ function useADKChat({
366
442
  textMsgRef.current = null;
367
443
  }, [ctrl]);
368
444
  const clearChat = () => {
369
- setCurrentSessionId((0, import_uuid.v4)());
370
- setTimeout(() => {
371
- stopChat();
372
- setMessages([]);
373
- });
445
+ var _a;
446
+ const newSessionId = (0, import_uuid.v4)();
447
+ setCurrentSessionId(newSessionId);
448
+ stopChat();
449
+ setMessages([]);
450
+ setSuggestedQuestions(((_a = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _a.suggested_questions) || []);
374
451
  };
375
452
  const formatMessages = (messages2, isReplace = false) => {
376
453
  const mapped = [];
@@ -445,9 +522,9 @@ function useADKChat({
445
522
  token
446
523
  });
447
524
  if ((result == null ? void 0 : result.code) === import_constants.API_SUCCESS_CODE) {
525
+ setPrologue(((_a = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _a.prologue) || "");
448
526
  if (Array.isArray(data) && data.length > 0) {
449
527
  formatMessages(data, true);
450
- setPrologue(((_a = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _a.prologue) || "");
451
528
  } else {
452
529
  setSuggestedQuestions(((_b = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _b.suggested_questions) || []);
453
530
  }
@@ -471,7 +548,7 @@ function useADKChat({
471
548
  return {
472
549
  key: item.sessionId,
473
550
  label: item.title || "新对话",
474
- timestamp: new Date(item.sessionTime).getTime(),
551
+ timestamp: new Date(item.startTime).getTime(),
475
552
  messages: [],
476
553
  meta: {
477
554
  ...item
@@ -482,16 +559,19 @@ function useADKChat({
482
559
  setSessionPagination({ pageNum: sessionPagination.pageNum, pageSize: sessionPagination.pageSize, total: (pagination == null ? void 0 : pagination.total) || 0 });
483
560
  const { sessionId } = data == null ? void 0 : data[0];
484
561
  fetchDetail && setCurrentSessionDetail(sessionId);
562
+ if (!initialized) {
563
+ onSuccess == null ? void 0 : onSuccess({
564
+ code: import_types.SuccessCode.APP_MESSAGES_INIT_SUCCESS,
565
+ message: "初始化聊天记录成功"
566
+ });
567
+ setInitialized(true);
568
+ }
485
569
  } else {
486
570
  setSessionList([]);
487
571
  setCurrentSessionId((0, import_uuid.v4)());
488
572
  setPrologue("");
489
573
  setSuggestedQuestions([]);
490
574
  }
491
- onSuccess == null ? void 0 : onSuccess({
492
- code: import_types.SuccessCode.APP_MESSAGES_INIT_SUCCESS,
493
- message: "初始化聊天记录成功"
494
- });
495
575
  } else {
496
576
  setSessionList([]);
497
577
  setCurrentSessionId((0, import_uuid.v4)());
@@ -571,9 +651,12 @@ function useADKChat({
571
651
  return {
572
652
  appInfo,
573
653
  startChat,
654
+ reChat,
574
655
  stopChat,
575
656
  clearChat,
576
657
  suggestChat,
658
+ confirmFnCall,
659
+ initialized,
577
660
  currentSessionId,
578
661
  sessionList,
579
662
  prologue,