@ai-group/chat-sdk 3.7.0 → 3.7.1-alpha10

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 (235) hide show
  1. package/README.md +22 -0
  2. package/dist/cjs/components/FileGallery/index.js +59 -40
  3. package/dist/cjs/components/FileGallery/index.js.map +2 -2
  4. package/dist/cjs/components/FileGallery/styles.d.ts +7 -0
  5. package/dist/cjs/components/FileGallery/styles.js +78 -0
  6. package/dist/cjs/components/FileGallery/styles.js.map +2 -2
  7. package/dist/cjs/components/Sources/components/CarouselCard.d.ts +12 -0
  8. package/dist/cjs/components/Sources/components/CarouselCard.js +130 -0
  9. package/dist/cjs/components/Sources/components/CarouselCard.js.map +7 -0
  10. package/dist/cjs/components/Sources/index.d.ts +5 -0
  11. package/dist/cjs/components/Sources/index.js +162 -0
  12. package/dist/cjs/components/Sources/index.js.map +7 -0
  13. package/dist/cjs/components/Sources/styles.d.ts +59 -0
  14. package/dist/cjs/components/Sources/styles.js +179 -0
  15. package/dist/cjs/components/Sources/styles.js.map +7 -0
  16. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +19 -1
  17. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +232 -22
  18. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
  19. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
  20. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +83 -0
  21. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
  22. package/dist/cjs/components/XAdkChatbot/index.d.ts +2 -2
  23. package/dist/cjs/components/XAdkChatbot/index.js +75 -8
  24. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  25. package/dist/cjs/components/XAdkChatbot/styles.js +1 -1
  26. package/dist/cjs/components/XAdkChatbot/styles.js.map +1 -1
  27. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +7 -2
  28. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +30 -12
  29. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
  30. package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +3 -1
  31. package/dist/cjs/components/XAdkProvider/compound/Sender.js +81 -4
  32. package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +3 -3
  33. package/dist/cjs/components/XAdkProvider/compound/styles.d.ts +1 -0
  34. package/dist/cjs/components/XAdkProvider/compound/styles.js +16 -0
  35. package/dist/cjs/components/XAdkProvider/compound/styles.js.map +2 -2
  36. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
  37. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.js.map +2 -2
  38. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
  39. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js +34 -0
  40. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js.map +7 -0
  41. package/dist/cjs/components/XAdkProvider/context/index.d.ts +5 -4
  42. package/dist/cjs/components/XAdkProvider/context/index.js +3 -1
  43. package/dist/cjs/components/XAdkProvider/context/index.js.map +2 -2
  44. package/dist/cjs/components/XAdkProvider/index.js +11 -10
  45. package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
  46. package/dist/cjs/components/XAdkSender/InlineTagInput.d.ts +31 -0
  47. package/dist/cjs/components/XAdkSender/InlineTagInput.js +759 -0
  48. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +7 -0
  49. package/dist/cjs/components/XAdkSender/InputTags.d.ts +8 -0
  50. package/dist/cjs/components/XAdkSender/InputTags.js +51 -0
  51. package/dist/cjs/components/XAdkSender/InputTags.js.map +7 -0
  52. package/dist/cjs/components/XAdkSender/QuickList.d.ts +16 -0
  53. package/dist/cjs/components/XAdkSender/QuickList.js +105 -0
  54. package/dist/cjs/components/XAdkSender/QuickList.js.map +7 -0
  55. package/dist/cjs/components/XAdkSender/index.d.ts +1 -6
  56. package/dist/cjs/components/XAdkSender/index.js +422 -150
  57. package/dist/cjs/components/XAdkSender/index.js.map +3 -3
  58. package/dist/cjs/components/XAdkSender/styles.d.ts +19 -0
  59. package/dist/cjs/components/XAdkSender/styles.js +225 -5
  60. package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
  61. package/dist/cjs/components/XAiConversations/styles.js +11 -1
  62. package/dist/cjs/components/XAiConversations/styles.js.map +2 -2
  63. package/dist/cjs/hooks/useADKChat.js +5 -1
  64. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  65. package/dist/cjs/index.d.ts +8 -3
  66. package/dist/cjs/index.js +44 -10
  67. package/dist/cjs/index.js.map +3 -3
  68. package/dist/cjs/presets/base.d.ts +6 -0
  69. package/dist/cjs/presets/base.js +50 -0
  70. package/dist/cjs/presets/base.js.map +7 -0
  71. package/dist/cjs/presets/define.d.ts +11 -0
  72. package/dist/cjs/presets/define.js +58 -0
  73. package/dist/cjs/presets/define.js.map +7 -0
  74. package/dist/cjs/presets/index.d.ts +3 -0
  75. package/dist/cjs/presets/index.js +28 -0
  76. package/dist/cjs/presets/index.js.map +7 -0
  77. package/dist/cjs/presets/runtime.d.ts +22 -0
  78. package/dist/cjs/presets/runtime.js +75 -0
  79. package/dist/cjs/presets/runtime.js.map +7 -0
  80. package/dist/cjs/presets/xgroup/index.d.ts +5 -0
  81. package/dist/cjs/presets/xgroup/index.js +10 -0
  82. package/dist/cjs/presets/xgroup/index.js.map +2 -2
  83. package/dist/cjs/presets/xgroup/knowledgeReference.d.ts +17 -0
  84. package/dist/cjs/presets/xgroup/knowledgeReference.js +162 -0
  85. package/dist/cjs/presets/xgroup/knowledgeReference.js.map +7 -0
  86. package/dist/cjs/presets/xgroup/preset.d.ts +1 -13
  87. package/dist/cjs/presets/xgroup/preset.js +16 -37
  88. package/dist/cjs/presets/xgroup/preset.js.map +2 -2
  89. package/dist/cjs/presets/xgroup/strategies.d.ts +5 -4
  90. package/dist/cjs/presets/xgroup/strategies.js +11 -15
  91. package/dist/cjs/presets/xgroup/strategies.js.map +3 -3
  92. package/dist/cjs/presets/xgroup/webReference.d.ts +10 -0
  93. package/dist/cjs/presets/xgroup/webReference.js +85 -0
  94. package/dist/cjs/presets/xgroup/webReference.js.map +7 -0
  95. package/dist/cjs/types/ChatStrategies.d.ts +11 -2
  96. package/dist/cjs/types/ChatStrategies.js.map +1 -1
  97. package/dist/cjs/types/FileGallery.d.ts +3 -0
  98. package/dist/cjs/types/FileGallery.js.map +1 -1
  99. package/dist/cjs/types/Sources.d.ts +30 -0
  100. package/dist/cjs/types/Sources.js +18 -0
  101. package/dist/cjs/types/Sources.js.map +7 -0
  102. package/dist/cjs/types/XAdkChatbot.d.ts +33 -0
  103. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  104. package/dist/cjs/types/XAdkSender.d.ts +154 -8
  105. package/dist/cjs/types/XAdkSender.js.map +1 -1
  106. package/dist/cjs/types/index.d.ts +1 -0
  107. package/dist/cjs/types/index.js +3 -1
  108. package/dist/cjs/types/index.js.map +2 -2
  109. package/dist/cjs/utils/index.d.ts +1 -0
  110. package/dist/cjs/utils/index.js +3 -1
  111. package/dist/cjs/utils/index.js.map +2 -2
  112. package/dist/cjs/utils/markdownResource.d.ts +14 -0
  113. package/dist/cjs/utils/markdownResource.js +131 -0
  114. package/dist/cjs/utils/markdownResource.js.map +7 -0
  115. package/dist/esm/components/FileGallery/index.js +22 -16
  116. package/dist/esm/components/FileGallery/index.js.map +1 -1
  117. package/dist/esm/components/FileGallery/styles.d.ts +7 -0
  118. package/dist/esm/components/FileGallery/styles.js +24 -17
  119. package/dist/esm/components/FileGallery/styles.js.map +1 -1
  120. package/dist/esm/components/Sources/components/CarouselCard.d.ts +12 -0
  121. package/dist/esm/components/Sources/components/CarouselCard.js +107 -0
  122. package/dist/esm/components/Sources/components/CarouselCard.js.map +1 -0
  123. package/dist/esm/components/Sources/index.d.ts +5 -0
  124. package/dist/esm/components/Sources/index.js +127 -0
  125. package/dist/esm/components/Sources/index.js.map +1 -0
  126. package/dist/esm/components/Sources/styles.d.ts +59 -0
  127. package/dist/esm/components/Sources/styles.js +34 -0
  128. package/dist/esm/components/Sources/styles.js.map +1 -0
  129. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +19 -1
  130. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +190 -11
  131. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
  132. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
  133. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +5 -2
  134. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
  135. package/dist/esm/components/XAdkChatbot/index.d.ts +2 -2
  136. package/dist/esm/components/XAdkChatbot/index.js +55 -10
  137. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  138. package/dist/esm/components/XAdkChatbot/styles.js +1 -1
  139. package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
  140. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +7 -2
  141. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +40 -17
  142. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
  143. package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +3 -1
  144. package/dist/esm/components/XAdkProvider/compound/Sender.js +70 -6
  145. package/dist/esm/components/XAdkProvider/compound/Sender.js.map +1 -1
  146. package/dist/esm/components/XAdkProvider/compound/styles.d.ts +1 -0
  147. package/dist/esm/components/XAdkProvider/compound/styles.js +3 -2
  148. package/dist/esm/components/XAdkProvider/compound/styles.js.map +1 -1
  149. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
  150. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.js.map +1 -1
  151. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
  152. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js +9 -0
  153. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js.map +1 -0
  154. package/dist/esm/components/XAdkProvider/context/index.d.ts +5 -4
  155. package/dist/esm/components/XAdkProvider/context/index.js +1 -0
  156. package/dist/esm/components/XAdkProvider/context/index.js.map +1 -1
  157. package/dist/esm/components/XAdkProvider/index.js +7 -3
  158. package/dist/esm/components/XAdkProvider/index.js.map +1 -1
  159. package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +31 -0
  160. package/dist/esm/components/XAdkSender/InlineTagInput.js +734 -0
  161. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -0
  162. package/dist/esm/components/XAdkSender/InputTags.d.ts +8 -0
  163. package/dist/esm/components/XAdkSender/InputTags.js +37 -0
  164. package/dist/esm/components/XAdkSender/InputTags.js.map +1 -0
  165. package/dist/esm/components/XAdkSender/QuickList.d.ts +16 -0
  166. package/dist/esm/components/XAdkSender/QuickList.js +96 -0
  167. package/dist/esm/components/XAdkSender/QuickList.js.map +1 -0
  168. package/dist/esm/components/XAdkSender/index.d.ts +1 -6
  169. package/dist/esm/components/XAdkSender/index.js +476 -143
  170. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  171. package/dist/esm/components/XAdkSender/styles.d.ts +19 -0
  172. package/dist/esm/components/XAdkSender/styles.js +34 -12
  173. package/dist/esm/components/XAdkSender/styles.js.map +1 -1
  174. package/dist/esm/components/XAiConversations/styles.js +3 -3
  175. package/dist/esm/components/XAiConversations/styles.js.map +1 -1
  176. package/dist/esm/hooks/useADKChat.js +8 -2
  177. package/dist/esm/hooks/useADKChat.js.map +1 -1
  178. package/dist/esm/index.d.ts +8 -3
  179. package/dist/esm/index.js +7 -4
  180. package/dist/esm/index.js.map +1 -1
  181. package/dist/esm/presets/base.d.ts +6 -0
  182. package/dist/esm/presets/base.js +28 -0
  183. package/dist/esm/presets/base.js.map +1 -0
  184. package/dist/esm/presets/define.d.ts +11 -0
  185. package/dist/esm/presets/define.js +33 -0
  186. package/dist/esm/presets/define.js.map +1 -0
  187. package/dist/esm/presets/index.d.ts +3 -0
  188. package/dist/esm/presets/index.js +4 -0
  189. package/dist/esm/presets/index.js.map +1 -0
  190. package/dist/esm/presets/runtime.d.ts +22 -0
  191. package/dist/esm/presets/runtime.js +45 -0
  192. package/dist/esm/presets/runtime.js.map +1 -0
  193. package/dist/esm/presets/xgroup/index.d.ts +5 -0
  194. package/dist/esm/presets/xgroup/index.js +6 -0
  195. package/dist/esm/presets/xgroup/index.js.map +1 -1
  196. package/dist/esm/presets/xgroup/knowledgeReference.d.ts +17 -0
  197. package/dist/esm/presets/xgroup/knowledgeReference.js +95 -0
  198. package/dist/esm/presets/xgroup/knowledgeReference.js.map +1 -0
  199. package/dist/esm/presets/xgroup/preset.d.ts +1 -13
  200. package/dist/esm/presets/xgroup/preset.js +9 -29
  201. package/dist/esm/presets/xgroup/preset.js.map +1 -1
  202. package/dist/esm/presets/xgroup/strategies.d.ts +5 -4
  203. package/dist/esm/presets/xgroup/strategies.js +8 -20
  204. package/dist/esm/presets/xgroup/strategies.js.map +1 -1
  205. package/dist/esm/presets/xgroup/webReference.d.ts +10 -0
  206. package/dist/esm/presets/xgroup/webReference.js +46 -0
  207. package/dist/esm/presets/xgroup/webReference.js.map +1 -0
  208. package/dist/esm/types/ChatStrategies.d.ts +11 -2
  209. package/dist/esm/types/ChatStrategies.js.map +1 -1
  210. package/dist/esm/types/FileGallery.d.ts +3 -0
  211. package/dist/esm/types/FileGallery.js.map +1 -1
  212. package/dist/esm/types/Sources.d.ts +30 -0
  213. package/dist/esm/types/Sources.js +2 -0
  214. package/dist/esm/types/Sources.js.map +1 -0
  215. package/dist/esm/types/XAdkChatbot.d.ts +33 -0
  216. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  217. package/dist/esm/types/XAdkSender.d.ts +154 -8
  218. package/dist/esm/types/XAdkSender.js.map +1 -1
  219. package/dist/esm/types/index.d.ts +1 -0
  220. package/dist/esm/types/index.js +1 -0
  221. package/dist/esm/types/index.js.map +1 -1
  222. package/dist/esm/utils/index.d.ts +1 -0
  223. package/dist/esm/utils/index.js +1 -0
  224. package/dist/esm/utils/index.js.map +1 -1
  225. package/dist/esm/utils/markdownResource.d.ts +14 -0
  226. package/dist/esm/utils/markdownResource.js +101 -0
  227. package/dist/esm/utils/markdownResource.js.map +1 -0
  228. package/dist/umd/chat-sdk.min.js +1 -1
  229. package/package.json +6 -1
  230. package/dist/cjs/components/XAdkSender/Switch.d.ts +0 -16
  231. package/dist/cjs/components/XAdkSender/Switch.js +0 -95
  232. package/dist/cjs/components/XAdkSender/Switch.js.map +0 -7
  233. package/dist/esm/components/XAdkSender/Switch.d.ts +0 -16
  234. package/dist/esm/components/XAdkSender/Switch.js +0 -53
  235. package/dist/esm/components/XAdkSender/Switch.js.map +0 -1
@@ -1,22 +1,27 @@
1
1
  import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
- import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
2
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
3
  import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
4
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
5
5
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
6
6
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
7
- import React, { useState, useRef, useCallback, forwardRef, useImperativeHandle } from "react";
7
+ import React, { useState, useRef, useCallback, forwardRef, useImperativeHandle, useMemo, useEffect } from "react";
8
8
  import { Popconfirm, message, Tooltip, Input, Modal } from "antd";
9
- import { ClearOutlined, LoadingOutlined, ArrowUpOutlined, PaperClipOutlined } from "@ant-design/icons";
9
+ import { ClearOutlined, LoadingOutlined, ArrowUpOutlined } from "@ant-design/icons";
10
10
  import { useStyles } from "./styles";
11
11
  import FileGallery from "../FileGallery";
12
+ import QuickList from "./QuickList";
13
+ import InputTags from "./InputTags";
14
+ import InlineTagInput from "./InlineTagInput";
12
15
  import { getExt } from "../../utils/file";
16
+ import { jsx as _jsx } from "react/jsx-runtime";
17
+ import { Fragment as _Fragment } from "react/jsx-runtime";
18
+ import { jsxs as _jsxs } from "react/jsx-runtime";
13
19
  var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
14
20
  var _ref$clearBtnShow = _ref.clearBtnShow,
15
21
  clearBtnShow = _ref$clearBtnShow === void 0 ? true : _ref$clearBtnShow,
16
- _ref$allowUpload = _ref.allowUpload,
17
- allowUpload = _ref$allowUpload === void 0 ? false : _ref$allowUpload,
18
22
  _ref$draggable = _ref.draggable,
19
- draggable = _ref$draggable === void 0 ? true : _ref$draggable,
23
+ draggable = _ref$draggable === void 0 ? false : _ref$draggable,
24
+ onFileSelect = _ref.onFileSelect,
20
25
  _ref$loading = _ref.loading,
21
26
  loading = _ref$loading === void 0 ? false : _ref$loading,
22
27
  _ref$disabled = _ref.disabled,
@@ -35,6 +40,8 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
35
40
  onUploadError = _ref.onUploadError,
36
41
  _ref$maxFileSize = _ref.maxFileSize,
37
42
  maxFileSize = _ref$maxFileSize === void 0 ? 10 : _ref$maxFileSize,
43
+ _ref$placeholder = _ref.placeholder,
44
+ placeholder = _ref$placeholder === void 0 ? "" : _ref$placeholder,
38
45
  _ref$validators = _ref.validators,
39
46
  customValidators = _ref$validators === void 0 ? [] : _ref$validators,
40
47
  _ref$allowedFileTypes = _ref.allowedFileTypes,
@@ -45,7 +52,28 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
45
52
  suffix = _ref.suffix,
46
53
  header = _ref.header,
47
54
  prefix = _ref.prefix,
48
- footer = _ref.footer;
55
+ footer = _ref.footer,
56
+ footerLeft = _ref.footerLeft,
57
+ _ref$quickKeys = _ref.quickKeys,
58
+ quickKeys = _ref$quickKeys === void 0 ? [] : _ref$quickKeys,
59
+ _ref$inlineTags = _ref.inlineTags,
60
+ inlineTags = _ref$inlineTags === void 0 ? false : _ref$inlineTags,
61
+ renderMention = _ref.renderMention,
62
+ renderTag = _ref.renderTag,
63
+ controlledMentions = _ref.mentions,
64
+ controlledTags = _ref.tags,
65
+ defaultMentions = _ref.defaultMentions,
66
+ _ref$defaultTags = _ref.defaultTags,
67
+ defaultTags = _ref$defaultTags === void 0 ? [] : _ref$defaultTags,
68
+ defaultInputParts = _ref.defaultInputParts,
69
+ onMentionsChange = _ref.onMentionsChange,
70
+ onTagsChange = _ref.onTagsChange,
71
+ onQuickKeyTrigger = _ref.onQuickKeyTrigger,
72
+ _ref$submitFormat = _ref.submitFormat,
73
+ submitFormat = _ref$submitFormat === void 0 ? "text" : _ref$submitFormat,
74
+ formatMention = _ref.formatMention,
75
+ formatTag = _ref.formatTag,
76
+ transformSubmitData = _ref.transformSubmitData;
49
77
  var styles = useStyles();
50
78
  var isControlled = controlledValue !== undefined;
51
79
  var _useState = useState(defaultValue),
@@ -59,16 +87,53 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
59
87
  }
60
88
  onChange === null || onChange === void 0 || onChange(newValue);
61
89
  };
62
- var _useState3 = useState([]),
90
+
91
+ // mentions 支持受控/非受控两种模式;inlineTags 打开时会和输入内容混排。
92
+ var resolvedControlledMentions = controlledMentions !== null && controlledMentions !== void 0 ? controlledMentions : controlledTags;
93
+ var initialMentions = defaultMentions !== null && defaultMentions !== void 0 ? defaultMentions : defaultTags;
94
+ var isMentionsControlled = resolvedControlledMentions !== undefined;
95
+ var _useState3 = useState(initialMentions),
63
96
  _useState4 = _slicedToArray(_useState3, 2),
64
- files = _useState4[0],
65
- setFiles = _useState4[1];
66
- var _useState5 = useState(false),
97
+ internalMentions = _useState4[0],
98
+ setInternalMentions = _useState4[1];
99
+ var mentions = isMentionsControlled ? resolvedControlledMentions : internalMentions;
100
+ var setMentions = function setMentions(newMentions) {
101
+ if (!isMentionsControlled) {
102
+ setInternalMentions(newMentions);
103
+ }
104
+ onMentionsChange === null || onMentionsChange === void 0 || onMentionsChange(newMentions);
105
+ onTagsChange === null || onTagsChange === void 0 || onTagsChange(newMentions);
106
+ };
107
+ var _useState5 = useState([]),
67
108
  _useState6 = _slicedToArray(_useState5, 2),
68
- isDragOver = _useState6[0],
69
- setIsDragOver = _useState6[1];
109
+ files = _useState6[0],
110
+ setFiles = _useState6[1];
111
+ var _useState7 = useState(false),
112
+ _useState8 = _slicedToArray(_useState7, 2),
113
+ isDragOver = _useState8[0],
114
+ setIsDragOver = _useState8[1];
70
115
  var containerRef = useRef(null);
71
- var fileInputRef = useRef(null);
116
+ var textareaRef = useRef(null);
117
+ var inlineInputRef = useRef(null);
118
+
119
+ // 快捷键弹层状态:记录触发字符、关键词,以及触发字符在纯文本中的位置。
120
+ // SDK 不内置搜索框;业务方可在 onQuickKeyTrigger 中根据 keyword 自行更新 quickKeys.options。
121
+ var _useState9 = useState(null),
122
+ _useState10 = _slicedToArray(_useState9, 2),
123
+ activeQuickKey = _useState10[0],
124
+ setActiveQuickKey = _useState10[1];
125
+ var _useState11 = useState(""),
126
+ _useState12 = _slicedToArray(_useState11, 2),
127
+ quickKeyKeyword = _useState12[0],
128
+ setQuickKeyKeyword = _useState12[1];
129
+ var _useState13 = useState(-1),
130
+ _useState14 = _slicedToArray(_useState13, 2),
131
+ quickKeyTriggerIdx = _useState14[0],
132
+ setQuickKeyTriggerIdx = _useState14[1];
133
+ var _useState15 = useState(0),
134
+ _useState16 = _slicedToArray(_useState15, 2),
135
+ quickKeyActiveIndex = _useState16[0],
136
+ setQuickKeyActiveIndex = _useState16[1];
72
137
 
73
138
  // 生成唯一ID
74
139
  var generateId = function generateId() {
@@ -79,13 +144,93 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
79
144
  var data = (_response$data = response === null || response === void 0 ? void 0 : response.data) !== null && _response$data !== void 0 ? _response$data : response;
80
145
  return (_ref2 = Array.isArray(data) ? data[0] : data) !== null && _ref2 !== void 0 ? _ref2 : {};
81
146
  };
147
+ var escapeXml = function escapeXml(text) {
148
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
149
+ };
150
+ var escapeMarkdownLabel = function escapeMarkdownLabel(text) {
151
+ return text.replace(/\\/g, "\\\\").replace(/\]/g, "\\]");
152
+ };
153
+ var getMentionSubmitValue = function getMentionSubmitValue(mention) {
154
+ var _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _mention$value, _mention$data, _mention$data2, _mention$data3;
155
+ return String((_ref3 = (_ref4 = (_ref5 = (_ref6 = (_ref7 = (_ref8 = (_ref9 = (_mention$value = mention.value) !== null && _mention$value !== void 0 ? _mention$value : mention.uri) !== null && _ref9 !== void 0 ? _ref9 : (_mention$data = mention.data) === null || _mention$data === void 0 ? void 0 : _mention$data.uri) !== null && _ref8 !== void 0 ? _ref8 : (_mention$data2 = mention.data) === null || _mention$data2 === void 0 ? void 0 : _mention$data2.value) !== null && _ref7 !== void 0 ? _ref7 : (_mention$data3 = mention.data) === null || _mention$data3 === void 0 ? void 0 : _mention$data3.name) !== null && _ref6 !== void 0 ? _ref6 : mention.targetId) !== null && _ref5 !== void 0 ? _ref5 : mention.displayName) !== null && _ref4 !== void 0 ? _ref4 : mention.label) !== null && _ref3 !== void 0 ? _ref3 : "");
156
+ };
157
+ var defaultFormatMention = function defaultFormatMention(mention, format, index) {
158
+ var value = getMentionSubmitValue(mention);
159
+ if (format === "xml") {
160
+ return "<mention type=\"".concat(escapeXml(mention.type), "\" id=\"").concat(escapeXml(mention.id), "\" label=\"").concat(escapeXml(mention.label), "\" value=\"").concat(escapeXml(value), "\" />");
161
+ }
162
+ if (format === "markdown") {
163
+ var href = mention.uri || (value.includes("://") ? value : "xadk-mention://".concat(encodeURIComponent(mention.type), "/").concat(encodeURIComponent(mention.id)));
164
+ return "[@".concat(escapeMarkdownLabel(mention.displayName || mention.label), "](").concat(href, ")");
165
+ }
166
+ return "@".concat(mention.displayName || value || "mention-".concat(index + 1));
167
+ };
168
+ var serializeMention = function serializeMention(mention, format, index) {
169
+ var _ref10, _formatMention;
170
+ return (_ref10 = (_formatMention = formatMention === null || formatMention === void 0 ? void 0 : formatMention(mention, {
171
+ format: format,
172
+ index: index
173
+ })) !== null && _formatMention !== void 0 ? _formatMention : formatTag === null || formatTag === void 0 ? void 0 : formatTag(mention, {
174
+ format: format,
175
+ index: index
176
+ })) !== null && _ref10 !== void 0 ? _ref10 : defaultFormatMention(mention, format, index);
177
+ };
178
+ var getSubmitParts = useCallback(function () {
179
+ if (inlineTags) {
180
+ var _inlineInputRef$curre;
181
+ var parts = ((_inlineInputRef$curre = inlineInputRef.current) === null || _inlineInputRef$curre === void 0 ? void 0 : _inlineInputRef$curre.getParts()) || [];
182
+ if (parts.length > 0) return parts;
183
+ }
184
+ var textParts = value ? [{
185
+ type: "text",
186
+ text: value
187
+ }] : [];
188
+ var mentionParts = mentions.map(function (mention) {
189
+ return {
190
+ type: "mention",
191
+ mention: mention
192
+ };
193
+ });
194
+ return [].concat(_toConsumableArray(mentionParts), textParts);
195
+ }, [inlineTags, mentions, value]);
196
+ var serializeParts = function serializeParts(parts, format) {
197
+ if (format === "structured") {
198
+ return parts.reduce(function (content, part) {
199
+ return content + (part.type === "text" ? part.text : "");
200
+ }, "");
201
+ }
202
+ var tagIndex = 0;
203
+ return parts.map(function (part) {
204
+ if (part.type === "text") return part.text;
205
+ var result = serializeMention(part.mention, format, tagIndex);
206
+ tagIndex += 1;
207
+ return result;
208
+ }).join("");
209
+ };
210
+ var createSubmitData = function createSubmitData(formattedFiles) {
211
+ var parts = getSubmitParts();
212
+ var rawText = parts.reduce(function (content, part) {
213
+ return content + (part.type === "text" ? part.text : "");
214
+ }, "");
215
+ var standardData = {
216
+ text: serializeParts(parts, submitFormat),
217
+ rawText: rawText,
218
+ format: submitFormat,
219
+ parts: parts,
220
+ files: formattedFiles,
221
+ mentions: mentions,
222
+ tags: mentions
223
+ };
224
+ return _objectSpread(_objectSpread({}, standardData), {}, {
225
+ payload: transformSubmitData === null || transformSubmitData === void 0 ? void 0 : transformSubmitData(standardData)
226
+ });
227
+ };
82
228
 
83
229
  // 检查文件类型
84
230
  var checkFileType = function checkFileType(file) {
85
231
  if ((allowedFileTypes === null || allowedFileTypes === void 0 ? void 0 : allowedFileTypes.length) > 0) {
86
232
  var ext = getExt(file);
87
233
  return allowedFileTypes.some(function (type) {
88
- // 1️⃣ MIME 校验
89
234
  if (type.includes("/")) {
90
235
  if (type.endsWith("/*")) {
91
236
  return file.type.startsWith(type.split("/")[0]);
@@ -101,12 +246,6 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
101
246
  return true;
102
247
  };
103
248
 
104
- // 检查文件大小
105
- var checkFileSize = function checkFileSize(file) {
106
- var maxSize = maxFileSize * 1024 * 1024;
107
- return file.size <= maxSize;
108
- };
109
-
110
249
  // 重复文件检测
111
250
  var isDuplicateFile = function isDuplicateFile(file, files) {
112
251
  return files.some(function (f) {
@@ -115,33 +254,25 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
115
254
  };
116
255
 
117
256
  // 内置校验器集合
118
- var builtInValidators = [
119
- // 数量校验(修复批量 bug)
120
- function (_file, _ref3) {
121
- var files = _ref3.files;
257
+ var builtInValidators = [function (_file, _ref11) {
258
+ var files = _ref11.files;
122
259
  if (files.length >= maxFiles) {
123
260
  return "\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ".concat(maxFiles, " \u4E2A\u6587\u4EF6");
124
261
  }
125
262
  return null;
126
- },
127
- // 大小校验
128
- function (file) {
263
+ }, function (file) {
129
264
  var maxSize = maxFileSize * 1024 * 1024;
130
265
  if (file.size > maxSize) {
131
266
  return "\u6587\u4EF6\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC7 ".concat(maxFileSize, "MB");
132
267
  }
133
268
  return null;
134
- },
135
- // 类型校验
136
- function (file) {
269
+ }, function (file) {
137
270
  if (!checkFileType(file)) {
138
271
  return "不支持的文件类型";
139
272
  }
140
273
  return null;
141
- },
142
- // ⭐ 新增:去重校验
143
- function (file, _ref4) {
144
- var files = _ref4.files;
274
+ }, function (file, _ref12) {
275
+ var files = _ref12.files;
145
276
  if (isDuplicateFile(file, files)) {
146
277
  return "文件已存在";
147
278
  }
@@ -212,18 +343,38 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
212
343
  }
213
344
  }, [files, maxFiles, maxFileSize, allowedFileTypes]);
214
345
 
215
- // 暴露 addFiles 方法供外层(如 DefaultLayout 拖拽上传)调用
346
+ // 暴露给业务工具栏调用的命令式能力;外部 Popover 选择标签时可插入到当前光标位置。
216
347
  useImperativeHandle(ref, function () {
217
348
  return {
218
349
  addFiles: function addFiles(rawFiles) {
219
350
  handleFileSelect(rawFiles);
351
+ },
352
+ insertMention: function insertMention(mention) {
353
+ if (inlineTags) {
354
+ var _inlineInputRef$curre2;
355
+ (_inlineInputRef$curre2 = inlineInputRef.current) === null || _inlineInputRef$curre2 === void 0 || _inlineInputRef$curre2.insertMention(mention);
356
+ return;
357
+ }
358
+ setMentions([].concat(_toConsumableArray(mentions), [mention]));
359
+ },
360
+ insertTag: function insertTag(mention) {
361
+ if (inlineTags) {
362
+ var _inlineInputRef$curre3;
363
+ (_inlineInputRef$curre3 = inlineInputRef.current) === null || _inlineInputRef$curre3 === void 0 || _inlineInputRef$curre3.insertMention(mention);
364
+ return;
365
+ }
366
+ setMentions([].concat(_toConsumableArray(mentions), [mention]));
367
+ },
368
+ focus: function focus() {
369
+ var _inlineInputRef$curre4, _textareaRef$current;
370
+ inlineTags ? (_inlineInputRef$curre4 = inlineInputRef.current) === null || _inlineInputRef$curre4 === void 0 ? void 0 : _inlineInputRef$curre4.focus() : (_textareaRef$current = textareaRef.current) === null || _textareaRef$current === void 0 ? void 0 : _textareaRef$current.focus();
220
371
  }
221
372
  };
222
- }, [handleFileSelect]);
373
+ }, [handleFileSelect, inlineTags, setMentions, mentions]);
223
374
 
224
375
  // 上传文件
225
376
  var uploadFiles = /*#__PURE__*/function () {
226
- var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(fileList) {
377
+ var _ref13 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(fileList) {
227
378
  var _iterator2, _step2, _loop;
228
379
  return _regeneratorRuntime().wrap(function _callee$(_context2) {
229
380
  while (1) switch (_context2.prev = _context2.next) {
@@ -236,7 +387,6 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
236
387
  while (1) switch (_context.prev = _context.next) {
237
388
  case 0:
238
389
  localFile = _step2.value;
239
- // 开始上传
240
390
  setFiles(function (prev) {
241
391
  return prev.map(function (f) {
242
392
  return f.id === localFile.id ? _objectSpread(_objectSpread({}, f), {}, {
@@ -339,7 +489,7 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
339
489
  }, _callee, null, [[1, 10, 13, 16]]);
340
490
  }));
341
491
  return function uploadFiles(_x) {
342
- return _ref5.apply(this, arguments);
492
+ return _ref13.apply(this, arguments);
343
493
  };
344
494
  }();
345
495
 
@@ -354,40 +504,201 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
354
504
  });
355
505
  };
356
506
 
357
- // 触发文件选择
358
- var triggerFileSelect = function triggerFileSelect() {
359
- if (fileInputRef.current) {
360
- fileInputRef.current.click();
361
- }
362
- };
363
-
364
507
  // 处理拖拽事件
365
508
  var handleDragOver = useCallback(function (e) {
366
509
  e.preventDefault();
367
510
  e.stopPropagation();
368
- if (allowUpload) {
511
+ if (draggable) {
369
512
  setIsDragOver(true);
370
513
  }
371
- }, [allowUpload]);
514
+ }, [draggable]);
372
515
  var handleDragLeave = useCallback(function (e) {
373
516
  e.preventDefault();
374
517
  e.stopPropagation();
375
- if (allowUpload) {
518
+ if (draggable) {
376
519
  setIsDragOver(false);
377
520
  }
378
- }, [allowUpload]);
521
+ }, [draggable]);
379
522
  var handleDrop = useCallback(function (e) {
380
523
  e.preventDefault();
381
524
  e.stopPropagation();
382
525
  setIsDragOver(false);
383
- if (allowUpload && e.dataTransfer.files && e.dataTransfer.files.length > 0) {
384
- handleFileSelect(Array.from(e.dataTransfer.files));
526
+ if (draggable && e.dataTransfer.files && e.dataTransfer.files.length > 0) {
527
+ // 内核不再自行处理文件,交给外层(DefaultLayout/业务)通过 onFileSelect 决定
528
+ onFileSelect === null || onFileSelect === void 0 || onFileSelect(Array.from(e.dataTransfer.files));
529
+ }
530
+ }, [draggable, onFileSelect]);
531
+
532
+ // 删除标签
533
+ var handleRemoveMention = useCallback(function (id) {
534
+ setMentions(mentions.filter(function (item) {
535
+ return item.id !== id;
536
+ }));
537
+ }, [mentions, setMentions]);
538
+
539
+ // 查找当前活跃的快捷键配置
540
+ var activeQuickKeyConfig = useMemo(function () {
541
+ if (!activeQuickKey) return null;
542
+ return quickKeys.find(function (qk) {
543
+ return qk.key === activeQuickKey;
544
+ }) || null;
545
+ }, [activeQuickKey, quickKeys]);
546
+ var activeQuickKeyOptionsLength = (activeQuickKeyConfig === null || activeQuickKeyConfig === void 0 ? void 0 : activeQuickKeyConfig.options.length) || 0;
547
+ useEffect(function () {
548
+ setQuickKeyActiveIndex(0);
549
+ }, [activeQuickKey]);
550
+ useEffect(function () {
551
+ if (activeQuickKeyOptionsLength <= 0) {
552
+ setQuickKeyActiveIndex(0);
553
+ return;
554
+ }
555
+
556
+ // 业务方可能在 onQuickKeyTrigger 中动态更新 options;
557
+ // 这里只做越界归一化,不重置有效索引,避免键盘高亮移动后又跳回第一项。
558
+ setQuickKeyActiveIndex(function (prev) {
559
+ return (prev % activeQuickKeyOptionsLength + activeQuickKeyOptionsLength) % activeQuickKeyOptionsLength;
560
+ });
561
+ }, [activeQuickKeyOptionsLength]);
562
+ var getNextQuickKeyIndex = useCallback(function (current, step) {
563
+ if (activeQuickKeyOptionsLength <= 0) return 0;
564
+ return (current + step + activeQuickKeyOptionsLength) % activeQuickKeyOptionsLength;
565
+ }, [activeQuickKeyOptionsLength]);
566
+
567
+ // 从当前光标前的连续文本片段中查找最近的快捷键,例如 abc@doc 会触发 @。
568
+ var detectQuickKey = useCallback(function (text, cursorPos) {
569
+ var quickKeyChars = quickKeys.map(function (qk) {
570
+ return qk.key;
571
+ });
572
+ if (quickKeyChars.length === 0) return;
573
+ var textBeforeCursor = text.slice(0, cursorPos);
574
+ var found = false;
575
+ for (var i = textBeforeCursor.length - 1; i >= 0; i--) {
576
+ var char = textBeforeCursor[i];
577
+ if (/\s/.test(char)) break;
578
+ if (quickKeyChars.includes(char)) {
579
+ var keyword = textBeforeCursor.slice(i + 1);
580
+ setActiveQuickKey(char);
581
+ setQuickKeyKeyword(keyword);
582
+ setQuickKeyTriggerIdx(i);
583
+ setQuickKeyActiveIndex(0);
584
+ onQuickKeyTrigger === null || onQuickKeyTrigger === void 0 || onQuickKeyTrigger(char, keyword);
585
+ found = true;
586
+ break;
587
+ }
588
+ }
589
+ if (!found && activeQuickKey) {
590
+ var triggerChar = text[quickKeyTriggerIdx];
591
+ var _keyword = text.slice(quickKeyTriggerIdx + 1, cursorPos);
592
+ if (quickKeyTriggerIdx < 0 || !triggerChar || !quickKeyChars.includes(triggerChar) || /\s/.test(_keyword)) {
593
+ setActiveQuickKey(null);
594
+ setQuickKeyKeyword("");
595
+ setQuickKeyTriggerIdx(-1);
596
+ setQuickKeyActiveIndex(0);
597
+ } else {
598
+ setQuickKeyKeyword(_keyword);
599
+ }
600
+ }
601
+ }, [activeQuickKey, onQuickKeyTrigger, quickKeyTriggerIdx, quickKeys]);
602
+
603
+ // 选择快捷项后转成结构化 Mention;inline 模式会替换掉触发字符和关键词。
604
+ var handleQuickKeySelect = useCallback(function (option) {
605
+ var _ref14, _ref15, _option$value, _ref16, _option$targetId, _option$displayName, _activeQuickKeyConfig, _inlineInputRef$curre6, _textareaRef$current2;
606
+ var mentionType = (activeQuickKeyConfig === null || activeQuickKeyConfig === void 0 ? void 0 : activeQuickKeyConfig.mentionType) || (activeQuickKeyConfig === null || activeQuickKeyConfig === void 0 ? void 0 : activeQuickKeyConfig.tagType) || activeQuickKey || "unknown";
607
+ var newMention = {
608
+ id: generateId(),
609
+ label: option.label,
610
+ type: mentionType,
611
+ value: (_ref14 = (_ref15 = (_option$value = option.value) !== null && _option$value !== void 0 ? _option$value : option.uri) !== null && _ref15 !== void 0 ? _ref15 : option.name) !== null && _ref14 !== void 0 ? _ref14 : option.label,
612
+ uri: option.uri,
613
+ targetId: (_ref16 = (_option$targetId = option.targetId) !== null && _option$targetId !== void 0 ? _option$targetId : option.skillNo) !== null && _ref16 !== void 0 ? _ref16 : option.pluginNo,
614
+ displayName: (_option$displayName = option.displayName) !== null && _option$displayName !== void 0 ? _option$displayName : option.label,
615
+ trigger: activeQuickKey || undefined,
616
+ icon: option.icon,
617
+ data: option
618
+ };
619
+ activeQuickKeyConfig === null || activeQuickKeyConfig === void 0 || (_activeQuickKeyConfig = activeQuickKeyConfig.onSelect) === null || _activeQuickKeyConfig === void 0 || _activeQuickKeyConfig.call(activeQuickKeyConfig, option);
620
+ if (inlineTags) {
621
+ var _inlineInputRef$curre5;
622
+ (_inlineInputRef$curre5 = inlineInputRef.current) === null || _inlineInputRef$curre5 === void 0 || _inlineInputRef$curre5.insertMention(newMention, {
623
+ start: quickKeyTriggerIdx,
624
+ end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length
625
+ });
626
+ } else {
627
+ setMentions([].concat(_toConsumableArray(mentions), [newMention]));
628
+
629
+ // 从输入框中删除快捷键字符和关键词
630
+ if (quickKeyTriggerIdx >= 0) {
631
+ var newValue = value.slice(0, quickKeyTriggerIdx) + value.slice(quickKeyTriggerIdx + 1 + quickKeyKeyword.length);
632
+ setValue(newValue);
633
+ }
634
+ }
635
+ setActiveQuickKey(null);
636
+ setQuickKeyKeyword("");
637
+ setQuickKeyTriggerIdx(-1);
638
+ setQuickKeyActiveIndex(0);
639
+ inlineTags ? (_inlineInputRef$curre6 = inlineInputRef.current) === null || _inlineInputRef$curre6 === void 0 ? void 0 : _inlineInputRef$curre6.focus() : (_textareaRef$current2 = textareaRef.current) === null || _textareaRef$current2 === void 0 ? void 0 : _textareaRef$current2.focus();
640
+ }, [activeQuickKey, activeQuickKeyConfig, inlineTags, mentions, setMentions, value, quickKeyTriggerIdx, quickKeyKeyword, setValue]);
641
+
642
+ // 处理输入框变化(含快捷键检测)
643
+ var handleInputChange = function handleInputChange(e) {
644
+ var newValue = e.target.value;
645
+ setValue(newValue);
646
+
647
+ // 检测快捷键触发
648
+ detectQuickKey(newValue, e.target.selectionStart || 0);
649
+ };
650
+ var handleInlineInputChange = function handleInlineInputChange(newValue) {
651
+ var _inlineInputRef$curre7;
652
+ setValue(newValue);
653
+ // contenteditable 的 selection 不一定和 React state 同步,需实时读取内部光标 offset。
654
+ detectQuickKey(newValue, ((_inlineInputRef$curre7 = inlineInputRef.current) === null || _inlineInputRef$curre7 === void 0 ? void 0 : _inlineInputRef$curre7.getCursorOffset()) || newValue.length);
655
+ };
656
+ var handleQuickKeyByText = function handleQuickKeyByText(text, cursorPos) {
657
+ var quickKeyChars = quickKeys.map(function (qk) {
658
+ return qk.key;
659
+ });
660
+ if (quickKeyChars.length === 0) return;
661
+ var textBeforeCursor = text.slice(0, cursorPos);
662
+
663
+ // 检测刚输入的字符是否是快捷键
664
+ var lastChar = textBeforeCursor[cursorPos - 1];
665
+ if (lastChar && quickKeyChars.includes(lastChar)) {
666
+ // 上下键导航后会触发 keyup,此时光标前仍是同一个快捷键字符;
667
+ // 如果重复重置 activeIndex,视觉上会“移动一下又回到第一项”。
668
+ if (activeQuickKey === lastChar && quickKeyTriggerIdx === cursorPos - 1) {
669
+ return;
670
+ }
671
+ setActiveQuickKey(lastChar);
672
+ setQuickKeyKeyword("");
673
+ setQuickKeyTriggerIdx(cursorPos - 1);
674
+ setQuickKeyActiveIndex(0);
675
+ onQuickKeyTrigger === null || onQuickKeyTrigger === void 0 || onQuickKeyTrigger(lastChar, "");
385
676
  }
386
- }, [allowUpload, handleFileSelect]);
677
+ };
678
+
679
+ // onChange 负责更新搜索词;onKeyUp 兜底捕获刚输入的快捷键字符。
680
+ var isQuickListControlKey = function isQuickListControlKey(key) {
681
+ return key === "ArrowDown" || key === "ArrowUp" || key === "Enter" || key === "Escape";
682
+ };
683
+ var handleKeyUp = function handleKeyUp(e) {
684
+ if (activeQuickKey && isQuickListControlKey(e.key)) return;
685
+ var target = e.target;
686
+ handleQuickKeyByText(target.value || "", target.selectionStart || 0);
687
+ };
688
+ var handleInlineKeyUp = function handleInlineKeyUp(e) {
689
+ var _inlineInputRef$curre8, _inlineInputRef$curre9;
690
+ if (activeQuickKey && isQuickListControlKey(e.key)) return;
691
+ // inline 输入区不是 textarea,不能读 event.target.value,只能从 ref 取纯文本。
692
+ var text = ((_inlineInputRef$curre8 = inlineInputRef.current) === null || _inlineInputRef$curre8 === void 0 ? void 0 : _inlineInputRef$curre8.getText()) || "";
693
+ var cursorPos = ((_inlineInputRef$curre9 = inlineInputRef.current) === null || _inlineInputRef$curre9 === void 0 ? void 0 : _inlineInputRef$curre9.getCursorOffset()) || text.length;
694
+ handleQuickKeyByText(text, cursorPos);
695
+ };
387
696
 
388
697
  // 处理提交
389
698
  var handleSubmit = function handleSubmit() {
390
- if (!value.trim() && files.length === 0) {
699
+ // 生成期间允许继续编辑下一条消息,但停止按钮仍代表当前唯一可执行动作。
700
+ if (loading) return;
701
+ if (!value.trim() && files.length === 0 && mentions.length === 0) {
391
702
  message.warning("请输入消息或选择文件");
392
703
  return;
393
704
  }
@@ -406,12 +717,10 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
406
717
  onOk: function onOk() {
407
718
  var formattedFiles = formatFilesForServer(successFiles);
408
719
  if (onSubmit) {
409
- onSubmit({
410
- text: value,
411
- files: formattedFiles
412
- });
720
+ onSubmit(createSubmitData(formattedFiles));
413
721
  }
414
722
  setValue("");
723
+ setMentions([]);
415
724
  setFiles(function (prev) {
416
725
  return prev.filter(function (f) {
417
726
  return f.status !== "success";
@@ -425,12 +734,10 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
425
734
  } else {
426
735
  var formattedFiles = formatFilesForServer(successFiles);
427
736
  if (onSubmit) {
428
- onSubmit({
429
- text: value,
430
- files: formattedFiles
431
- });
737
+ onSubmit(createSubmitData(formattedFiles));
432
738
  }
433
739
  setValue("");
740
+ setMentions([]);
434
741
  setFiles(function (prev) {
435
742
  return prev.filter(function (f) {
436
743
  return f.status !== "success";
@@ -457,34 +764,53 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
457
764
  });
458
765
  };
459
766
 
460
- // 处理输入框变化
461
- var handleInputChange = function handleInputChange(e) {
462
- var newValue = e.target.value;
463
- setValue(newValue);
464
- };
465
-
466
767
  // 处理回车键
467
768
  var handleKeyDown = function handleKeyDown(e) {
468
- if (e.key === "Enter" && !e.shiftKey) {
769
+ var quickKeyOptions = (activeQuickKeyConfig === null || activeQuickKeyConfig === void 0 ? void 0 : activeQuickKeyConfig.options) || [];
770
+ if (activeQuickKey && quickKeyOptions.length > 0) {
771
+ if (e.key === "ArrowDown") {
772
+ e.preventDefault();
773
+ setQuickKeyActiveIndex(function (prev) {
774
+ return getNextQuickKeyIndex(prev, 1);
775
+ });
776
+ return;
777
+ }
778
+ if (e.key === "ArrowUp") {
779
+ e.preventDefault();
780
+ setQuickKeyActiveIndex(function (prev) {
781
+ return getNextQuickKeyIndex(prev, -1);
782
+ });
783
+ return;
784
+ }
785
+ if (e.key === "Enter") {
786
+ e.preventDefault();
787
+ handleQuickKeySelect(quickKeyOptions[Math.min(quickKeyActiveIndex, quickKeyOptions.length - 1)]);
788
+ return;
789
+ }
790
+ if (e.key === "Escape") {
791
+ e.preventDefault();
792
+ setActiveQuickKey(null);
793
+ setQuickKeyKeyword("");
794
+ setQuickKeyTriggerIdx(-1);
795
+ setQuickKeyActiveIndex(0);
796
+ return;
797
+ }
798
+ }
799
+ if (e.key === "Enter" && !e.shiftKey && !activeQuickKey) {
469
800
  e.preventDefault();
470
801
  handleSubmit();
471
802
  }
472
803
  };
473
804
 
474
- // 渲染文件列表 - 使用新的 FileGallery 组件
805
+ // 渲染文件列表
475
806
  var renderFileList = function renderFileList() {
476
807
  if (files.length === 0) return null;
477
808
  return /*#__PURE__*/_jsx("div", {
478
- style: {
479
- display: "flex",
480
- flexWrap: "wrap",
481
- gap: "8px",
482
- padding: "12px 0"
483
- },
809
+ className: styles.contextFiles,
484
810
  children: files.map(function (file) {
485
811
  return /*#__PURE__*/_jsx(FileGallery, {
486
812
  file: file,
487
- type: "file",
813
+ size: "small",
488
814
  removable: true,
489
815
  onRemove: handleRemoveFile
490
816
  }, file.id);
@@ -495,15 +821,16 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
495
821
  var uploading = files.some(function (f) {
496
822
  return f.status === "uploading";
497
823
  });
498
- var isDisabled = disabled || uploading || loading;
824
+ var controlsDisabled = disabled || uploading || loading;
825
+ var inputDisabled = disabled || uploading;
499
826
  var hasContent = value.trim().length > 0;
500
827
  var hasFiles = files.some(function (f) {
501
828
  return f.status === "success";
502
829
  });
503
- var canSend = hasContent || hasFiles;
830
+ var hasMentions = mentions.length > 0;
831
+ var canSend = hasContent || hasFiles || hasMentions;
504
832
 
505
- // 定义按钮组件(供外部 slot 函数通过 actionsComponents 使用)
506
- // 注意:sendButtonRender 的结果直接内联到 defaultSuffix 中,避免组件引用变化导致闪烁
833
+ // 定义按钮组件
507
834
  var SendButton = function SendButton(props) {
508
835
  if (sendButtonRender) {
509
836
  return /*#__PURE__*/_jsx(_Fragment, {
@@ -530,19 +857,6 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
530
857
  }))
531
858
  });
532
859
  };
533
- var UploadButton = function UploadButton(props) {
534
- return /*#__PURE__*/_jsx(Tooltip, {
535
- title: "\u4E0A\u4F20\u6587\u4EF6",
536
- children: /*#__PURE__*/_jsx("button", _objectSpread(_objectSpread({
537
- className: "".concat(styles.iconButton, " ").concat(styles.uploadButton),
538
- onClick: triggerFileSelect,
539
- disabled: isDisabled,
540
- "aria-label": "\u4E0A\u4F20\u6587\u4EF6"
541
- }, props), {}, {
542
- children: /*#__PURE__*/_jsx(PaperClipOutlined, {})
543
- }))
544
- });
545
- };
546
860
  var ClearButton = function ClearButton(props) {
547
861
  return /*#__PURE__*/_jsx(Popconfirm, {
548
862
  title: "\u786E\u5B9A\u8981\u6E05\u7A7A\u804A\u5929\u8BB0\u5F55\u5417?",
@@ -550,10 +864,10 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
550
864
  placement: "top",
551
865
  okText: "\u786E\u5B9A",
552
866
  cancelText: "\u53D6\u6D88",
553
- disabled: isDisabled,
867
+ disabled: controlsDisabled,
554
868
  children: /*#__PURE__*/_jsx("button", _objectSpread(_objectSpread({
555
869
  className: "".concat(styles.iconButton, " ").concat(styles.clearButton),
556
- disabled: isDisabled,
870
+ disabled: controlsDisabled,
557
871
  "aria-label": "\u6E05\u7A7A\u804A\u5929\u8BB0\u5F55"
558
872
  }, props), {}, {
559
873
  children: /*#__PURE__*/_jsx(ClearOutlined, {})
@@ -562,7 +876,6 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
562
876
  };
563
877
  var actionsComponents = {
564
878
  SendButton: SendButton,
565
- UploadButton: UploadButton,
566
879
  ClearButton: ClearButton
567
880
  };
568
881
 
@@ -578,20 +891,13 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
578
891
  }
579
892
  return slot;
580
893
  };
894
+ var headerNode = renderSlot(header, false);
895
+ var fileListNode = files.length > 0 ? renderFileList() : null;
581
896
 
582
- // 默认的后缀内容(操作按钮组) - 直接内联渲染避免组件引用变化导致 unmount/remount
583
- var defaultSuffix = /*#__PURE__*/_jsxs("div", {
897
+ // 默认后缀仅保留发送/停止按钮;上传与清空统一放到底部 actionBar,方便业务扩展左侧按钮组。
898
+ var defaultSuffix = /*#__PURE__*/_jsx("div", {
584
899
  className: styles.buttonGroup,
585
- children: [allowUpload && /*#__PURE__*/_jsx(Tooltip, {
586
- title: "\u4E0A\u4F20\u6587\u4EF6",
587
- children: /*#__PURE__*/_jsx("button", {
588
- className: "".concat(styles.iconButton, " ").concat(styles.uploadButton),
589
- onClick: triggerFileSelect,
590
- disabled: isDisabled,
591
- "aria-label": "\u4E0A\u4F20\u6587\u4EF6",
592
- children: /*#__PURE__*/_jsx(PaperClipOutlined, {})
593
- })
594
- }), sendButtonRender ? sendButtonRender({
900
+ children: sendButtonRender ? sendButtonRender({
595
901
  loading: loading,
596
902
  disabled: uploading || disabled,
597
903
  canSend: canSend,
@@ -608,42 +914,61 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
608
914
  spin: true
609
915
  }) : /*#__PURE__*/_jsx(ArrowUpOutlined, {})
610
916
  })
917
+ })
918
+ });
919
+ var defaultActionBar = /*#__PURE__*/_jsxs("div", {
920
+ className: styles.actionBar,
921
+ children: [/*#__PURE__*/_jsx("div", {
922
+ className: styles.actionBarLeft,
923
+ children: renderSlot(footerLeft, false)
924
+ }), /*#__PURE__*/_jsxs("div", {
925
+ className: styles.actionBarRight,
926
+ children: [clearBtnShow && /*#__PURE__*/_jsx(ClearButton, {}), renderSlot(suffix, defaultSuffix)]
611
927
  })]
612
928
  });
613
929
  return /*#__PURE__*/_jsxs("div", {
614
930
  ref: containerRef,
615
931
  className: containerClass,
616
- onDragOver: allowUpload && draggable ? handleDragOver : undefined,
617
- onDragLeave: allowUpload && draggable ? handleDragLeave : undefined,
618
- onDrop: allowUpload && draggable ? handleDrop : undefined,
619
- children: [renderSlot(header, false), allowUpload && files.length > 0 && renderFileList(), allowUpload && /*#__PURE__*/_jsx("input", {
620
- ref: fileInputRef,
621
- type: "file",
622
- multiple: true,
623
- accept: allowedFileTypes.join(","),
624
- style: {
625
- display: "none"
626
- },
627
- onChange: function onChange(e) {
628
- if (e.target.files) {
629
- handleFileSelect(Array.from(e.target.files));
630
- e.target.value = "";
631
- }
632
- }
633
- }), /*#__PURE__*/_jsx("div", {
932
+ onDragOver: draggable ? handleDragOver : undefined,
933
+ onDragLeave: draggable ? handleDragLeave : undefined,
934
+ onDrop: draggable ? handleDrop : undefined,
935
+ children: [/*#__PURE__*/_jsx("div", {
634
936
  className: styles.mainArea,
635
937
  children: /*#__PURE__*/_jsxs("div", {
636
938
  className: styles.senderWrap,
637
- children: [/*#__PURE__*/_jsxs("div", {
939
+ children: [(headerNode || fileListNode) && /*#__PURE__*/_jsxs("div", {
940
+ className: styles.contextBar,
941
+ children: [headerNode && /*#__PURE__*/_jsx("div", {
942
+ className: styles.contextHeader,
943
+ children: headerNode
944
+ }), fileListNode]
945
+ }), !inlineTags && /*#__PURE__*/_jsx(InputTags, {
946
+ mentions: mentions,
947
+ onRemove: handleRemoveMention
948
+ }), /*#__PURE__*/_jsxs("div", {
638
949
  className: styles.inputAndButtons,
639
- children: [clearBtnShow && /*#__PURE__*/_jsx(ClearButton, {}), renderSlot(prefix, false), /*#__PURE__*/_jsx("div", {
950
+ children: [renderSlot(prefix, false), inlineTags ? /*#__PURE__*/_jsx(InlineTagInput, {
951
+ ref: inlineInputRef,
952
+ value: value,
953
+ mentions: mentions,
954
+ defaultInputParts: defaultInputParts,
955
+ placeholder: placeholder,
956
+ disabled: inputDisabled,
957
+ onChange: handleInlineInputChange,
958
+ onMentionsChange: setMentions,
959
+ onKeyDown: handleKeyDown,
960
+ onKeyUp: handleInlineKeyUp,
961
+ renderMention: renderMention !== null && renderMention !== void 0 ? renderMention : renderTag
962
+ }) : /*#__PURE__*/_jsx("div", {
640
963
  className: styles.textAreaWrapper,
641
964
  children: /*#__PURE__*/_jsx(Input.TextArea, {
965
+ ref: textareaRef,
642
966
  className: styles.textArea,
643
967
  value: value,
644
968
  onChange: handleInputChange,
645
969
  onKeyDown: handleKeyDown,
646
- placeholder: "\u8BF7\u8F93\u5165\u6D88\u606F...",
970
+ onKeyUp: handleKeyUp,
971
+ placeholder: placeholder,
647
972
  autoSize: {
648
973
  minRows: 1,
649
974
  maxRows: 4
@@ -655,21 +980,29 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
655
980
  padding: 0
656
981
  }
657
982
  })
658
- }), renderSlot(suffix, defaultSuffix)]
659
- }), renderSlot(footer, /*#__PURE__*/_jsx("div", {
660
- className: styles.tip,
661
- children: "\u5185\u5BB9\u7531AI\u751F\u6210,\u65E0\u6CD5\u786E\u4FDD\u771F\u5B9E\u51C6\u786E,\u4EC5\u4F9B\u53C2\u8003"
662
- }))]
983
+ })]
984
+ }), activeQuickKey && activeQuickKeyConfig && /*#__PURE__*/_jsx("div", {
985
+ className: styles.quickListWrapper,
986
+ children: /*#__PURE__*/_jsx(QuickList, {
987
+ config: activeQuickKeyConfig,
988
+ activeIndex: quickKeyActiveIndex,
989
+ onSelect: handleQuickKeySelect,
990
+ onClose: function onClose() {
991
+ setActiveQuickKey(null);
992
+ setQuickKeyKeyword("");
993
+ setQuickKeyTriggerIdx(-1);
994
+ setQuickKeyActiveIndex(0);
995
+ },
996
+ visible: true
997
+ })
998
+ }), footer === false ? defaultActionBar : renderSlot(footer, defaultActionBar)]
663
999
  })
1000
+ }), !footer && /*#__PURE__*/_jsx("div", {
1001
+ className: styles.tip,
1002
+ children: "\u5185\u5BB9\u7531AI\u751F\u6210,\u65E0\u6CD5\u786E\u4FDD\u771F\u5B9E\u51C6\u786E,\u4EC5\u4F9B\u53C2\u8003"
664
1003
  })]
665
1004
  });
666
1005
  });
667
1006
  XAdkSender.displayName = "XAdkSender";
668
- import XAdkSenderSwitch from "./Switch";
669
- import { jsx as _jsx } from "react/jsx-runtime";
670
- import { Fragment as _Fragment } from "react/jsx-runtime";
671
- import { jsxs as _jsxs } from "react/jsx-runtime";
672
- var CompoundSender = XAdkSender;
673
- CompoundSender.Switch = XAdkSenderSwitch;
674
- export default CompoundSender;
1007
+ export default XAdkSender;
675
1008
  //# sourceMappingURL=index.js.map