@ai-group/chat-sdk 3.7.1-alpha8 → 3.7.2

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 (129) hide show
  1. package/README.md +22 -0
  2. package/dist/cjs/components/XAdkChatbot/index.js +3 -3
  3. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  4. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +17 -50
  5. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
  6. package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +3 -2
  7. package/dist/cjs/components/XAdkProvider/compound/Sender.js +81 -4
  8. package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +3 -3
  9. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
  10. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js +34 -0
  11. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js.map +7 -0
  12. package/dist/cjs/components/XAdkProvider/context/index.d.ts +5 -4
  13. package/dist/cjs/components/XAdkProvider/context/index.js +3 -1
  14. package/dist/cjs/components/XAdkProvider/context/index.js.map +2 -2
  15. package/dist/cjs/components/XAdkProvider/index.js +3 -3
  16. package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
  17. package/dist/cjs/components/XAdkSender/InlineTagInput.d.ts +4 -0
  18. package/dist/cjs/components/XAdkSender/InlineTagInput.js +28 -1
  19. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
  20. package/dist/cjs/components/XAdkSender/{QuickList.d.ts → InputSuggestionList.d.ts} +4 -3
  21. package/dist/cjs/components/XAdkSender/{QuickList.js → InputSuggestionList.js} +55 -30
  22. package/dist/cjs/components/XAdkSender/InputSuggestionList.js.map +7 -0
  23. package/dist/cjs/components/XAdkSender/index.js +35 -13
  24. package/dist/cjs/components/XAdkSender/index.js.map +3 -3
  25. package/dist/cjs/components/XAdkSender/styles.js +13 -1
  26. package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
  27. package/dist/cjs/components/XAiConversations/index.js +1 -1
  28. package/dist/cjs/components/XAiConversations/index.js.map +2 -2
  29. package/dist/cjs/components/XAiConversations/styles.js +11 -1
  30. package/dist/cjs/components/XAiConversations/styles.js.map +2 -2
  31. package/dist/cjs/index.d.ts +4 -3
  32. package/dist/cjs/index.js +21 -8
  33. package/dist/cjs/index.js.map +2 -2
  34. package/dist/cjs/presets/base.d.ts +6 -0
  35. package/dist/cjs/presets/base.js +50 -0
  36. package/dist/cjs/presets/base.js.map +7 -0
  37. package/dist/cjs/presets/define.d.ts +11 -0
  38. package/dist/cjs/presets/define.js +58 -0
  39. package/dist/cjs/presets/define.js.map +7 -0
  40. package/dist/cjs/presets/index.d.ts +3 -0
  41. package/dist/cjs/presets/index.js +28 -0
  42. package/dist/cjs/presets/index.js.map +7 -0
  43. package/dist/cjs/presets/runtime.d.ts +22 -0
  44. package/dist/cjs/presets/runtime.js +75 -0
  45. package/dist/cjs/presets/runtime.js.map +7 -0
  46. package/dist/cjs/presets/xgroup/index.d.ts +4 -0
  47. package/dist/cjs/presets/xgroup/index.js +8 -0
  48. package/dist/cjs/presets/xgroup/index.js.map +2 -2
  49. package/dist/cjs/presets/xgroup/knowledgeReference.js +3 -1
  50. package/dist/cjs/presets/xgroup/knowledgeReference.js.map +2 -2
  51. package/dist/cjs/presets/xgroup/preset.d.ts +1 -15
  52. package/dist/cjs/presets/xgroup/preset.js +15 -54
  53. package/dist/cjs/presets/xgroup/preset.js.map +2 -2
  54. package/dist/cjs/presets/xgroup/strategies.d.ts +1 -4
  55. package/dist/cjs/presets/xgroup/strategies.js +0 -17
  56. package/dist/cjs/presets/xgroup/strategies.js.map +2 -2
  57. package/dist/cjs/presets/xgroup/webReference.d.ts +10 -0
  58. package/dist/cjs/presets/xgroup/webReference.js +85 -0
  59. package/dist/cjs/presets/xgroup/webReference.js.map +7 -0
  60. package/dist/cjs/types/ChatStrategies.d.ts +3 -1
  61. package/dist/cjs/types/ChatStrategies.js.map +1 -1
  62. package/dist/cjs/types/XAdkSender.d.ts +4 -0
  63. package/dist/cjs/types/XAdkSender.js.map +1 -1
  64. package/dist/esm/components/XAdkChatbot/index.js +1 -1
  65. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  66. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +16 -41
  67. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
  68. package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +3 -2
  69. package/dist/esm/components/XAdkProvider/compound/Sender.js +70 -7
  70. package/dist/esm/components/XAdkProvider/compound/Sender.js.map +1 -1
  71. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
  72. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js +9 -0
  73. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js.map +1 -0
  74. package/dist/esm/components/XAdkProvider/context/index.d.ts +5 -4
  75. package/dist/esm/components/XAdkProvider/context/index.js +1 -0
  76. package/dist/esm/components/XAdkProvider/context/index.js.map +1 -1
  77. package/dist/esm/components/XAdkProvider/index.js +1 -1
  78. package/dist/esm/components/XAdkProvider/index.js.map +1 -1
  79. package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +4 -0
  80. package/dist/esm/components/XAdkSender/InlineTagInput.js +26 -7
  81. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
  82. package/dist/esm/components/XAdkSender/{QuickList.d.ts → InputSuggestionList.d.ts} +4 -3
  83. package/dist/esm/components/XAdkSender/{QuickList.js → InputSuggestionList.js} +53 -28
  84. package/dist/esm/components/XAdkSender/InputSuggestionList.js.map +1 -0
  85. package/dist/esm/components/XAdkSender/index.js +39 -18
  86. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  87. package/dist/esm/components/XAdkSender/styles.js +2 -2
  88. package/dist/esm/components/XAdkSender/styles.js.map +1 -1
  89. package/dist/esm/components/XAiConversations/index.js +2 -1
  90. package/dist/esm/components/XAiConversations/index.js.map +1 -1
  91. package/dist/esm/components/XAiConversations/styles.js +3 -3
  92. package/dist/esm/components/XAiConversations/styles.js.map +1 -1
  93. package/dist/esm/index.d.ts +4 -3
  94. package/dist/esm/index.js +3 -2
  95. package/dist/esm/index.js.map +1 -1
  96. package/dist/esm/presets/base.d.ts +6 -0
  97. package/dist/esm/presets/base.js +28 -0
  98. package/dist/esm/presets/base.js.map +1 -0
  99. package/dist/esm/presets/define.d.ts +11 -0
  100. package/dist/esm/presets/define.js +33 -0
  101. package/dist/esm/presets/define.js.map +1 -0
  102. package/dist/esm/presets/index.d.ts +3 -0
  103. package/dist/esm/presets/index.js +4 -0
  104. package/dist/esm/presets/index.js.map +1 -0
  105. package/dist/esm/presets/runtime.d.ts +22 -0
  106. package/dist/esm/presets/runtime.js +45 -0
  107. package/dist/esm/presets/runtime.js.map +1 -0
  108. package/dist/esm/presets/xgroup/index.d.ts +4 -0
  109. package/dist/esm/presets/xgroup/index.js +5 -0
  110. package/dist/esm/presets/xgroup/index.js.map +1 -1
  111. package/dist/esm/presets/xgroup/knowledgeReference.js +2 -1
  112. package/dist/esm/presets/xgroup/knowledgeReference.js.map +1 -1
  113. package/dist/esm/presets/xgroup/preset.d.ts +1 -15
  114. package/dist/esm/presets/xgroup/preset.js +5 -41
  115. package/dist/esm/presets/xgroup/preset.js.map +1 -1
  116. package/dist/esm/presets/xgroup/strategies.d.ts +1 -4
  117. package/dist/esm/presets/xgroup/strategies.js +0 -23
  118. package/dist/esm/presets/xgroup/strategies.js.map +1 -1
  119. package/dist/esm/presets/xgroup/webReference.d.ts +10 -0
  120. package/dist/esm/presets/xgroup/webReference.js +46 -0
  121. package/dist/esm/presets/xgroup/webReference.js.map +1 -0
  122. package/dist/esm/types/ChatStrategies.d.ts +3 -1
  123. package/dist/esm/types/ChatStrategies.js.map +1 -1
  124. package/dist/esm/types/XAdkSender.d.ts +4 -0
  125. package/dist/esm/types/XAdkSender.js.map +1 -1
  126. package/dist/umd/chat-sdk.min.js +1 -1
  127. package/package.json +6 -1
  128. package/dist/cjs/components/XAdkSender/QuickList.js.map +0 -7
  129. package/dist/esm/components/XAdkSender/QuickList.js.map +0 -1
@@ -1,8 +1,9 @@
1
- import React, { useMemo, useCallback } from "react";
1
+ import React, { useMemo, useCallback, useEffect, useRef } from "react";
2
2
  import { useStyles } from "./styles";
3
3
  import { jsx as _jsx } from "react/jsx-runtime";
4
4
  import { jsxs as _jsxs } from "react/jsx-runtime";
5
- var QuickList = function QuickList(_ref) {
5
+ /** XAdkSender 内部的输入建议列表,不承载具体业务语义。 */
6
+ var InputSuggestionList = function InputSuggestionList(_ref) {
6
7
  var _config$options$norma;
7
8
  var config = _ref.config,
8
9
  _ref$activeIndex = _ref.activeIndex,
@@ -11,63 +12,86 @@ var QuickList = function QuickList(_ref) {
11
12
  onClose = _ref.onClose,
12
13
  visible = _ref.visible;
13
14
  var styles = useStyles();
15
+ var bodyRef = useRef(null);
16
+ var itemRefs = useRef(new Map());
14
17
 
15
18
  // SDK 内置列表只负责展示 options;搜索、远程过滤、排序等能力由业务方在外部更新 options 实现。
16
19
  var groupedOptions = useMemo(function () {
17
20
  var groups = {};
18
- config.options.forEach(function (opt) {
19
- var g = opt.group || "";
20
- if (!groups[g]) groups[g] = [];
21
- groups[g].push(opt);
21
+ config.options.forEach(function (option) {
22
+ var group = option.group || "";
23
+ if (!groups[group]) groups[group] = [];
24
+ groups[group].push(option);
22
25
  });
23
26
  return groups;
24
27
  }, [config.options]);
25
- var handleSelect = useCallback(function (opt) {
26
- // 先通知选择,再关闭弹层;插入 tag 的逻辑由 XAdkSender 统一处理。
27
- onSelect(opt);
28
+ var normalizedActiveIndex = config.options.length > 0 ? (activeIndex % config.options.length + config.options.length) % config.options.length : 0;
29
+ var activeOptionId = (_config$options$norma = config.options[normalizedActiveIndex]) === null || _config$options$norma === void 0 ? void 0 : _config$options$norma.id;
30
+ useEffect(function () {
31
+ if (!visible || !activeOptionId) return;
32
+ var body = bodyRef.current;
33
+ var item = itemRefs.current.get(activeOptionId);
34
+ if (!body || !item) return;
35
+ var bodyRect = body.getBoundingClientRect();
36
+ var itemRect = item.getBoundingClientRect();
37
+ if (itemRect.top < bodyRect.top) {
38
+ body.scrollTop -= bodyRect.top - itemRect.top;
39
+ } else if (itemRect.bottom > bodyRect.bottom) {
40
+ body.scrollTop += itemRect.bottom - bodyRect.bottom;
41
+ }
42
+ }, [activeOptionId, visible]);
43
+ var handleSelect = useCallback(function (option) {
44
+ onSelect(option);
28
45
  onClose();
29
46
  }, [onSelect, onClose]);
30
47
  if (!visible) return null;
31
- var normalizedActiveIndex = config.options.length > 0 ? (activeIndex % config.options.length + config.options.length) % config.options.length : 0;
32
- var activeOptionId = (_config$options$norma = config.options[normalizedActiveIndex]) === null || _config$options$norma === void 0 ? void 0 : _config$options$norma.id;
33
- var getItemClassName = function getItemClassName(opt) {
34
- return "".concat(styles.quickListItem).concat(opt.id === activeOptionId ? " active" : "");
48
+ var setItemRef = function setItemRef(id, node) {
49
+ if (node) itemRefs.current.set(id, node);else itemRefs.current.delete(id);
50
+ };
51
+ var getItemClassName = function getItemClassName(option) {
52
+ return "".concat(styles.quickListItem).concat(option.id === activeOptionId ? " active" : "");
35
53
  };
36
- var renderOption = function renderOption(opt) {
54
+ var renderOption = function renderOption(option) {
37
55
  if (config.renderItem) {
38
56
  return /*#__PURE__*/_jsx("div", {
39
- className: getItemClassName(opt),
57
+ ref: function ref(node) {
58
+ return setItemRef(option.id, node);
59
+ },
60
+ className: getItemClassName(option),
40
61
  onMouseDown: function onMouseDown(event) {
41
62
  return event.preventDefault();
42
63
  },
43
64
  onClick: function onClick() {
44
- return handleSelect(opt);
65
+ return handleSelect(option);
45
66
  },
46
- children: config.renderItem(opt)
47
- }, opt.id);
67
+ children: config.renderItem(option)
68
+ }, option.id);
48
69
  }
49
70
  return /*#__PURE__*/_jsxs("div", {
50
- className: getItemClassName(opt),
71
+ ref: function ref(node) {
72
+ return setItemRef(option.id, node);
73
+ },
74
+ className: getItemClassName(option),
51
75
  onMouseDown: function onMouseDown(event) {
52
76
  return event.preventDefault();
53
77
  },
54
78
  onClick: function onClick() {
55
- return handleSelect(opt);
79
+ return handleSelect(option);
56
80
  },
57
- children: [opt.icon && /*#__PURE__*/_jsx("span", {
81
+ children: [option.icon && /*#__PURE__*/_jsx("span", {
58
82
  className: "quick-list-item-icon",
59
- children: opt.icon
83
+ children: option.icon
60
84
  }), /*#__PURE__*/_jsxs("div", {
61
85
  className: "quick-list-item-content",
62
86
  children: [/*#__PURE__*/_jsx("div", {
63
87
  className: "quick-list-item-label",
64
- children: opt.label
65
- }), opt.description && /*#__PURE__*/_jsx("div", {
88
+ children: option.label
89
+ }), option.description && /*#__PURE__*/_jsx("div", {
66
90
  className: "quick-list-item-desc",
67
- children: opt.description
91
+ children: option.description
68
92
  })]
69
93
  })]
70
- }, opt.id);
94
+ }, option.id);
71
95
  };
72
96
  var groupKeys = Object.keys(groupedOptions);
73
97
  return /*#__PURE__*/_jsxs("div", {
@@ -76,6 +100,7 @@ var QuickList = function QuickList(_ref) {
76
100
  className: styles.quickListHeader,
77
101
  children: config.title
78
102
  }), /*#__PURE__*/_jsxs("div", {
103
+ ref: bodyRef,
79
104
  className: styles.quickListBody,
80
105
  children: [groupKeys.length === 0 && /*#__PURE__*/_jsx("div", {
81
106
  className: styles.quickListEmpty,
@@ -92,5 +117,5 @@ var QuickList = function QuickList(_ref) {
92
117
  })]
93
118
  });
94
119
  };
95
- export default QuickList;
96
- //# sourceMappingURL=QuickList.js.map
120
+ export default InputSuggestionList;
121
+ //# sourceMappingURL=InputSuggestionList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","useStyles","jsx","_jsx","jsxs","_jsxs","InputSuggestionList","_ref","_config$options$norma","config","_ref$activeIndex","activeIndex","onSelect","onClose","visible","styles","bodyRef","itemRefs","Map","groupedOptions","groups","options","forEach","option","group","push","normalizedActiveIndex","length","activeOptionId","id","body","current","item","get","bodyRect","getBoundingClientRect","itemRect","top","scrollTop","bottom","handleSelect","setItemRef","node","set","delete","getItemClassName","concat","quickListItem","renderOption","renderItem","ref","className","onMouseDown","event","preventDefault","onClick","children","icon","label","description","groupKeys","Object","keys","quickList","title","quickListHeader","quickListBody","quickListEmpty","map","items","quickListGroup","replace"],"sources":["../../../../src/components/XAdkSender/InputSuggestionList.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport type { QuickListOption, QuickKeyConfig } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\ninterface InputSuggestionListProps {\n /** 当前触发的快捷键配置 */\n config: QuickKeyConfig;\n /** 当前键盘选中的选项下标 */\n activeIndex?: number;\n /** 选择回调 */\n onSelect: (option: QuickListOption) => void;\n /** 关闭回调 */\n onClose: () => void;\n /** 是否可见 */\n visible: boolean;\n}\n\n/** XAdkSender 内部的输入建议列表,不承载具体业务语义。 */\nconst InputSuggestionList: React.FC<InputSuggestionListProps> = ({\n config,\n activeIndex = 0,\n onSelect,\n onClose,\n visible,\n}) => {\n const styles = useStyles();\n const bodyRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef(new Map<string, HTMLDivElement>());\n\n // SDK 内置列表只负责展示 options;搜索、远程过滤、排序等能力由业务方在外部更新 options 实现。\n const groupedOptions = useMemo(() => {\n const groups: Record<string, QuickListOption[]> = {};\n config.options.forEach((option) => {\n const group = option.group || \"\";\n if (!groups[group]) groups[group] = [];\n groups[group].push(option);\n });\n return groups;\n }, [config.options]);\n\n const normalizedActiveIndex =\n config.options.length > 0\n ? ((activeIndex % config.options.length) + config.options.length) %\n config.options.length\n : 0;\n const activeOptionId = config.options[normalizedActiveIndex]?.id;\n\n useEffect(() => {\n if (!visible || !activeOptionId) return;\n const body = bodyRef.current;\n const item = itemRefs.current.get(activeOptionId);\n if (!body || !item) return;\n\n const bodyRect = body.getBoundingClientRect();\n const itemRect = item.getBoundingClientRect();\n if (itemRect.top < bodyRect.top) {\n body.scrollTop -= bodyRect.top - itemRect.top;\n } else if (itemRect.bottom > bodyRect.bottom) {\n body.scrollTop += itemRect.bottom - bodyRect.bottom;\n }\n }, [activeOptionId, visible]);\n\n const handleSelect = useCallback(\n (option: QuickListOption) => {\n onSelect(option);\n onClose();\n },\n [onSelect, onClose],\n );\n\n if (!visible) return null;\n\n const setItemRef = (id: string, node: HTMLDivElement | null) => {\n if (node) itemRefs.current.set(id, node);\n else itemRefs.current.delete(id);\n };\n\n const getItemClassName = (option: QuickListOption) =>\n `${styles.quickListItem}${option.id === activeOptionId ? \" active\" : \"\"}`;\n\n const renderOption = (option: QuickListOption) => {\n if (config.renderItem) {\n return (\n <div\n key={option.id}\n ref={(node) => setItemRef(option.id, node)}\n className={getItemClassName(option)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => handleSelect(option)}\n >\n {config.renderItem(option)}\n </div>\n );\n }\n\n return (\n <div\n key={option.id}\n ref={(node) => setItemRef(option.id, node)}\n className={getItemClassName(option)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => handleSelect(option)}\n >\n {option.icon && (\n <span className=\"quick-list-item-icon\">{option.icon}</span>\n )}\n <div className=\"quick-list-item-content\">\n <div className=\"quick-list-item-label\">{option.label}</div>\n {option.description && (\n <div className=\"quick-list-item-desc\">{option.description}</div>\n )}\n </div>\n </div>\n );\n };\n\n const groupKeys = Object.keys(groupedOptions);\n\n return (\n <div className={styles.quickList}>\n {config.title && (\n <div className={styles.quickListHeader}>{config.title}</div>\n )}\n <div ref={bodyRef} className={styles.quickListBody}>\n {groupKeys.length === 0 && (\n <div className={styles.quickListEmpty}>暂无可选项</div>\n )}\n {groupKeys.map((group) => {\n const items = groupedOptions[group];\n return (\n <div key={group}>\n {group && (\n <div className={styles.quickListGroup}>\n {group.replace(/_/g, \" / \")}\n </div>\n )}\n {items.map(renderOption)}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default InputSuggestionList;\n"],"mappings":"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"}
@@ -9,7 +9,7 @@ import { Popconfirm, message, Tooltip, Input, Modal } from "antd";
9
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";
12
+ import InputSuggestionList from "./InputSuggestionList";
13
13
  import InputTags from "./InputTags";
14
14
  import InlineTagInput from "./InlineTagInput";
15
15
  import { getExt } from "../../utils/file";
@@ -134,6 +134,12 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
134
134
  _useState16 = _slicedToArray(_useState15, 2),
135
135
  quickKeyActiveIndex = _useState16[0],
136
136
  setQuickKeyActiveIndex = _useState16[1];
137
+ var closeQuickKeyList = useCallback(function () {
138
+ setActiveQuickKey(null);
139
+ setQuickKeyKeyword("");
140
+ setQuickKeyTriggerIdx(-1);
141
+ setQuickKeyActiveIndex(0);
142
+ }, []);
137
143
 
138
144
  // 生成唯一ID
139
145
  var generateId = function generateId() {
@@ -602,7 +608,7 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
602
608
 
603
609
  // 选择快捷项后转成结构化 Mention;inline 模式会替换掉触发字符和关键词。
604
610
  var handleQuickKeySelect = useCallback(function (option) {
605
- var _ref14, _ref15, _option$value, _ref16, _option$targetId, _option$displayName, _activeQuickKeyConfig, _inlineInputRef$curre6, _textareaRef$current2;
611
+ var _ref14, _ref15, _option$value, _ref16, _option$targetId, _option$displayName, _option$onSelect, _activeQuickKeyConfig, _inlineInputRef$curre7, _textareaRef$current2;
606
612
  var mentionType = (activeQuickKeyConfig === null || activeQuickKeyConfig === void 0 ? void 0 : activeQuickKeyConfig.mentionType) || (activeQuickKeyConfig === null || activeQuickKeyConfig === void 0 ? void 0 : activeQuickKeyConfig.tagType) || activeQuickKey || "unknown";
607
613
  var newMention = {
608
614
  id: generateId(),
@@ -616,10 +622,21 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
616
622
  icon: option.icon,
617
623
  data: option
618
624
  };
625
+ (_option$onSelect = option.onSelect) === null || _option$onSelect === void 0 || _option$onSelect.call(option, option);
619
626
  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, {
627
+ if (option.action === "command") {
628
+ if (inlineTags) {
629
+ var _inlineInputRef$curre5;
630
+ (_inlineInputRef$curre5 = inlineInputRef.current) === null || _inlineInputRef$curre5 === void 0 || _inlineInputRef$curre5.deleteTextRange({
631
+ start: quickKeyTriggerIdx,
632
+ end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length
633
+ });
634
+ } else if (quickKeyTriggerIdx >= 0) {
635
+ setValue(value.slice(0, quickKeyTriggerIdx) + value.slice(quickKeyTriggerIdx + 1 + quickKeyKeyword.length));
636
+ }
637
+ } else if (inlineTags) {
638
+ var _inlineInputRef$curre6;
639
+ (_inlineInputRef$curre6 = inlineInputRef.current) === null || _inlineInputRef$curre6 === void 0 || _inlineInputRef$curre6.insertMention(newMention, {
623
640
  start: quickKeyTriggerIdx,
624
641
  end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length
625
642
  });
@@ -636,7 +653,7 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
636
653
  setQuickKeyKeyword("");
637
654
  setQuickKeyTriggerIdx(-1);
638
655
  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();
656
+ inlineTags ? (_inlineInputRef$curre7 = inlineInputRef.current) === null || _inlineInputRef$curre7 === void 0 ? void 0 : _inlineInputRef$curre7.focus() : (_textareaRef$current2 = textareaRef.current) === null || _textareaRef$current2 === void 0 ? void 0 : _textareaRef$current2.focus();
640
657
  }, [activeQuickKey, activeQuickKeyConfig, inlineTags, mentions, setMentions, value, quickKeyTriggerIdx, quickKeyKeyword, setValue]);
641
658
 
642
659
  // 处理输入框变化(含快捷键检测)
@@ -648,10 +665,10 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
648
665
  detectQuickKey(newValue, e.target.selectionStart || 0);
649
666
  };
650
667
  var handleInlineInputChange = function handleInlineInputChange(newValue) {
651
- var _inlineInputRef$curre7;
668
+ var _inlineInputRef$curre8;
652
669
  setValue(newValue);
653
670
  // contenteditable 的 selection 不一定和 React state 同步,需实时读取内部光标 offset。
654
- detectQuickKey(newValue, ((_inlineInputRef$curre7 = inlineInputRef.current) === null || _inlineInputRef$curre7 === void 0 ? void 0 : _inlineInputRef$curre7.getCursorOffset()) || newValue.length);
671
+ detectQuickKey(newValue, ((_inlineInputRef$curre8 = inlineInputRef.current) === null || _inlineInputRef$curre8 === void 0 ? void 0 : _inlineInputRef$curre8.getCursorOffset()) || newValue.length);
655
672
  };
656
673
  var handleQuickKeyByText = function handleQuickKeyByText(text, cursorPos) {
657
674
  var quickKeyChars = quickKeys.map(function (qk) {
@@ -686,11 +703,11 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
686
703
  handleQuickKeyByText(target.value || "", target.selectionStart || 0);
687
704
  };
688
705
  var handleInlineKeyUp = function handleInlineKeyUp(e) {
689
- var _inlineInputRef$curre8, _inlineInputRef$curre9;
706
+ var _inlineInputRef$curre9, _inlineInputRef$curre10;
690
707
  if (activeQuickKey && isQuickListControlKey(e.key)) return;
691
708
  // 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;
709
+ var text = ((_inlineInputRef$curre9 = inlineInputRef.current) === null || _inlineInputRef$curre9 === void 0 ? void 0 : _inlineInputRef$curre9.getText()) || "";
710
+ var cursorPos = ((_inlineInputRef$curre10 = inlineInputRef.current) === null || _inlineInputRef$curre10 === void 0 ? void 0 : _inlineInputRef$curre10.getCursorOffset()) || text.length;
694
711
  handleQuickKeyByText(text, cursorPos);
695
712
  };
696
713
 
@@ -766,6 +783,8 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
766
783
 
767
784
  // 处理回车键
768
785
  var handleKeyDown = function handleKeyDown(e) {
786
+ // 输入法候选阶段的 Enter 用于确认候选词,不能触发快捷项选择或消息发送。
787
+ if (e.nativeEvent.isComposing || e.keyCode === 229) return;
769
788
  var quickKeyOptions = (activeQuickKeyConfig === null || activeQuickKeyConfig === void 0 ? void 0 : activeQuickKeyConfig.options) || [];
770
789
  if (activeQuickKey && quickKeyOptions.length > 0) {
771
790
  if (e.key === "ArrowDown") {
@@ -929,6 +948,13 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
929
948
  return /*#__PURE__*/_jsxs("div", {
930
949
  ref: containerRef,
931
950
  className: containerClass,
951
+ onBlur: function onBlur(event) {
952
+ var nextFocusedNode = event.relatedTarget;
953
+ if (nextFocusedNode && event.currentTarget.contains(nextFocusedNode)) {
954
+ return;
955
+ }
956
+ closeQuickKeyList();
957
+ },
932
958
  onDragOver: draggable ? handleDragOver : undefined,
933
959
  onDragLeave: draggable ? handleDragLeave : undefined,
934
960
  onDrop: draggable ? handleDrop : undefined,
@@ -983,16 +1009,11 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
983
1009
  })]
984
1010
  }), activeQuickKey && activeQuickKeyConfig && /*#__PURE__*/_jsx("div", {
985
1011
  className: styles.quickListWrapper,
986
- children: /*#__PURE__*/_jsx(QuickList, {
1012
+ children: /*#__PURE__*/_jsx(InputSuggestionList, {
987
1013
  config: activeQuickKeyConfig,
988
1014
  activeIndex: quickKeyActiveIndex,
989
1015
  onSelect: handleQuickKeySelect,
990
- onClose: function onClose() {
991
- setActiveQuickKey(null);
992
- setQuickKeyKeyword("");
993
- setQuickKeyTriggerIdx(-1);
994
- setQuickKeyActiveIndex(0);
995
- },
1016
+ onClose: closeQuickKeyList,
996
1017
  visible: true
997
1018
  })
998
1019
  }), footer === false ? defaultActionBar : renderSlot(footer, defaultActionBar)]