@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
@@ -37,14 +37,16 @@ var import_antd = require("antd");
37
37
  var import_icons = require("@ant-design/icons");
38
38
  var import_styles = require("./styles");
39
39
  var import_FileGallery = __toESM(require("../FileGallery"));
40
+ var import_QuickList = __toESM(require("./QuickList"));
41
+ var import_InputTags = __toESM(require("./InputTags"));
42
+ var import_InlineTagInput = __toESM(require("./InlineTagInput"));
40
43
  var import_file = require("../../utils/file");
41
- var import_Switch = __toESM(require("./Switch"));
42
44
  var import_jsx_runtime = require("react/jsx-runtime");
43
45
  var XAdkSender = (0, import_react.forwardRef)(
44
46
  ({
45
47
  clearBtnShow = true,
46
- allowUpload = false,
47
- draggable = true,
48
+ draggable = false,
49
+ onFileSelect,
48
50
  loading = false,
49
51
  disabled = false,
50
52
  value: controlledValue,
@@ -59,28 +61,32 @@ var XAdkSender = (0, import_react.forwardRef)(
59
61
  onUploadSuccess,
60
62
  onUploadError,
61
63
  maxFileSize = 10,
64
+ placeholder = "",
62
65
  validators: customValidators = [],
63
- // allowedFileTypes = [
64
- // "image/*",
65
- // "audio/*",
66
- // "video/*",
67
- // "application/pdf",
68
- // "text/plain",
69
- // ".doc",
70
- // ".docx",
71
- // ".xls",
72
- // ".xlsx",
73
- // ".ppt",
74
- // ".pptx",
75
- // "",
76
- // ],
77
66
  allowedFileTypes = [],
78
67
  maxFiles = Infinity,
79
68
  sendButtonRender,
80
69
  suffix,
81
70
  header,
82
71
  prefix,
83
- footer
72
+ footer,
73
+ footerLeft,
74
+ quickKeys = [],
75
+ inlineTags = false,
76
+ renderMention,
77
+ renderTag,
78
+ mentions: controlledMentions,
79
+ tags: controlledTags,
80
+ defaultMentions,
81
+ defaultTags = [],
82
+ defaultInputParts,
83
+ onMentionsChange,
84
+ onTagsChange,
85
+ onQuickKeyTrigger,
86
+ submitFormat = "text",
87
+ formatMention,
88
+ formatTag,
89
+ transformSubmitData
84
90
  }, ref) => {
85
91
  const styles = (0, import_styles.useStyles)();
86
92
  const isControlled = controlledValue !== void 0;
@@ -92,10 +98,27 @@ var XAdkSender = (0, import_react.forwardRef)(
92
98
  }
93
99
  onChange == null ? void 0 : onChange(newValue);
94
100
  };
101
+ const resolvedControlledMentions = controlledMentions ?? controlledTags;
102
+ const initialMentions = defaultMentions ?? defaultTags;
103
+ const isMentionsControlled = resolvedControlledMentions !== void 0;
104
+ const [internalMentions, setInternalMentions] = (0, import_react.useState)(initialMentions);
105
+ const mentions = isMentionsControlled ? resolvedControlledMentions : internalMentions;
106
+ const setMentions = (newMentions) => {
107
+ if (!isMentionsControlled) {
108
+ setInternalMentions(newMentions);
109
+ }
110
+ onMentionsChange == null ? void 0 : onMentionsChange(newMentions);
111
+ onTagsChange == null ? void 0 : onTagsChange(newMentions);
112
+ };
95
113
  const [files, setFiles] = (0, import_react.useState)([]);
96
114
  const [isDragOver, setIsDragOver] = (0, import_react.useState)(false);
97
115
  const containerRef = (0, import_react.useRef)(null);
98
- const fileInputRef = (0, import_react.useRef)(null);
116
+ const textareaRef = (0, import_react.useRef)(null);
117
+ const inlineInputRef = (0, import_react.useRef)(null);
118
+ const [activeQuickKey, setActiveQuickKey] = (0, import_react.useState)(null);
119
+ const [quickKeyKeyword, setQuickKeyKeyword] = (0, import_react.useState)("");
120
+ const [quickKeyTriggerIdx, setQuickKeyTriggerIdx] = (0, import_react.useState)(-1);
121
+ const [quickKeyActiveIndex, setQuickKeyActiveIndex] = (0, import_react.useState)(0);
99
122
  const generateId = () => {
100
123
  return Date.now().toString(36) + Math.random().toString(36).substr(2);
101
124
  };
@@ -103,6 +126,76 @@ var XAdkSender = (0, import_react.forwardRef)(
103
126
  const data = (response == null ? void 0 : response.data) ?? response;
104
127
  return (Array.isArray(data) ? data[0] : data) ?? {};
105
128
  };
129
+ const escapeXml = (text) => text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
130
+ const escapeMarkdownLabel = (text) => text.replace(/\\/g, "\\\\").replace(/\]/g, "\\]");
131
+ const getMentionSubmitValue = (mention) => {
132
+ var _a, _b, _c;
133
+ return String(
134
+ mention.value ?? mention.uri ?? ((_a = mention.data) == null ? void 0 : _a.uri) ?? ((_b = mention.data) == null ? void 0 : _b.value) ?? ((_c = mention.data) == null ? void 0 : _c.name) ?? mention.targetId ?? mention.displayName ?? mention.label ?? ""
135
+ );
136
+ };
137
+ const defaultFormatMention = (mention, format, index) => {
138
+ const value2 = getMentionSubmitValue(mention);
139
+ if (format === "xml") {
140
+ return `<mention type="${escapeXml(mention.type)}" id="${escapeXml(mention.id)}" label="${escapeXml(mention.label)}" value="${escapeXml(value2)}" />`;
141
+ }
142
+ if (format === "markdown") {
143
+ const href = mention.uri || (value2.includes("://") ? value2 : `xadk-mention://${encodeURIComponent(mention.type)}/${encodeURIComponent(mention.id)}`);
144
+ return `[@${escapeMarkdownLabel(mention.displayName || mention.label)}](${href})`;
145
+ }
146
+ return `@${mention.displayName || value2 || `mention-${index + 1}`}`;
147
+ };
148
+ const serializeMention = (mention, format, index) => (formatMention == null ? void 0 : formatMention(mention, { format, index })) ?? (formatTag == null ? void 0 : formatTag(mention, { format, index })) ?? defaultFormatMention(mention, format, index);
149
+ const getSubmitParts = (0, import_react.useCallback)(() => {
150
+ var _a;
151
+ if (inlineTags) {
152
+ const parts = ((_a = inlineInputRef.current) == null ? void 0 : _a.getParts()) || [];
153
+ if (parts.length > 0)
154
+ return parts;
155
+ }
156
+ const textParts = value ? [{ type: "text", text: value }] : [];
157
+ const mentionParts = mentions.map((mention) => ({
158
+ type: "mention",
159
+ mention
160
+ }));
161
+ return [...mentionParts, ...textParts];
162
+ }, [inlineTags, mentions, value]);
163
+ const serializeParts = (parts, format) => {
164
+ if (format === "structured") {
165
+ return parts.reduce(
166
+ (content, part) => content + (part.type === "text" ? part.text : ""),
167
+ ""
168
+ );
169
+ }
170
+ let tagIndex = 0;
171
+ return parts.map((part) => {
172
+ if (part.type === "text")
173
+ return part.text;
174
+ const result = serializeMention(part.mention, format, tagIndex);
175
+ tagIndex += 1;
176
+ return result;
177
+ }).join("");
178
+ };
179
+ const createSubmitData = (formattedFiles) => {
180
+ const parts = getSubmitParts();
181
+ const rawText = parts.reduce(
182
+ (content, part) => content + (part.type === "text" ? part.text : ""),
183
+ ""
184
+ );
185
+ const standardData = {
186
+ text: serializeParts(parts, submitFormat),
187
+ rawText,
188
+ format: submitFormat,
189
+ parts,
190
+ files: formattedFiles,
191
+ mentions,
192
+ tags: mentions
193
+ };
194
+ return {
195
+ ...standardData,
196
+ payload: transformSubmitData == null ? void 0 : transformSubmitData(standardData)
197
+ };
198
+ };
106
199
  const checkFileType = (file) => {
107
200
  if ((allowedFileTypes == null ? void 0 : allowedFileTypes.length) > 0) {
108
201
  const ext = (0, import_file.getExt)(file);
@@ -121,22 +214,16 @@ var XAdkSender = (0, import_react.forwardRef)(
121
214
  }
122
215
  return true;
123
216
  };
124
- const checkFileSize = (file) => {
125
- const maxSize = maxFileSize * 1024 * 1024;
126
- return file.size <= maxSize;
127
- };
128
217
  const isDuplicateFile = (file, files2) => {
129
218
  return files2.some((f) => f.name === file.name && f.size === file.size);
130
219
  };
131
220
  const builtInValidators = [
132
- // 数量校验(修复批量 bug)
133
221
  (_file, { files: files2 }) => {
134
222
  if (files2.length >= maxFiles) {
135
223
  return `最多只能上传 ${maxFiles} 个文件`;
136
224
  }
137
225
  return null;
138
226
  },
139
- // 大小校验
140
227
  (file) => {
141
228
  const maxSize = maxFileSize * 1024 * 1024;
142
229
  if (file.size > maxSize) {
@@ -144,14 +231,12 @@ var XAdkSender = (0, import_react.forwardRef)(
144
231
  }
145
232
  return null;
146
233
  },
147
- // 类型校验
148
234
  (file) => {
149
235
  if (!checkFileType(file)) {
150
236
  return "不支持的文件类型";
151
237
  }
152
238
  return null;
153
239
  },
154
- // ⭐ 新增:去重校验
155
240
  (file, { files: files2 }) => {
156
241
  if (isDuplicateFile(file, files2)) {
157
242
  return "文件已存在";
@@ -211,9 +296,29 @@ var XAdkSender = (0, import_react.forwardRef)(
211
296
  () => ({
212
297
  addFiles: (rawFiles) => {
213
298
  handleFileSelect(rawFiles);
299
+ },
300
+ insertMention: (mention) => {
301
+ var _a;
302
+ if (inlineTags) {
303
+ (_a = inlineInputRef.current) == null ? void 0 : _a.insertMention(mention);
304
+ return;
305
+ }
306
+ setMentions([...mentions, mention]);
307
+ },
308
+ insertTag: (mention) => {
309
+ var _a;
310
+ if (inlineTags) {
311
+ (_a = inlineInputRef.current) == null ? void 0 : _a.insertMention(mention);
312
+ return;
313
+ }
314
+ setMentions([...mentions, mention]);
315
+ },
316
+ focus: () => {
317
+ var _a, _b;
318
+ inlineTags ? (_a = inlineInputRef.current) == null ? void 0 : _a.focus() : (_b = textareaRef.current) == null ? void 0 : _b.focus();
214
319
  }
215
320
  }),
216
- [handleFileSelect]
321
+ [handleFileSelect, inlineTags, setMentions, mentions]
217
322
  );
218
323
  const uploadFiles = async (fileList) => {
219
324
  for (const localFile of fileList) {
@@ -289,44 +394,202 @@ var XAdkSender = (0, import_react.forwardRef)(
289
394
  return next;
290
395
  });
291
396
  };
292
- const triggerFileSelect = () => {
293
- if (fileInputRef.current) {
294
- fileInputRef.current.click();
295
- }
296
- };
297
397
  const handleDragOver = (0, import_react.useCallback)(
298
398
  (e) => {
299
399
  e.preventDefault();
300
400
  e.stopPropagation();
301
- if (allowUpload) {
401
+ if (draggable) {
302
402
  setIsDragOver(true);
303
403
  }
304
404
  },
305
- [allowUpload]
405
+ [draggable]
306
406
  );
307
407
  const handleDragLeave = (0, import_react.useCallback)(
308
408
  (e) => {
309
409
  e.preventDefault();
310
410
  e.stopPropagation();
311
- if (allowUpload) {
411
+ if (draggable) {
312
412
  setIsDragOver(false);
313
413
  }
314
414
  },
315
- [allowUpload]
415
+ [draggable]
316
416
  );
317
417
  const handleDrop = (0, import_react.useCallback)(
318
418
  (e) => {
319
419
  e.preventDefault();
320
420
  e.stopPropagation();
321
421
  setIsDragOver(false);
322
- if (allowUpload && e.dataTransfer.files && e.dataTransfer.files.length > 0) {
323
- handleFileSelect(Array.from(e.dataTransfer.files));
422
+ if (draggable && e.dataTransfer.files && e.dataTransfer.files.length > 0) {
423
+ onFileSelect == null ? void 0 : onFileSelect(Array.from(e.dataTransfer.files));
324
424
  }
325
425
  },
326
- [allowUpload, handleFileSelect]
426
+ [draggable, onFileSelect]
327
427
  );
428
+ const handleRemoveMention = (0, import_react.useCallback)(
429
+ (id) => {
430
+ setMentions(mentions.filter((item) => item.id !== id));
431
+ },
432
+ [mentions, setMentions]
433
+ );
434
+ const activeQuickKeyConfig = (0, import_react.useMemo)(() => {
435
+ if (!activeQuickKey)
436
+ return null;
437
+ return quickKeys.find((qk) => qk.key === activeQuickKey) || null;
438
+ }, [activeQuickKey, quickKeys]);
439
+ const activeQuickKeyOptionsLength = (activeQuickKeyConfig == null ? void 0 : activeQuickKeyConfig.options.length) || 0;
440
+ (0, import_react.useEffect)(() => {
441
+ setQuickKeyActiveIndex(0);
442
+ }, [activeQuickKey]);
443
+ (0, import_react.useEffect)(() => {
444
+ if (activeQuickKeyOptionsLength <= 0) {
445
+ setQuickKeyActiveIndex(0);
446
+ return;
447
+ }
448
+ setQuickKeyActiveIndex(
449
+ (prev) => (prev % activeQuickKeyOptionsLength + activeQuickKeyOptionsLength) % activeQuickKeyOptionsLength
450
+ );
451
+ }, [activeQuickKeyOptionsLength]);
452
+ const getNextQuickKeyIndex = (0, import_react.useCallback)(
453
+ (current, step) => {
454
+ if (activeQuickKeyOptionsLength <= 0)
455
+ return 0;
456
+ return (current + step + activeQuickKeyOptionsLength) % activeQuickKeyOptionsLength;
457
+ },
458
+ [activeQuickKeyOptionsLength]
459
+ );
460
+ const detectQuickKey = (0, import_react.useCallback)(
461
+ (text, cursorPos) => {
462
+ const quickKeyChars = quickKeys.map((qk) => qk.key);
463
+ if (quickKeyChars.length === 0)
464
+ return;
465
+ const textBeforeCursor = text.slice(0, cursorPos);
466
+ let found = false;
467
+ for (let i = textBeforeCursor.length - 1; i >= 0; i--) {
468
+ const char = textBeforeCursor[i];
469
+ if (/\s/.test(char))
470
+ break;
471
+ if (quickKeyChars.includes(char)) {
472
+ const keyword = textBeforeCursor.slice(i + 1);
473
+ setActiveQuickKey(char);
474
+ setQuickKeyKeyword(keyword);
475
+ setQuickKeyTriggerIdx(i);
476
+ setQuickKeyActiveIndex(0);
477
+ onQuickKeyTrigger == null ? void 0 : onQuickKeyTrigger(char, keyword);
478
+ found = true;
479
+ break;
480
+ }
481
+ }
482
+ if (!found && activeQuickKey) {
483
+ const triggerChar = text[quickKeyTriggerIdx];
484
+ const keyword = text.slice(quickKeyTriggerIdx + 1, cursorPos);
485
+ if (quickKeyTriggerIdx < 0 || !triggerChar || !quickKeyChars.includes(triggerChar) || /\s/.test(keyword)) {
486
+ setActiveQuickKey(null);
487
+ setQuickKeyKeyword("");
488
+ setQuickKeyTriggerIdx(-1);
489
+ setQuickKeyActiveIndex(0);
490
+ } else {
491
+ setQuickKeyKeyword(keyword);
492
+ }
493
+ }
494
+ },
495
+ [activeQuickKey, onQuickKeyTrigger, quickKeyTriggerIdx, quickKeys]
496
+ );
497
+ const handleQuickKeySelect = (0, import_react.useCallback)(
498
+ (option) => {
499
+ var _a, _b, _c, _d;
500
+ const mentionType = (activeQuickKeyConfig == null ? void 0 : activeQuickKeyConfig.mentionType) || (activeQuickKeyConfig == null ? void 0 : activeQuickKeyConfig.tagType) || activeQuickKey || "unknown";
501
+ const newMention = {
502
+ id: generateId(),
503
+ label: option.label,
504
+ type: mentionType,
505
+ value: option.value ?? option.uri ?? option.name ?? option.label,
506
+ uri: option.uri,
507
+ targetId: option.targetId ?? option.skillNo ?? option.pluginNo,
508
+ displayName: option.displayName ?? option.label,
509
+ trigger: activeQuickKey || void 0,
510
+ icon: option.icon,
511
+ data: option
512
+ };
513
+ (_a = activeQuickKeyConfig == null ? void 0 : activeQuickKeyConfig.onSelect) == null ? void 0 : _a.call(activeQuickKeyConfig, option);
514
+ if (inlineTags) {
515
+ (_b = inlineInputRef.current) == null ? void 0 : _b.insertMention(newMention, {
516
+ start: quickKeyTriggerIdx,
517
+ end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length
518
+ });
519
+ } else {
520
+ setMentions([...mentions, newMention]);
521
+ if (quickKeyTriggerIdx >= 0) {
522
+ const newValue = value.slice(0, quickKeyTriggerIdx) + value.slice(quickKeyTriggerIdx + 1 + quickKeyKeyword.length);
523
+ setValue(newValue);
524
+ }
525
+ }
526
+ setActiveQuickKey(null);
527
+ setQuickKeyKeyword("");
528
+ setQuickKeyTriggerIdx(-1);
529
+ setQuickKeyActiveIndex(0);
530
+ inlineTags ? (_c = inlineInputRef.current) == null ? void 0 : _c.focus() : (_d = textareaRef.current) == null ? void 0 : _d.focus();
531
+ },
532
+ [
533
+ activeQuickKey,
534
+ activeQuickKeyConfig,
535
+ inlineTags,
536
+ mentions,
537
+ setMentions,
538
+ value,
539
+ quickKeyTriggerIdx,
540
+ quickKeyKeyword,
541
+ setValue
542
+ ]
543
+ );
544
+ const handleInputChange = (e) => {
545
+ const newValue = e.target.value;
546
+ setValue(newValue);
547
+ detectQuickKey(newValue, e.target.selectionStart || 0);
548
+ };
549
+ const handleInlineInputChange = (newValue) => {
550
+ var _a;
551
+ setValue(newValue);
552
+ detectQuickKey(
553
+ newValue,
554
+ ((_a = inlineInputRef.current) == null ? void 0 : _a.getCursorOffset()) || newValue.length
555
+ );
556
+ };
557
+ const handleQuickKeyByText = (text, cursorPos) => {
558
+ const quickKeyChars = quickKeys.map((qk) => qk.key);
559
+ if (quickKeyChars.length === 0)
560
+ return;
561
+ const textBeforeCursor = text.slice(0, cursorPos);
562
+ const lastChar = textBeforeCursor[cursorPos - 1];
563
+ if (lastChar && quickKeyChars.includes(lastChar)) {
564
+ if (activeQuickKey === lastChar && quickKeyTriggerIdx === cursorPos - 1) {
565
+ return;
566
+ }
567
+ setActiveQuickKey(lastChar);
568
+ setQuickKeyKeyword("");
569
+ setQuickKeyTriggerIdx(cursorPos - 1);
570
+ setQuickKeyActiveIndex(0);
571
+ onQuickKeyTrigger == null ? void 0 : onQuickKeyTrigger(lastChar, "");
572
+ }
573
+ };
574
+ const isQuickListControlKey = (key) => key === "ArrowDown" || key === "ArrowUp" || key === "Enter" || key === "Escape";
575
+ const handleKeyUp = (e) => {
576
+ if (activeQuickKey && isQuickListControlKey(e.key))
577
+ return;
578
+ const target = e.target;
579
+ handleQuickKeyByText(target.value || "", target.selectionStart || 0);
580
+ };
581
+ const handleInlineKeyUp = (e) => {
582
+ var _a, _b;
583
+ if (activeQuickKey && isQuickListControlKey(e.key))
584
+ return;
585
+ const text = ((_a = inlineInputRef.current) == null ? void 0 : _a.getText()) || "";
586
+ const cursorPos = ((_b = inlineInputRef.current) == null ? void 0 : _b.getCursorOffset()) || text.length;
587
+ handleQuickKeyByText(text, cursorPos);
588
+ };
328
589
  const handleSubmit = () => {
329
- if (!value.trim() && files.length === 0) {
590
+ if (loading)
591
+ return;
592
+ if (!value.trim() && files.length === 0 && mentions.length === 0) {
330
593
  import_antd.message.warning("请输入消息或选择文件");
331
594
  return;
332
595
  }
@@ -343,12 +606,10 @@ var XAdkSender = (0, import_react.forwardRef)(
343
606
  onOk: () => {
344
607
  const formattedFiles = formatFilesForServer(successFiles);
345
608
  if (onSubmit) {
346
- onSubmit({
347
- text: value,
348
- files: formattedFiles
349
- });
609
+ onSubmit(createSubmitData(formattedFiles));
350
610
  }
351
611
  setValue("");
612
+ setMentions([]);
352
613
  setFiles((prev) => prev.filter((f) => f.status !== "success"));
353
614
  },
354
615
  onCancel: () => {
@@ -358,12 +619,10 @@ var XAdkSender = (0, import_react.forwardRef)(
358
619
  } else {
359
620
  const formattedFiles = formatFilesForServer(successFiles);
360
621
  if (onSubmit) {
361
- onSubmit({
362
- text: value,
363
- files: formattedFiles
364
- });
622
+ onSubmit(createSubmitData(formattedFiles));
365
623
  }
366
624
  setValue("");
625
+ setMentions([]);
367
626
  setFiles((prev) => prev.filter((f) => f.status !== "success"));
368
627
  }
369
628
  };
@@ -383,12 +642,36 @@ var XAdkSender = (0, import_react.forwardRef)(
383
642
  };
384
643
  });
385
644
  };
386
- const handleInputChange = (e) => {
387
- const newValue = e.target.value;
388
- setValue(newValue);
389
- };
390
645
  const handleKeyDown = (e) => {
391
- if (e.key === "Enter" && !e.shiftKey) {
646
+ const quickKeyOptions = (activeQuickKeyConfig == null ? void 0 : activeQuickKeyConfig.options) || [];
647
+ if (activeQuickKey && quickKeyOptions.length > 0) {
648
+ if (e.key === "ArrowDown") {
649
+ e.preventDefault();
650
+ setQuickKeyActiveIndex((prev) => getNextQuickKeyIndex(prev, 1));
651
+ return;
652
+ }
653
+ if (e.key === "ArrowUp") {
654
+ e.preventDefault();
655
+ setQuickKeyActiveIndex((prev) => getNextQuickKeyIndex(prev, -1));
656
+ return;
657
+ }
658
+ if (e.key === "Enter") {
659
+ e.preventDefault();
660
+ handleQuickKeySelect(
661
+ quickKeyOptions[Math.min(quickKeyActiveIndex, quickKeyOptions.length - 1)]
662
+ );
663
+ return;
664
+ }
665
+ if (e.key === "Escape") {
666
+ e.preventDefault();
667
+ setActiveQuickKey(null);
668
+ setQuickKeyKeyword("");
669
+ setQuickKeyTriggerIdx(-1);
670
+ setQuickKeyActiveIndex(0);
671
+ return;
672
+ }
673
+ }
674
+ if (e.key === "Enter" && !e.shiftKey && !activeQuickKey) {
392
675
  e.preventDefault();
393
676
  handleSubmit();
394
677
  }
@@ -396,34 +679,25 @@ var XAdkSender = (0, import_react.forwardRef)(
396
679
  const renderFileList = () => {
397
680
  if (files.length === 0)
398
681
  return null;
399
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
400
- "div",
682
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.contextFiles, children: files.map((file) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
683
+ import_FileGallery.default,
401
684
  {
402
- style: {
403
- display: "flex",
404
- flexWrap: "wrap",
405
- gap: "8px",
406
- padding: "12px 0"
407
- },
408
- children: files.map((file) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
409
- import_FileGallery.default,
410
- {
411
- file,
412
- type: "file",
413
- removable: true,
414
- onRemove: handleRemoveFile
415
- },
416
- file.id
417
- ))
418
- }
419
- );
685
+ file,
686
+ size: "small",
687
+ removable: true,
688
+ onRemove: handleRemoveFile
689
+ },
690
+ file.id
691
+ )) });
420
692
  };
421
693
  const containerClass = `${styles.container} ${isDragOver ? "drag-over" : ""}`;
422
694
  const uploading = files.some((f) => f.status === "uploading");
423
- const isDisabled = disabled || uploading || loading;
695
+ const controlsDisabled = disabled || uploading || loading;
696
+ const inputDisabled = disabled || uploading;
424
697
  const hasContent = value.trim().length > 0;
425
698
  const hasFiles = files.some((f) => f.status === "success");
426
- const canSend = hasContent || hasFiles;
699
+ const hasMentions = mentions.length > 0;
700
+ const canSend = hasContent || hasFiles || hasMentions;
427
701
  const SendButton = (props) => {
428
702
  if (sendButtonRender) {
429
703
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: sendButtonRender({
@@ -446,17 +720,6 @@ var XAdkSender = (0, import_react.forwardRef)(
446
720
  }
447
721
  ) });
448
722
  };
449
- const UploadButton = (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: "上传文件", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
450
- "button",
451
- {
452
- className: `${styles.iconButton} ${styles.uploadButton}`,
453
- onClick: triggerFileSelect,
454
- disabled: isDisabled,
455
- "aria-label": "上传文件",
456
- ...props,
457
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.PaperClipOutlined, {})
458
- }
459
- ) });
460
723
  const ClearButton = (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
461
724
  import_antd.Popconfirm,
462
725
  {
@@ -465,12 +728,12 @@ var XAdkSender = (0, import_react.forwardRef)(
465
728
  placement: "top",
466
729
  okText: "确定",
467
730
  cancelText: "取消",
468
- disabled: isDisabled,
731
+ disabled: controlsDisabled,
469
732
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
470
733
  "button",
471
734
  {
472
735
  className: `${styles.iconButton} ${styles.clearButton}`,
473
- disabled: isDisabled,
736
+ disabled: controlsDisabled,
474
737
  "aria-label": "清空聊天记录",
475
738
  ...props,
476
739
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.ClearOutlined, {})
@@ -480,7 +743,6 @@ var XAdkSender = (0, import_react.forwardRef)(
480
743
  );
481
744
  const actionsComponents = {
482
745
  SendButton,
483
- UploadButton,
484
746
  ClearButton
485
747
  };
486
748
  const renderSlot = (slot, oriNode) => {
@@ -494,73 +756,73 @@ var XAdkSender = (0, import_react.forwardRef)(
494
756
  }
495
757
  return slot;
496
758
  };
497
- const defaultSuffix = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.buttonGroup, children: [
498
- allowUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: "上传文件", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
499
- "button",
500
- {
501
- className: `${styles.iconButton} ${styles.uploadButton}`,
502
- onClick: triggerFileSelect,
503
- disabled: isDisabled,
504
- "aria-label": "上传文件",
505
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.PaperClipOutlined, {})
506
- }
507
- ) }),
508
- sendButtonRender ? sendButtonRender({
509
- loading,
759
+ const headerNode = renderSlot(header, false);
760
+ const fileListNode = files.length > 0 ? renderFileList() : null;
761
+ const defaultSuffix = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.buttonGroup, children: sendButtonRender ? sendButtonRender({
762
+ loading,
763
+ disabled: uploading || disabled,
764
+ canSend,
765
+ onSend: handleSubmit,
766
+ onStop
767
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: loading ? "停止生成" : "发送消息", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
768
+ "button",
769
+ {
770
+ className: `${styles.iconButton} ${styles.sendButton} ${loading ? "stop" : ""}`,
771
+ onClick: loading ? onStop : handleSubmit,
510
772
  disabled: uploading || disabled,
511
- canSend,
512
- onSend: handleSubmit,
513
- onStop
514
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: loading ? "停止生成" : "发送消息", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
515
- "button",
516
- {
517
- className: `${styles.iconButton} ${styles.sendButton} ${loading ? "stop" : ""}`,
518
- onClick: loading ? onStop : handleSubmit,
519
- disabled: uploading || disabled,
520
- "aria-label": loading ? "停止生成" : "发送消息",
521
- children: loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.LoadingOutlined, { spin: true }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.ArrowUpOutlined, {})
522
- }
523
- ) })
773
+ "aria-label": loading ? "停止生成" : "发送消息",
774
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.LoadingOutlined, { spin: true }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.ArrowUpOutlined, {})
775
+ }
776
+ ) }) });
777
+ const defaultActionBar = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.actionBar, children: [
778
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.actionBarLeft, children: renderSlot(footerLeft, false) }),
779
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.actionBarRight, children: [
780
+ clearBtnShow && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ClearButton, {}),
781
+ renderSlot(suffix, defaultSuffix)
782
+ ] })
524
783
  ] });
525
784
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
526
785
  "div",
527
786
  {
528
787
  ref: containerRef,
529
788
  className: containerClass,
530
- onDragOver: allowUpload && draggable ? handleDragOver : void 0,
531
- onDragLeave: allowUpload && draggable ? handleDragLeave : void 0,
532
- onDrop: allowUpload && draggable ? handleDrop : void 0,
789
+ onDragOver: draggable ? handleDragOver : void 0,
790
+ onDragLeave: draggable ? handleDragLeave : void 0,
791
+ onDrop: draggable ? handleDrop : void 0,
533
792
  children: [
534
- renderSlot(header, false),
535
- allowUpload && files.length > 0 && renderFileList(),
536
- allowUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
537
- "input",
538
- {
539
- ref: fileInputRef,
540
- type: "file",
541
- multiple: true,
542
- accept: allowedFileTypes.join(","),
543
- style: { display: "none" },
544
- onChange: (e) => {
545
- if (e.target.files) {
546
- handleFileSelect(Array.from(e.target.files));
547
- e.target.value = "";
548
- }
549
- }
550
- }
551
- ),
552
793
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.mainArea, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.senderWrap, children: [
794
+ (headerNode || fileListNode) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.contextBar, children: [
795
+ headerNode && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.contextHeader, children: headerNode }),
796
+ fileListNode
797
+ ] }),
798
+ !inlineTags && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_InputTags.default, { mentions, onRemove: handleRemoveMention }),
553
799
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.inputAndButtons, children: [
554
- clearBtnShow && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ClearButton, {}),
555
800
  renderSlot(prefix, false),
556
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.textAreaWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
801
+ inlineTags ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
802
+ import_InlineTagInput.default,
803
+ {
804
+ ref: inlineInputRef,
805
+ value,
806
+ mentions,
807
+ defaultInputParts,
808
+ placeholder,
809
+ disabled: inputDisabled,
810
+ onChange: handleInlineInputChange,
811
+ onMentionsChange: setMentions,
812
+ onKeyDown: handleKeyDown,
813
+ onKeyUp: handleInlineKeyUp,
814
+ renderMention: renderMention ?? renderTag
815
+ }
816
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.textAreaWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
557
817
  import_antd.Input.TextArea,
558
818
  {
819
+ ref: textareaRef,
559
820
  className: styles.textArea,
560
821
  value,
561
822
  onChange: handleInputChange,
562
823
  onKeyDown: handleKeyDown,
563
- placeholder: "请输入消息...",
824
+ onKeyUp: handleKeyUp,
825
+ placeholder,
564
826
  autoSize: { minRows: 1, maxRows: 4 },
565
827
  style: {
566
828
  border: "none",
@@ -569,21 +831,31 @@ var XAdkSender = (0, import_react.forwardRef)(
569
831
  padding: 0
570
832
  }
571
833
  }
572
- ) }),
573
- renderSlot(suffix, defaultSuffix)
834
+ ) })
574
835
  ] }),
575
- renderSlot(
576
- footer,
577
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.tip, children: "内容由AI生成,无法确保真实准确,仅供参考" })
578
- )
579
- ] }) })
836
+ activeQuickKey && activeQuickKeyConfig && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.quickListWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
837
+ import_QuickList.default,
838
+ {
839
+ config: activeQuickKeyConfig,
840
+ activeIndex: quickKeyActiveIndex,
841
+ onSelect: handleQuickKeySelect,
842
+ onClose: () => {
843
+ setActiveQuickKey(null);
844
+ setQuickKeyKeyword("");
845
+ setQuickKeyTriggerIdx(-1);
846
+ setQuickKeyActiveIndex(0);
847
+ },
848
+ visible: true
849
+ }
850
+ ) }),
851
+ footer === false ? defaultActionBar : renderSlot(footer, defaultActionBar)
852
+ ] }) }),
853
+ !footer && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.tip, children: "内容由AI生成,无法确保真实准确,仅供参考" })
580
854
  ]
581
855
  }
582
856
  );
583
857
  }
584
858
  );
585
859
  XAdkSender.displayName = "XAdkSender";
586
- var CompoundSender = XAdkSender;
587
- CompoundSender.Switch = import_Switch.default;
588
- var XAdkSender_default = CompoundSender;
860
+ var XAdkSender_default = XAdkSender;
589
861
  //# sourceMappingURL=index.js.map