@ai-group/chat-sdk 3.7.1-alpha4 → 3.7.1-alpha7
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.
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +10 -0
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +89 -14
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +21 -0
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +36 -10
- package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +6 -2
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +59 -15
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +2 -1
- package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/styles.d.ts +1 -0
- package/dist/cjs/components/XAdkProvider/compound/styles.js +16 -0
- package/dist/cjs/components/XAdkProvider/compound/styles.js.map +2 -2
- package/dist/cjs/components/XAdkSender/InlineTagInput.js +132 -2
- package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
- package/dist/cjs/components/XAdkSender/index.js +21 -55
- package/dist/cjs/components/XAdkSender/index.js.map +2 -2
- package/dist/cjs/hooks/useADKChat.js +5 -1
- package/dist/cjs/hooks/useADKChat.js.map +2 -2
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/presets/xgroup/preset.js +2 -1
- package/dist/cjs/presets/xgroup/preset.js.map +2 -2
- package/dist/cjs/presets/xgroup/strategies.d.ts +5 -1
- package/dist/cjs/presets/xgroup/strategies.js +16 -1
- package/dist/cjs/presets/xgroup/strategies.js.map +3 -3
- package/dist/cjs/types/ChatStrategies.d.ts +5 -0
- package/dist/cjs/types/ChatStrategies.js.map +1 -1
- package/dist/cjs/types/XAdkSender.d.ts +10 -3
- package/dist/cjs/types/XAdkSender.js.map +1 -1
- package/dist/cjs/utils/markdownResource.d.ts +12 -5
- package/dist/cjs/utils/markdownResource.js +66 -14
- package/dist/cjs/utils/markdownResource.js.map +2 -2
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +10 -0
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +76 -13
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +1 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.js +27 -4
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +6 -2
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +55 -12
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +2 -1
- package/dist/esm/components/XAdkProvider/compound/Sender.js +2 -1
- package/dist/esm/components/XAdkProvider/compound/Sender.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/styles.d.ts +1 -0
- package/dist/esm/components/XAdkProvider/compound/styles.js +3 -2
- package/dist/esm/components/XAdkProvider/compound/styles.js.map +1 -1
- package/dist/esm/components/XAdkSender/InlineTagInput.js +154 -4
- package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
- package/dist/esm/components/XAdkSender/index.js +25 -58
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/hooks/useADKChat.js +8 -2
- package/dist/esm/hooks/useADKChat.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/presets/xgroup/preset.js +3 -2
- package/dist/esm/presets/xgroup/preset.js.map +1 -1
- package/dist/esm/presets/xgroup/strategies.d.ts +5 -1
- package/dist/esm/presets/xgroup/strategies.js +12 -1
- package/dist/esm/presets/xgroup/strategies.js.map +1 -1
- package/dist/esm/types/ChatStrategies.d.ts +5 -0
- package/dist/esm/types/ChatStrategies.js.map +1 -1
- package/dist/esm/types/XAdkSender.d.ts +10 -3
- package/dist/esm/types/XAdkSender.js.map +1 -1
- package/dist/esm/utils/markdownResource.d.ts +12 -5
- package/dist/esm/utils/markdownResource.js +69 -7
- package/dist/esm/utils/markdownResource.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import _taggedTemplateLiteral from "@babel/runtime/helpers/esm/taggedTemplateLiteral";
|
|
2
|
-
var _templateObject, _templateObject2;
|
|
2
|
+
var _templateObject, _templateObject2, _templateObject3;
|
|
3
3
|
import { css } from "@emotion/css";
|
|
4
4
|
import { withBasicStyles } from "../../../styles/common";
|
|
5
5
|
export var useStyles = withBasicStyles(function () {
|
|
6
6
|
return {
|
|
7
7
|
logoText: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n font-size: 30px;\n line-height: 36px;\n font-weight: 800;\n width: 100%;\n min-width: 330px;\n margin-top: 30px;\n color: transparent;\n background: linear-gradient(to right, #ff69b4, #4169e1);\n background-clip: text;\n width: 0;\n overflow: hidden;\n text-overflow: unset;\n white-space: nowrap;\n animation: typewiriter 1s forwards;\n "]))),
|
|
8
|
-
sendWrapper: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: relative;\n width: 100%;\n align-self: center;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n "])))
|
|
8
|
+
sendWrapper: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: relative;\n width: 100%;\n align-self: center;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n "]))),
|
|
9
|
+
uploadButton: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n border: 0;\n background: transparent;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px;\n border-radius: 50%;\n color: #6b7280;\n transition: background 0.2s;\n\n &:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n "])))
|
|
9
10
|
};
|
|
10
11
|
});
|
|
11
12
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["css","withBasicStyles","useStyles","logoText","_templateObject","_taggedTemplateLiteral","sendWrapper","_templateObject2"],"sources":["../../../../../src/components/XAdkProvider/compound/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n logoText: css`\n font-size: 30px;\n line-height: 36px;\n font-weight: 800;\n width: 100%;\n min-width: 330px;\n margin-top: 30px;\n color: transparent;\n background: linear-gradient(to right, #ff69b4, #4169e1);\n background-clip: text;\n width: 0;\n overflow: hidden;\n text-overflow: unset;\n white-space: nowrap;\n animation: typewiriter 1s forwards;\n `,\n\n sendWrapper: css`\n position: relative;\n width: 100%;\n align-self: center;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n `,\n}));\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,QAAQ,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,wYAeZ;IAEDC,WAAW,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA;
|
|
1
|
+
{"version":3,"names":["css","withBasicStyles","useStyles","logoText","_templateObject","_taggedTemplateLiteral","sendWrapper","_templateObject2","uploadButton","_templateObject3"],"sources":["../../../../../src/components/XAdkProvider/compound/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n logoText: css`\n font-size: 30px;\n line-height: 36px;\n font-weight: 800;\n width: 100%;\n min-width: 330px;\n margin-top: 30px;\n color: transparent;\n background: linear-gradient(to right, #ff69b4, #4169e1);\n background-clip: text;\n width: 0;\n overflow: hidden;\n text-overflow: unset;\n white-space: nowrap;\n animation: typewiriter 1s forwards;\n `,\n\n sendWrapper: css`\n position: relative;\n width: 100%;\n align-self: center;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n `,\n\n uploadButton: css`\n border: 0;\n background: transparent;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px;\n border-radius: 50%;\n color: #6b7280;\n transition: background 0.2s;\n\n &:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n `,\n}));\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,QAAQ,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,wYAeZ;IAEDC,WAAW,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,wIAKf;IAEDG,YAAY,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA;EAgBnB,CAAC;AAAA,CAAC,CAAC"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
|
|
1
2
|
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
2
|
-
import
|
|
3
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
4
|
+
import React, { forwardRef, useCallback, useEffect, useLayoutEffect, useImperativeHandle, useRef, useState } from "react";
|
|
3
5
|
import { createRoot } from "react-dom/client";
|
|
4
6
|
import { useStyles } from "./styles";
|
|
7
|
+
import { parseMarkdownResourceLinksAsParts } from "../../utils/markdownResource";
|
|
5
8
|
import { Fragment as _Fragment } from "react/jsx-runtime";
|
|
6
9
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
10
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
@@ -46,6 +49,14 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
46
49
|
var lastInsertedCaretRef = useRef(null);
|
|
47
50
|
var savedRangeRef = useRef(null);
|
|
48
51
|
var defaultInputPartsAppliedRef = useRef(false);
|
|
52
|
+
var skipEmptyCleanupOnceRef = useRef(false);
|
|
53
|
+
var structuralCleanupFrameRef = useRef(null);
|
|
54
|
+
var _useState = useState(function () {
|
|
55
|
+
return Boolean(value || mentions.length);
|
|
56
|
+
}),
|
|
57
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
58
|
+
hasContent = _useState2[0],
|
|
59
|
+
setHasContent = _useState2[1];
|
|
49
60
|
var lastEmittedStateRef = useRef({
|
|
50
61
|
value: value,
|
|
51
62
|
mentionIds: mentions.map(function (mention) {
|
|
@@ -110,6 +121,7 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
110
121
|
var emitChange = useCallback(function () {
|
|
111
122
|
var nextValue = getPlainText();
|
|
112
123
|
var nextMentions = getOrderedMentions();
|
|
124
|
+
setHasContent(Boolean(nextValue || nextMentions.length));
|
|
113
125
|
lastEmittedStateRef.current = {
|
|
114
126
|
value: nextValue,
|
|
115
127
|
mentionIds: nextMentions.map(function (mention) {
|
|
@@ -373,6 +385,59 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
373
385
|
}
|
|
374
386
|
});
|
|
375
387
|
}, []);
|
|
388
|
+
|
|
389
|
+
// Chrome 会把标签前临时输入的文字包进块级节点;文字被删空后,可能留下
|
|
390
|
+
// <div><br></div>。它没有消息语义,却会在 contenteditable 中占据一整行。
|
|
391
|
+
var cleanupEmptyStructuralNodes = useCallback(function () {
|
|
392
|
+
var editor = editorRef.current;
|
|
393
|
+
var selection = window.getSelection();
|
|
394
|
+
if (!editor) return;
|
|
395
|
+
Array.from(editor.children).forEach(function (node) {
|
|
396
|
+
if (node.hasAttribute(MENTION_ATTR)) return;
|
|
397
|
+
if (node.querySelector("[".concat(MENTION_ATTR, "]"))) return;
|
|
398
|
+
if (normalizeText(node.textContent || "")) return;
|
|
399
|
+
var range = selection !== null && selection !== void 0 && selection.rangeCount ? selection.getRangeAt(0) : null;
|
|
400
|
+
var nodeIndex = getNodeIndex(node);
|
|
401
|
+
var containsCursor = Boolean(range && range.collapsed && (range.startContainer === node || node.contains(range.startContainer) || range.startContainer === editor && (range.startOffset === nodeIndex || range.startOffset === nodeIndex + 1)));
|
|
402
|
+
if (containsCursor && selection) {
|
|
403
|
+
// 光标紧邻 contenteditable=false 的 Mention 时,单纯删除 <br> 会让 Chrome
|
|
404
|
+
// 再次生成它。替换成零宽文本锚点,既能承接光标,也不会增加行高。
|
|
405
|
+
var caretNode = createTextNode(CARET_TEXT);
|
|
406
|
+
node.replaceWith(caretNode);
|
|
407
|
+
var nextRange = document.createRange();
|
|
408
|
+
nextRange.setStart(caretNode, CARET_TEXT.length);
|
|
409
|
+
nextRange.collapse(true);
|
|
410
|
+
selection.removeAllRanges();
|
|
411
|
+
selection.addRange(nextRange);
|
|
412
|
+
savedRangeRef.current = nextRange.cloneRange();
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
node.remove();
|
|
416
|
+
});
|
|
417
|
+
}, []);
|
|
418
|
+
useEffect(function () {
|
|
419
|
+
var editor = editorRef.current;
|
|
420
|
+
if (!editor) return;
|
|
421
|
+
|
|
422
|
+
// 某些业务容器会截断 React 委托事件;直接监听编辑器的原生 input,确保删除事务结束后
|
|
423
|
+
// 仍能清理 Chrome 在不可编辑 Mention 前生成的占行 <br>。仅处理 delete*,不影响 Enter 换行。
|
|
424
|
+
var handleNativeDelete = function handleNativeDelete(event) {
|
|
425
|
+
if (!(event instanceof InputEvent)) return;
|
|
426
|
+
if (!event.inputType.startsWith("delete")) return;
|
|
427
|
+
if (structuralCleanupFrameRef.current !== null) {
|
|
428
|
+
window.cancelAnimationFrame(structuralCleanupFrameRef.current);
|
|
429
|
+
}
|
|
430
|
+
structuralCleanupFrameRef.current = window.requestAnimationFrame(function () {
|
|
431
|
+
structuralCleanupFrameRef.current = null;
|
|
432
|
+
cleanupEmptyStructuralNodes();
|
|
433
|
+
cleanupCaretTextNodes();
|
|
434
|
+
});
|
|
435
|
+
};
|
|
436
|
+
editor.addEventListener("input", handleNativeDelete);
|
|
437
|
+
return function () {
|
|
438
|
+
return editor.removeEventListener("input", handleNativeDelete);
|
|
439
|
+
};
|
|
440
|
+
}, [cleanupCaretTextNodes, cleanupEmptyStructuralNodes]);
|
|
376
441
|
var insertMention = useCallback(function (mention, replace) {
|
|
377
442
|
var editor = editorRef.current;
|
|
378
443
|
if (!editor) return;
|
|
@@ -385,6 +450,14 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
385
450
|
insertRange = replaceTextRange(replace.start, replace.end);
|
|
386
451
|
cleanupCaretTextNodes();
|
|
387
452
|
}
|
|
453
|
+
// 浏览器会在空 contenteditable 中生成 <div><br> 等占位块。
|
|
454
|
+
// 空编辑器插入首个 Mention 前先清掉这些无语义节点,避免标签被放进第二个视觉行。
|
|
455
|
+
var isSemanticallyEmpty = !getPlainText() && !editor.querySelector("[".concat(MENTION_ATTR, "]"));
|
|
456
|
+
if (isSemanticallyEmpty) {
|
|
457
|
+
editor.innerHTML = "";
|
|
458
|
+
savedRangeRef.current = null;
|
|
459
|
+
insertRange = null;
|
|
460
|
+
}
|
|
388
461
|
var mentionNode = buildMentionNode(mention);
|
|
389
462
|
var caretNode = createTextNode(CARET_TEXT);
|
|
390
463
|
var selection = window.getSelection();
|
|
@@ -410,13 +483,20 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
410
483
|
restoreCursorAfterInsert(caretNode);
|
|
411
484
|
}
|
|
412
485
|
});
|
|
413
|
-
}, [buildMentionNode, cleanupCaretTextNodes, emitChange, replaceTextRange, restoreCursorAfterInsert, setCursorAtTextEnd]);
|
|
486
|
+
}, [buildMentionNode, cleanupCaretTextNodes, emitChange, getPlainText, replaceTextRange, restoreCursorAfterInsert, setCursorAtTextEnd]);
|
|
414
487
|
useEffect(function () {
|
|
415
488
|
document.addEventListener("selectionchange", saveSelectionRange);
|
|
416
489
|
return function () {
|
|
417
490
|
document.removeEventListener("selectionchange", saveSelectionRange);
|
|
418
491
|
};
|
|
419
492
|
}, [saveSelectionRange]);
|
|
493
|
+
useEffect(function () {
|
|
494
|
+
return function () {
|
|
495
|
+
if (structuralCleanupFrameRef.current !== null) {
|
|
496
|
+
window.cancelAnimationFrame(structuralCleanupFrameRef.current);
|
|
497
|
+
}
|
|
498
|
+
};
|
|
499
|
+
}, []);
|
|
420
500
|
useImperativeHandle(ref, function () {
|
|
421
501
|
return {
|
|
422
502
|
focus: function focus() {
|
|
@@ -437,6 +517,9 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
437
517
|
// 默认片段只在空输入首次挂载时灌入,避免外部重新渲染覆盖用户正在编辑的内容。
|
|
438
518
|
if (!defaultInputPartsAppliedRef.current && defaultInputParts !== null && defaultInputParts !== void 0 && defaultInputParts.length && !value && mentions.length === 0) {
|
|
439
519
|
defaultInputPartsAppliedRef.current = true;
|
|
520
|
+
// emitChange 的受控回写要到下一次 render 才生效;跳过本轮紧随其后的空值清理,
|
|
521
|
+
// 避免刚渲染的默认 Mention 被旧的空 value/mentions 立即移除。
|
|
522
|
+
skipEmptyCleanupOnceRef.current = true;
|
|
440
523
|
renderPartsToEditor(defaultInputParts);
|
|
441
524
|
emitChange();
|
|
442
525
|
return;
|
|
@@ -456,6 +539,7 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
456
539
|
mention: mention
|
|
457
540
|
};
|
|
458
541
|
}))));
|
|
542
|
+
setHasContent(Boolean(value || mentions.length));
|
|
459
543
|
|
|
460
544
|
// 外部主动写入 value/mentions 后,需要在首帧绘制前同步 DOM;若输入区已有焦点,则把光标放在内容末尾。
|
|
461
545
|
var lastTextNode = Array.from(editor.childNodes).reverse().find(function (node) {
|
|
@@ -468,6 +552,10 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
468
552
|
useIsomorphicLayoutEffect(function () {
|
|
469
553
|
var editor = editorRef.current;
|
|
470
554
|
if (!editor) return;
|
|
555
|
+
if (skipEmptyCleanupOnceRef.current) {
|
|
556
|
+
skipEmptyCleanupOnceRef.current = false;
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
471
559
|
if (!value && mentions.length === 0 && editor.childNodes.length > 0) {
|
|
472
560
|
editor.querySelectorAll("[".concat(MENTION_ATTR, "]")).forEach(function (node) {
|
|
473
561
|
var _tagRootMapRef$curren3;
|
|
@@ -477,7 +565,64 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
477
565
|
}
|
|
478
566
|
}, [mentions.length, value]);
|
|
479
567
|
var handleInput = function handleInput() {
|
|
480
|
-
if (!composingRef.current)
|
|
568
|
+
if (!composingRef.current) {
|
|
569
|
+
cleanupEmptyStructuralNodes();
|
|
570
|
+
cleanupCaretTextNodes();
|
|
571
|
+
emitChange();
|
|
572
|
+
|
|
573
|
+
// Chrome 可能在 input 回调返回后才补上用于承接光标的 <br>;下一帧再归一化一次。
|
|
574
|
+
if (structuralCleanupFrameRef.current !== null) {
|
|
575
|
+
window.cancelAnimationFrame(structuralCleanupFrameRef.current);
|
|
576
|
+
}
|
|
577
|
+
structuralCleanupFrameRef.current = window.requestAnimationFrame(function () {
|
|
578
|
+
structuralCleanupFrameRef.current = null;
|
|
579
|
+
cleanupEmptyStructuralNodes();
|
|
580
|
+
cleanupCaretTextNodes();
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
};
|
|
584
|
+
var handlePaste = function handlePaste(event) {
|
|
585
|
+
event.preventDefault();
|
|
586
|
+
var editor = editorRef.current;
|
|
587
|
+
if (!editor) return;
|
|
588
|
+
|
|
589
|
+
// 始终按 text/plain 粘贴,避免消息气泡的背景色等 HTML 样式进入 contenteditable。
|
|
590
|
+
var text = event.clipboardData.getData("text/plain");
|
|
591
|
+
if (!text) return;
|
|
592
|
+
var parts = parseMarkdownResourceLinksAsParts(text);
|
|
593
|
+
var selection = window.getSelection();
|
|
594
|
+
var range = selection !== null && selection !== void 0 && selection.rangeCount && editor.contains(selection.getRangeAt(0).startContainer) ? selection.getRangeAt(0) : null;
|
|
595
|
+
var fragment = document.createDocumentFragment();
|
|
596
|
+
var lastTextNode = null;
|
|
597
|
+
var _iterator = _createForOfIteratorHelper(parts),
|
|
598
|
+
_step;
|
|
599
|
+
try {
|
|
600
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
601
|
+
var part = _step.value;
|
|
602
|
+
if (part.type === "text") {
|
|
603
|
+
lastTextNode = createTextNode(part.text);
|
|
604
|
+
fragment.append(lastTextNode);
|
|
605
|
+
continue;
|
|
606
|
+
}
|
|
607
|
+
latestMentionsRef.current = [].concat(_toConsumableArray(latestMentionsRef.current), [part.mention]);
|
|
608
|
+
fragment.append(buildMentionNode(part.mention));
|
|
609
|
+
lastTextNode = createTextNode(CARET_TEXT);
|
|
610
|
+
fragment.append(lastTextNode);
|
|
611
|
+
}
|
|
612
|
+
} catch (err) {
|
|
613
|
+
_iterator.e(err);
|
|
614
|
+
} finally {
|
|
615
|
+
_iterator.f();
|
|
616
|
+
}
|
|
617
|
+
if (range) {
|
|
618
|
+
range.deleteContents();
|
|
619
|
+
range.insertNode(fragment);
|
|
620
|
+
} else {
|
|
621
|
+
editor.append(fragment);
|
|
622
|
+
}
|
|
623
|
+
cleanupCaretTextNodes();
|
|
624
|
+
if (lastTextNode) setCursorAtTextEnd(lastTextNode);
|
|
625
|
+
emitChange();
|
|
481
626
|
};
|
|
482
627
|
var handleKeyDown = function handleKeyDown(event) {
|
|
483
628
|
if (event.key === "Backspace" || event.key === "Delete") {
|
|
@@ -498,7 +643,7 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
498
643
|
};
|
|
499
644
|
|
|
500
645
|
// placeholder 只由受控 value/mentions 派生,避免从 contenteditable DOM 读取导致外部插入 Mention 后状态滞后一帧。
|
|
501
|
-
var showPlaceholder = !
|
|
646
|
+
var showPlaceholder = !hasContent;
|
|
502
647
|
return /*#__PURE__*/_jsxs("div", {
|
|
503
648
|
className: styles.inlineInputWrapper,
|
|
504
649
|
children: [showPlaceholder && placeholder && /*#__PURE__*/_jsx("div", {
|
|
@@ -512,8 +657,11 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
512
657
|
role: "textbox",
|
|
513
658
|
"aria-multiline": "true",
|
|
514
659
|
onInput: handleInput,
|
|
660
|
+
onPaste: handlePaste,
|
|
515
661
|
onKeyDown: handleKeyDown,
|
|
516
662
|
onKeyUp: function onKeyUp(event) {
|
|
663
|
+
cleanupEmptyStructuralNodes();
|
|
664
|
+
cleanupCaretTextNodes();
|
|
517
665
|
saveSelectionRange();
|
|
518
666
|
_onKeyUp === null || _onKeyUp === void 0 || _onKeyUp(event);
|
|
519
667
|
},
|
|
@@ -521,6 +669,8 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
521
669
|
onFocus: saveSelectionRange,
|
|
522
670
|
onCompositionStart: function onCompositionStart() {
|
|
523
671
|
composingRef.current = true;
|
|
672
|
+
// 中文 IME 在 compositionend 前不会触发受控 value 更新;候选输入一出现就应隐藏 placeholder。
|
|
673
|
+
setHasContent(true);
|
|
524
674
|
},
|
|
525
675
|
onCompositionEnd: function onCompositionEnd() {
|
|
526
676
|
composingRef.current = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","forwardRef","useCallback","useEffect","useLayoutEffect","useImperativeHandle","useRef","createRoot","useStyles","Fragment","_Fragment","jsx","_jsx","jsxs","_jsxs","MENTION_ATTR","CARET_TEXT","createTextNode","text","document","useIsomorphicLayoutEffect","window","normalizeText","replace","getPlainLength","length","toRawOffset","plainOffset","current","i","InlineTagInput","_ref","ref","value","mentions","defaultInputParts","placeholder","disabled","onChange","onMentionsChange","onKeyDown","onKeyUp","renderMention","styles","editorRef","latestMentionsRef","tagRootMapRef","WeakMap","composingRef","lastInsertedCaretRef","savedRangeRef","defaultInputPartsAppliedRef","lastEmittedStateRef","mentionIds","map","mention","id","join","getOrderedMentions","editor","mentionMap","Map","Array","from","querySelectorAll","concat","node","get","dataset","xadkInlineMentionId","filter","Boolean","getPlainText","childNodes","forEach","nodeType","Node","TEXT_NODE","textContent","getParts","parts","push","type","HTMLElement","hasAttribute","mentionId","emitChange","nextValue","nextMentions","removeTextRange","start","end","slice","remove","removeMentionNode","_tagRootMapRef$curren","previous","previousSibling","next","nextSibling","unmount","_text$match","caretLength","match","_text$match2","spaceLength","removeMentionById","find","item","focus","buildMentionNode","span","createElement","setAttribute","className","inlineTag","root","set","render","children","onRemove","label","displayName","close","innerHTML","onclick","event","preventDefault","stopPropagation","append","renderPartsToEditor","_tagRootMapRef$curren2","part","appendChild","tag","setCursorAtTextEnd","_node$textContent","range","createRange","selection","getSelection","setStart","collapse","removeAllRanges","addRange","cloneRange","saveSelectionRange","rangeCount","getRangeAt","contains","startContainer","endContainer","restoreCursorAfterInsert","isMentionNode","isOnlyCaretText","getMentionBeforeRange","container","beforeCursor","startOffset","getMentionAfterRange","afterCursor","getOffsetInEditor","offset","found","visit","getNodeIndex","index","replaceTextRange","insertRange","nodes","nodeStart","plainLength","nodeEnd","rawStart","Math","max","rawEnd","keepLeft","keepRight","parent","parentNode","nodeIndex","cleanupCaretTextNodes","insertMention","_toConsumableArray","mentionNode","caretNode","savedRange","fragment","createDocumentFragment","insertNode","requestAnimationFrame","addEventListener","removeEventListener","_editorRef$current","getText","getCursorOffset","insertTag","incomingMentionIds","lastEmittedState","isInternalControlledEcho","lastTextNode","reverse","activeElement","_tagRootMapRef$curren3","handleInput","handleKeyDown","key","collapsed","targetMention","showPlaceholder","inlineInputWrapper","inlinePlaceholder","inlineInput","contentEditable","suppressContentEditableWarning","role","onInput","onMouseUp","onFocus","onCompositionStart","onCompositionEnd"],"sources":["../../../../src/components/XAdkSender/InlineTagInput.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport type {\n InlineTagRenderInfo,\n MentionTag,\n XAdkSenderInputPart,\n XAdkSenderSubmitPart,\n} from \"@/types\";\nimport { useStyles } from \"./styles\";\n\nexport interface InlineTagInputRef {\n focus: () => void;\n getText: () => string;\n getParts: () => XAdkSenderSubmitPart[];\n getCursorOffset: () => number;\n insertMention: (\n mention: MentionTag,\n replace?: { start: number; end: number },\n ) => void;\n /** @deprecated 请使用 insertMention。 */\n insertTag: (mention: MentionTag, replace?: { start: number; end: number }) => void;\n}\n\nexport interface InlineTagInputProps {\n value: string;\n mentions: MentionTag[];\n defaultInputParts?: XAdkSenderInputPart[];\n placeholder?: string;\n disabled?: boolean;\n onChange: (value: string) => void;\n onMentionsChange: (mentions: MentionTag[]) => void;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;\n renderMention?: (mention: MentionTag, info: InlineTagRenderInfo) => React.ReactNode;\n}\n\nconst MENTION_ATTR = \"data-xadk-inline-mention-id\";\n// contenteditable 无法把光标放进 contenteditable=false 的 Mention 里,需用零宽字符承接“Mention 后方”的光标。\nconst CARET_TEXT = \"\\u200B\";\n\nconst createTextNode = (text: string) => document.createTextNode(text);\nconst useIsomorphicLayoutEffect =\n typeof window === \"undefined\" ? useEffect : useLayoutEffect;\nconst normalizeText = (text: string) =>\n text.replace(/\\u200B/g, \"\").replace(/\\u00a0/g, \" \");\nconst getPlainLength = (text: string) => normalizeText(text).length;\n// DOM 文本里包含零宽光标锚点,快捷键替换和光标定位都要在“用户可见文本 offset”和 DOM raw offset 之间转换。\nconst toRawOffset = (text: string, plainOffset: number) => {\n let current = 0;\n for (let i = 0; i < text.length; i++) {\n if (current >= plainOffset) return i;\n if (text[i] !== CARET_TEXT) current += 1;\n }\n return text.length;\n};\n\nconst InlineTagInput = forwardRef<InlineTagInputRef, InlineTagInputProps>(\n (\n {\n value,\n mentions,\n defaultInputParts,\n placeholder,\n disabled,\n onChange,\n onMentionsChange,\n onKeyDown,\n onKeyUp,\n renderMention,\n },\n ref,\n ) => {\n const styles = useStyles();\n const editorRef = useRef<HTMLDivElement>(null);\n const latestMentionsRef = useRef<MentionTag[]>(mentions);\n const tagRootMapRef = useRef<WeakMap<Element, Root>>(new WeakMap());\n const composingRef = useRef(false);\n const lastInsertedCaretRef = useRef<Text | null>(null);\n const savedRangeRef = useRef<Range | null>(null);\n const defaultInputPartsAppliedRef = useRef(false);\n const lastEmittedStateRef = useRef({\n value,\n mentionIds: mentions.map((mention) => mention.id).join(\"|\"),\n });\n\n useEffect(() => {\n latestMentionsRef.current = mentions;\n }, [mentions]);\n\n const getOrderedMentions = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return [];\n const mentionMap = new Map(\n latestMentionsRef.current.map((mention) => [mention.id, mention]),\n );\n return Array.from(editor.querySelectorAll(`[${MENTION_ATTR}]`))\n .map((node) =>\n mentionMap.get((node as HTMLElement).dataset.xadkInlineMentionId || \"\"),\n )\n .filter(Boolean) as MentionTag[];\n }, []);\n\n // 对外只暴露用户输入的纯文本,内部零宽锚点不进入 value。\n const getPlainText = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return \"\";\n let text = \"\";\n editor.childNodes.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent || \"\";\n }\n });\n return normalizeText(text);\n }, []);\n\n // 提交时需要保留文本与 Mention 的真实顺序;仅靠 value + mentions 无法区分 Mention 在句首、句中还是句尾。\n const getParts = useCallback((): XAdkSenderSubmitPart[] => {\n const editor = editorRef.current;\n if (!editor) return [];\n const mentionMap = new Map(\n latestMentionsRef.current.map((mention) => [mention.id, mention]),\n );\n const parts: XAdkSenderSubmitPart[] = [];\n\n editor.childNodes.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = normalizeText(node.textContent || \"\");\n if (text) parts.push({ type: \"text\", text });\n return;\n }\n\n if (node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR)) {\n const mentionId = node.dataset.xadkInlineMentionId || \"\";\n const mention = mentionMap.get(mentionId);\n if (mention) parts.push({ type: \"mention\", mention });\n }\n });\n\n return parts;\n }, []);\n\n const emitChange = useCallback(() => {\n const nextValue = getPlainText();\n const nextMentions = getOrderedMentions();\n lastEmittedStateRef.current = {\n value: nextValue,\n mentionIds: nextMentions.map((mention) => mention.id).join(\"|\"),\n };\n onChange(nextValue);\n onMentionsChange(nextMentions);\n }, [getOrderedMentions, getPlainText, onChange, onMentionsChange]);\n\n const removeTextRange = useCallback((node: Text, start: number, end: number) => {\n const text = node.textContent || \"\";\n node.textContent = `${text.slice(0, start)}${text.slice(end)}`;\n if (!node.textContent) node.remove();\n }, []);\n\n const removeMentionNode = useCallback(\n (node: Element) => {\n const previous = node.previousSibling;\n const next = node.nextSibling;\n\n tagRootMapRef.current.get(node)?.unmount();\n node.remove();\n\n // Mention 后会补一个不可见光标锚点;删除 Mention 时同步清理,避免留下冗余节点。\n if (next?.nodeType === Node.TEXT_NODE) {\n const text = next.textContent || \"\";\n const caretLength = text.match(/^\\u200B+/)?.[0].length || 0;\n if (caretLength > 0) {\n removeTextRange(next as Text, 0, caretLength);\n return;\n }\n }\n\n if (previous?.nodeType === Node.TEXT_NODE) {\n const text = previous.textContent || \"\";\n const spaceLength = text.match(/\\s+$/)?.[0].length || 0;\n if (spaceLength > 0) {\n removeTextRange(previous as Text, text.length - spaceLength, text.length);\n }\n }\n },\n [removeTextRange],\n );\n\n const removeMentionById = useCallback(\n (id: string) => {\n const editor = editorRef.current;\n const node = Array.from(\n editor?.querySelectorAll(`[${MENTION_ATTR}]`) || [],\n ).find(\n (item) => (item as HTMLElement).dataset.xadkInlineMentionId === id,\n );\n if (node) {\n removeMentionNode(node);\n }\n emitChange();\n editor?.focus();\n },\n [emitChange, removeMentionNode],\n );\n\n // Mention 节点本身不可编辑;删除入口通过 onRemove 回到组件内部统一维护 DOM 与 mentions。\n const buildMentionNode = useCallback(\n (mention: MentionTag) => {\n const span = document.createElement(\"span\");\n span.setAttribute(\"contenteditable\", \"false\");\n span.setAttribute(MENTION_ATTR, mention.id);\n span.dataset.xadkInlineMentionId = mention.id;\n span.className = styles.inlineTag;\n\n if (renderMention) {\n const root = createRoot(span);\n tagRootMapRef.current.set(span, root);\n root.render(\n <>\n {renderMention(mention, {\n onRemove: () => removeMentionById(mention.id),\n })}\n </>,\n );\n } else {\n const label = document.createElement(\"span\");\n label.className = \"xadk-inline-tag-label\";\n label.textContent = mention.displayName || mention.label;\n const close = document.createElement(\"span\");\n close.className = \"xadk-inline-tag-close\";\n close.innerHTML = \"×\";\n close.onclick = (event) => {\n event.preventDefault();\n event.stopPropagation();\n removeMentionById(mention.id);\n };\n span.append(label, close);\n }\n return span;\n },\n [removeMentionById, renderMention, styles.inlineTag],\n );\n\n const renderPartsToEditor = useCallback(\n (parts: XAdkSenderInputPart[]) => {\n const editor = editorRef.current;\n if (!editor) return;\n\n editor.querySelectorAll(`[${MENTION_ATTR}]`).forEach((node) => {\n tagRootMapRef.current.get(node)?.unmount();\n });\n editor.innerHTML = \"\";\n\n parts.forEach((part) => {\n if (part.type === \"text\") {\n if (part.text) editor.appendChild(createTextNode(part.text));\n return;\n }\n const mention = part.type === \"mention\" ? part.mention : part.tag;\n editor.append(buildMentionNode(mention), createTextNode(CARET_TEXT));\n });\n },\n [buildMentionNode],\n );\n\n const setCursorAtTextEnd = useCallback((node: Text) => {\n const range = document.createRange();\n const selection = window.getSelection();\n range.setStart(node, node.textContent?.length || 0);\n range.collapse(true);\n selection?.removeAllRanges();\n selection?.addRange(range);\n savedRangeRef.current = range.cloneRange();\n }, []);\n\n const saveSelectionRange = useCallback(() => {\n const editor = editorRef.current;\n const selection = window.getSelection();\n if (!editor || !selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n if (!editor.contains(range.startContainer) || !editor.contains(range.endContainer)) {\n return;\n }\n savedRangeRef.current = range.cloneRange();\n }, []);\n\n const restoreCursorAfterInsert = useCallback(\n (node: Text) => {\n const editor = editorRef.current;\n if (!editor || !editor.contains(node)) return;\n editor.focus();\n setCursorAtTextEnd(node);\n },\n [setCursorAtTextEnd],\n );\n\n const isMentionNode = (node: Node | null): node is HTMLElement =>\n node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR);\n\n const isOnlyCaretText = (text: string) => normalizeText(text) === \"\";\n\n // Backspace/Delete 需要跨过零宽锚点识别相邻 Mention,不能只看光标所在文本节点。\n const getMentionBeforeRange = (range: Range) => {\n const container = range.startContainer;\n if (container.nodeType === Node.TEXT_NODE) {\n const text = container.textContent || \"\";\n const beforeCursor = text.slice(0, range.startOffset);\n if (isOnlyCaretText(beforeCursor) && isMentionNode(container.previousSibling)) {\n return container.previousSibling;\n }\n }\n\n if (container instanceof HTMLElement) {\n const previous = container.childNodes[range.startOffset - 1];\n if (isMentionNode(previous)) return previous;\n if (\n previous?.nodeType === Node.TEXT_NODE &&\n isOnlyCaretText(previous.textContent || \"\") &&\n isMentionNode(previous.previousSibling)\n ) {\n return previous.previousSibling;\n }\n }\n\n return null;\n };\n\n const getMentionAfterRange = (range: Range) => {\n const container = range.startContainer;\n if (container.nodeType === Node.TEXT_NODE) {\n const text = container.textContent || \"\";\n const afterCursor = text.slice(range.startOffset);\n if (isOnlyCaretText(afterCursor) && isMentionNode(container.nextSibling)) {\n return container.nextSibling;\n }\n }\n\n if (container instanceof HTMLElement) {\n const next = container.childNodes[range.startOffset];\n if (isMentionNode(next)) return next;\n if (\n next?.nodeType === Node.TEXT_NODE &&\n isOnlyCaretText(next.textContent || \"\") &&\n isMentionNode(next.nextSibling)\n ) {\n return next.nextSibling;\n }\n }\n\n return null;\n };\n\n // 读取光标在纯文本中的位置,供快捷键搜索词和 Mention 插入位置复用。\n const getOffsetInEditor = useCallback(() => {\n const editor = editorRef.current;\n const selection = window.getSelection();\n if (!editor || !selection || selection.rangeCount === 0) return 0;\n const range = selection.getRangeAt(0);\n let offset = 0;\n let found = false;\n\n const visit = (node: Node) => {\n if (found) return;\n if (node === range.startContainer) {\n if (node.nodeType === Node.TEXT_NODE) {\n offset += getPlainLength(\n (node.textContent || \"\").slice(0, range.startOffset),\n );\n }\n found = true;\n return;\n }\n if (node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR)) return;\n if (node.nodeType === Node.TEXT_NODE) {\n offset += getPlainLength(node.textContent || \"\");\n return;\n }\n node.childNodes.forEach(visit);\n };\n\n editor.childNodes.forEach(visit);\n return offset;\n }, []);\n\n const getNodeIndex = (node: Node) => {\n let index = 0;\n let current = node;\n while (current.previousSibling) {\n index += 1;\n current = current.previousSibling;\n }\n return index;\n };\n\n // 删除快捷键触发片段,例如把 “@文档” 替换成一个结构化 Mention,并返回删除位置对应的真实 DOM Range。\n // 注意:纯文本 offset 不包含 Mention,Mention 前后可能都是 offset 0;插入 Mention 必须依赖真实 Range,不能再反推 offset。\n const replaceTextRange = useCallback((start: number, end: number) => {\n const editor = editorRef.current;\n if (!editor) return null;\n let offset = 0;\n let insertRange: Range | null = null;\n const nodes = Array.from(editor.childNodes);\n nodes.forEach((node) => {\n if (node.nodeType !== Node.TEXT_NODE) return;\n const text = node.textContent || \"\";\n const nodeStart = offset;\n const plainLength = getPlainLength(text);\n const nodeEnd = offset + plainLength;\n offset = nodeEnd;\n if (nodeEnd <= start || nodeStart >= end) return;\n const rawStart = toRawOffset(text, Math.max(0, start - nodeStart));\n const rawEnd = toRawOffset(text, Math.max(0, end - nodeStart));\n const keepLeft = text.slice(0, rawStart);\n const keepRight = text.slice(rawEnd);\n const parent = node.parentNode;\n const nodeIndex = getNodeIndex(node);\n\n node.textContent = `${keepLeft}${keepRight}`;\n if (!insertRange) {\n insertRange = document.createRange();\n if (node.textContent) {\n insertRange.setStart(node, rawStart);\n } else if (parent) {\n insertRange.setStart(parent, nodeIndex);\n }\n insertRange.collapse(true);\n }\n if (!node.textContent) node.remove();\n });\n\n return insertRange;\n }, []);\n\n // 浏览器拆分 Range 后可能留下空文本节点;清理后才能保证后续 Mention 继续 append 在队尾。\n const cleanupCaretTextNodes = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return;\n Array.from(editor.childNodes).forEach((node) => {\n if (node.nodeType !== Node.TEXT_NODE) return;\n const text = node.textContent || \"\";\n if (!text) {\n node.remove();\n return;\n }\n if (text && normalizeText(text) === \"\") {\n node.textContent = CARET_TEXT;\n }\n });\n }, []);\n\n const insertMention = useCallback(\n (mention: MentionTag, replace?: { start: number; end: number }) => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.focus();\n latestMentionsRef.current = [\n ...latestMentionsRef.current.filter((item) => item.id !== mention.id),\n mention,\n ];\n let insertRange: Range | null = null;\n if (replace) {\n insertRange = replaceTextRange(replace.start, replace.end);\n cleanupCaretTextNodes();\n }\n const mentionNode = buildMentionNode(mention);\n const caretNode = createTextNode(CARET_TEXT);\n const selection = window.getSelection();\n const savedRange = savedRangeRef.current;\n const range =\n insertRange ||\n (selection?.rangeCount &&\n editor.contains(selection.getRangeAt(0).startContainer)\n ? selection.getRangeAt(0)\n : savedRange && editor.contains(savedRange.startContainer)\n ? savedRange\n : null);\n if (range && editor.contains(range.startContainer)) {\n // 用 DocumentFragment 一次性插入,避免连续 insertNode 导致 mention/caret 顺序被浏览器 Range 状态打乱。\n const fragment = document.createDocumentFragment();\n fragment.append(mentionNode, caretNode);\n range.insertNode(fragment);\n } else {\n editor.append(mentionNode, caretNode);\n }\n cleanupCaretTextNodes();\n lastInsertedCaretRef.current = caretNode;\n setCursorAtTextEnd(caretNode);\n emitChange();\n\n // 关闭快捷列表和父组件同步 mentions/value 会触发一次 React 更新;\n // 下一帧再恢复到刚插入 Mention 后的零宽锚点,避免光标被 focus 或重渲染带回旧位置。\n window.requestAnimationFrame(() => {\n if (lastInsertedCaretRef.current === caretNode) {\n restoreCursorAfterInsert(caretNode);\n }\n });\n },\n [\n buildMentionNode,\n cleanupCaretTextNodes,\n emitChange,\n replaceTextRange,\n restoreCursorAfterInsert,\n setCursorAtTextEnd,\n ],\n );\n\n useEffect(() => {\n document.addEventListener(\"selectionchange\", saveSelectionRange);\n return () => {\n document.removeEventListener(\"selectionchange\", saveSelectionRange);\n };\n }, [saveSelectionRange]);\n\n useImperativeHandle(ref, () => ({\n focus: () => editorRef.current?.focus(),\n getText: getPlainText,\n getParts,\n getCursorOffset: getOffsetInEditor,\n insertMention,\n insertTag: insertMention,\n }), [getOffsetInEditor, getParts, getPlainText, insertMention]);\n\n useIsomorphicLayoutEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // 默认片段只在空输入首次挂载时灌入,避免外部重新渲染覆盖用户正在编辑的内容。\n if (\n !defaultInputPartsAppliedRef.current &&\n defaultInputParts?.length &&\n !value &&\n mentions.length === 0\n ) {\n defaultInputPartsAppliedRef.current = true;\n renderPartsToEditor(defaultInputParts);\n emitChange();\n return;\n }\n\n const incomingMentionIds = mentions.map((mention) => mention.id).join(\"|\");\n const lastEmittedState = lastEmittedStateRef.current;\n const isInternalControlledEcho =\n value === lastEmittedState.value &&\n incomingMentionIds === lastEmittedState.mentionIds;\n\n if (isInternalControlledEcho && editor.childNodes.length > 0) return;\n\n renderPartsToEditor([\n ...(value ? [{ type: \"text\" as const, text: value }] : []),\n ...mentions.map((mention) => ({ type: \"mention\" as const, mention })),\n ]);\n\n // 外部主动写入 value/mentions 后,需要在首帧绘制前同步 DOM;若输入区已有焦点,则把光标放在内容末尾。\n const lastTextNode = Array.from(editor.childNodes)\n .reverse()\n .find((node): node is Text => node.nodeType === Node.TEXT_NODE);\n if (document.activeElement === editor && lastTextNode) {\n setCursorAtTextEnd(lastTextNode);\n }\n }, [\n defaultInputParts,\n emitChange,\n renderPartsToEditor,\n setCursorAtTextEnd,\n mentions,\n value,\n ]);\n\n useIsomorphicLayoutEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n if (!value && mentions.length === 0 && editor.childNodes.length > 0) {\n editor.querySelectorAll(`[${MENTION_ATTR}]`).forEach((node) => {\n tagRootMapRef.current.get(node)?.unmount();\n });\n editor.innerHTML = \"\";\n }\n }, [mentions.length, value]);\n\n const handleInput = () => {\n if (!composingRef.current) emitChange();\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (event) => {\n if (event.key === \"Backspace\" || event.key === \"Delete\") {\n const selection = window.getSelection();\n if (selection?.rangeCount) {\n const range = selection.getRangeAt(0);\n if (range.collapsed) {\n const targetMention =\n event.key === \"Backspace\"\n ? getMentionBeforeRange(range)\n : getMentionAfterRange(range);\n\n if (targetMention) {\n event.preventDefault();\n removeMentionById(targetMention.dataset.xadkInlineMentionId || \"\");\n return;\n }\n }\n }\n }\n onKeyDown?.(event);\n };\n\n // placeholder 只由受控 value/mentions 派生,避免从 contenteditable DOM 读取导致外部插入 Mention 后状态滞后一帧。\n const showPlaceholder = !value && mentions.length === 0;\n\n return (\n <div className={styles.inlineInputWrapper}>\n {showPlaceholder && placeholder && (\n <div className={styles.inlinePlaceholder}>{placeholder}</div>\n )}\n <div\n ref={editorRef}\n className={styles.inlineInput}\n contentEditable={!disabled}\n suppressContentEditableWarning\n role=\"textbox\"\n aria-multiline=\"true\"\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n onKeyUp={(event) => {\n saveSelectionRange();\n onKeyUp?.(event);\n }}\n onMouseUp={saveSelectionRange}\n onFocus={saveSelectionRange}\n onCompositionStart={() => {\n composingRef.current = true;\n }}\n onCompositionEnd={() => {\n composingRef.current = false;\n emitChange();\n }}\n data-cursor-offset={getOffsetInEditor()}\n />\n </div>\n );\n },\n);\n\nInlineTagInput.displayName = \"InlineTagInput\";\n\nexport default InlineTagInput;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["React","forwardRef","useCallback","useEffect","useLayoutEffect","useImperativeHandle","useRef","useState","createRoot","useStyles","parseMarkdownResourceLinksAsParts","Fragment","_Fragment","jsx","_jsx","jsxs","_jsxs","MENTION_ATTR","CARET_TEXT","createTextNode","text","document","useIsomorphicLayoutEffect","window","normalizeText","replace","getPlainLength","length","toRawOffset","plainOffset","current","i","InlineTagInput","_ref","ref","value","mentions","defaultInputParts","placeholder","disabled","onChange","onMentionsChange","onKeyDown","onKeyUp","renderMention","styles","editorRef","latestMentionsRef","tagRootMapRef","WeakMap","composingRef","lastInsertedCaretRef","savedRangeRef","defaultInputPartsAppliedRef","skipEmptyCleanupOnceRef","structuralCleanupFrameRef","_useState","Boolean","_useState2","_slicedToArray","hasContent","setHasContent","lastEmittedStateRef","mentionIds","map","mention","id","join","getOrderedMentions","editor","mentionMap","Map","Array","from","querySelectorAll","concat","node","get","dataset","xadkInlineMentionId","filter","getPlainText","childNodes","forEach","nodeType","Node","TEXT_NODE","textContent","getParts","parts","push","type","HTMLElement","hasAttribute","mentionId","emitChange","nextValue","nextMentions","removeTextRange","start","end","slice","remove","removeMentionNode","_tagRootMapRef$curren","previous","previousSibling","next","nextSibling","unmount","_text$match","caretLength","match","_text$match2","spaceLength","removeMentionById","find","item","focus","buildMentionNode","span","createElement","setAttribute","className","inlineTag","root","set","render","children","onRemove","label","displayName","close","innerHTML","onclick","event","preventDefault","stopPropagation","append","renderPartsToEditor","_tagRootMapRef$curren2","part","appendChild","tag","setCursorAtTextEnd","_node$textContent","range","createRange","selection","getSelection","setStart","collapse","removeAllRanges","addRange","cloneRange","saveSelectionRange","rangeCount","getRangeAt","contains","startContainer","endContainer","restoreCursorAfterInsert","isMentionNode","isOnlyCaretText","getMentionBeforeRange","container","beforeCursor","startOffset","getMentionAfterRange","afterCursor","getOffsetInEditor","offset","found","visit","getNodeIndex","index","replaceTextRange","insertRange","nodes","nodeStart","plainLength","nodeEnd","rawStart","Math","max","rawEnd","keepLeft","keepRight","parent","parentNode","nodeIndex","cleanupCaretTextNodes","cleanupEmptyStructuralNodes","querySelector","containsCursor","collapsed","caretNode","replaceWith","nextRange","handleNativeDelete","InputEvent","inputType","startsWith","cancelAnimationFrame","requestAnimationFrame","addEventListener","removeEventListener","insertMention","_toConsumableArray","isSemanticallyEmpty","mentionNode","savedRange","fragment","createDocumentFragment","insertNode","_editorRef$current","getText","getCursorOffset","insertTag","incomingMentionIds","lastEmittedState","isInternalControlledEcho","lastTextNode","reverse","activeElement","_tagRootMapRef$curren3","handleInput","handlePaste","clipboardData","getData","_iterator","_createForOfIteratorHelper","_step","s","n","done","err","e","f","deleteContents","handleKeyDown","key","targetMention","showPlaceholder","inlineInputWrapper","inlinePlaceholder","inlineInput","contentEditable","suppressContentEditableWarning","role","onInput","onPaste","onMouseUp","onFocus","onCompositionStart","onCompositionEnd"],"sources":["../../../../src/components/XAdkSender/InlineTagInput.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport type {\n InlineTagRenderInfo,\n MentionTag,\n XAdkSenderInputPart,\n XAdkSenderSubmitPart,\n} from \"@/types\";\nimport { useStyles } from \"./styles\";\nimport { parseMarkdownResourceLinksAsParts } from \"@/utils/markdownResource\";\n\nexport interface InlineTagInputRef {\n focus: () => void;\n getText: () => string;\n getParts: () => XAdkSenderSubmitPart[];\n getCursorOffset: () => number;\n insertMention: (\n mention: MentionTag,\n replace?: { start: number; end: number },\n ) => void;\n /** @deprecated 请使用 insertMention。 */\n insertTag: (mention: MentionTag, replace?: { start: number; end: number }) => void;\n}\n\nexport interface InlineTagInputProps {\n value: string;\n mentions: MentionTag[];\n defaultInputParts?: XAdkSenderInputPart[];\n placeholder?: string;\n disabled?: boolean;\n onChange: (value: string) => void;\n onMentionsChange: (mentions: MentionTag[]) => void;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;\n renderMention?: (mention: MentionTag, info: InlineTagRenderInfo) => React.ReactNode;\n}\n\nconst MENTION_ATTR = \"data-xadk-inline-mention-id\";\n// contenteditable 无法把光标放进 contenteditable=false 的 Mention 里,需用零宽字符承接“Mention 后方”的光标。\nconst CARET_TEXT = \"\\u200B\";\n\nconst createTextNode = (text: string) => document.createTextNode(text);\nconst useIsomorphicLayoutEffect =\n typeof window === \"undefined\" ? useEffect : useLayoutEffect;\nconst normalizeText = (text: string) =>\n text.replace(/\\u200B/g, \"\").replace(/\\u00a0/g, \" \");\nconst getPlainLength = (text: string) => normalizeText(text).length;\n// DOM 文本里包含零宽光标锚点,快捷键替换和光标定位都要在“用户可见文本 offset”和 DOM raw offset 之间转换。\nconst toRawOffset = (text: string, plainOffset: number) => {\n let current = 0;\n for (let i = 0; i < text.length; i++) {\n if (current >= plainOffset) return i;\n if (text[i] !== CARET_TEXT) current += 1;\n }\n return text.length;\n};\n\nconst InlineTagInput = forwardRef<InlineTagInputRef, InlineTagInputProps>(\n (\n {\n value,\n mentions,\n defaultInputParts,\n placeholder,\n disabled,\n onChange,\n onMentionsChange,\n onKeyDown,\n onKeyUp,\n renderMention,\n },\n ref,\n ) => {\n const styles = useStyles();\n const editorRef = useRef<HTMLDivElement>(null);\n const latestMentionsRef = useRef<MentionTag[]>(mentions);\n const tagRootMapRef = useRef<WeakMap<Element, Root>>(new WeakMap());\n const composingRef = useRef(false);\n const lastInsertedCaretRef = useRef<Text | null>(null);\n const savedRangeRef = useRef<Range | null>(null);\n const defaultInputPartsAppliedRef = useRef(false);\n const skipEmptyCleanupOnceRef = useRef(false);\n const structuralCleanupFrameRef = useRef<number | null>(null);\n const [hasContent, setHasContent] = useState(\n () => Boolean(value || mentions.length),\n );\n const lastEmittedStateRef = useRef({\n value,\n mentionIds: mentions.map((mention) => mention.id).join(\"|\"),\n });\n\n useEffect(() => {\n latestMentionsRef.current = mentions;\n }, [mentions]);\n\n const getOrderedMentions = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return [];\n const mentionMap = new Map(\n latestMentionsRef.current.map((mention) => [mention.id, mention]),\n );\n return Array.from(editor.querySelectorAll(`[${MENTION_ATTR}]`))\n .map((node) =>\n mentionMap.get((node as HTMLElement).dataset.xadkInlineMentionId || \"\"),\n )\n .filter(Boolean) as MentionTag[];\n }, []);\n\n // 对外只暴露用户输入的纯文本,内部零宽锚点不进入 value。\n const getPlainText = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return \"\";\n let text = \"\";\n editor.childNodes.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent || \"\";\n }\n });\n return normalizeText(text);\n }, []);\n\n // 提交时需要保留文本与 Mention 的真实顺序;仅靠 value + mentions 无法区分 Mention 在句首、句中还是句尾。\n const getParts = useCallback((): XAdkSenderSubmitPart[] => {\n const editor = editorRef.current;\n if (!editor) return [];\n const mentionMap = new Map(\n latestMentionsRef.current.map((mention) => [mention.id, mention]),\n );\n const parts: XAdkSenderSubmitPart[] = [];\n\n editor.childNodes.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = normalizeText(node.textContent || \"\");\n if (text) parts.push({ type: \"text\", text });\n return;\n }\n\n if (node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR)) {\n const mentionId = node.dataset.xadkInlineMentionId || \"\";\n const mention = mentionMap.get(mentionId);\n if (mention) parts.push({ type: \"mention\", mention });\n }\n });\n\n return parts;\n }, []);\n\n const emitChange = useCallback(() => {\n const nextValue = getPlainText();\n const nextMentions = getOrderedMentions();\n setHasContent(Boolean(nextValue || nextMentions.length));\n lastEmittedStateRef.current = {\n value: nextValue,\n mentionIds: nextMentions.map((mention) => mention.id).join(\"|\"),\n };\n onChange(nextValue);\n onMentionsChange(nextMentions);\n }, [getOrderedMentions, getPlainText, onChange, onMentionsChange]);\n\n const removeTextRange = useCallback((node: Text, start: number, end: number) => {\n const text = node.textContent || \"\";\n node.textContent = `${text.slice(0, start)}${text.slice(end)}`;\n if (!node.textContent) node.remove();\n }, []);\n\n const removeMentionNode = useCallback(\n (node: Element) => {\n const previous = node.previousSibling;\n const next = node.nextSibling;\n\n tagRootMapRef.current.get(node)?.unmount();\n node.remove();\n\n // Mention 后会补一个不可见光标锚点;删除 Mention 时同步清理,避免留下冗余节点。\n if (next?.nodeType === Node.TEXT_NODE) {\n const text = next.textContent || \"\";\n const caretLength = text.match(/^\\u200B+/)?.[0].length || 0;\n if (caretLength > 0) {\n removeTextRange(next as Text, 0, caretLength);\n return;\n }\n }\n\n if (previous?.nodeType === Node.TEXT_NODE) {\n const text = previous.textContent || \"\";\n const spaceLength = text.match(/\\s+$/)?.[0].length || 0;\n if (spaceLength > 0) {\n removeTextRange(previous as Text, text.length - spaceLength, text.length);\n }\n }\n },\n [removeTextRange],\n );\n\n const removeMentionById = useCallback(\n (id: string) => {\n const editor = editorRef.current;\n const node = Array.from(\n editor?.querySelectorAll(`[${MENTION_ATTR}]`) || [],\n ).find(\n (item) => (item as HTMLElement).dataset.xadkInlineMentionId === id,\n );\n if (node) {\n removeMentionNode(node);\n }\n emitChange();\n editor?.focus();\n },\n [emitChange, removeMentionNode],\n );\n\n // Mention 节点本身不可编辑;删除入口通过 onRemove 回到组件内部统一维护 DOM 与 mentions。\n const buildMentionNode = useCallback(\n (mention: MentionTag) => {\n const span = document.createElement(\"span\");\n span.setAttribute(\"contenteditable\", \"false\");\n span.setAttribute(MENTION_ATTR, mention.id);\n span.dataset.xadkInlineMentionId = mention.id;\n span.className = styles.inlineTag;\n\n if (renderMention) {\n const root = createRoot(span);\n tagRootMapRef.current.set(span, root);\n root.render(\n <>\n {renderMention(mention, {\n onRemove: () => removeMentionById(mention.id),\n })}\n </>,\n );\n } else {\n const label = document.createElement(\"span\");\n label.className = \"xadk-inline-tag-label\";\n label.textContent = mention.displayName || mention.label;\n const close = document.createElement(\"span\");\n close.className = \"xadk-inline-tag-close\";\n close.innerHTML = \"×\";\n close.onclick = (event) => {\n event.preventDefault();\n event.stopPropagation();\n removeMentionById(mention.id);\n };\n span.append(label, close);\n }\n return span;\n },\n [removeMentionById, renderMention, styles.inlineTag],\n );\n\n const renderPartsToEditor = useCallback(\n (parts: XAdkSenderInputPart[]) => {\n const editor = editorRef.current;\n if (!editor) return;\n\n editor.querySelectorAll(`[${MENTION_ATTR}]`).forEach((node) => {\n tagRootMapRef.current.get(node)?.unmount();\n });\n editor.innerHTML = \"\";\n\n parts.forEach((part) => {\n if (part.type === \"text\") {\n if (part.text) editor.appendChild(createTextNode(part.text));\n return;\n }\n const mention = part.type === \"mention\" ? part.mention : part.tag;\n editor.append(buildMentionNode(mention), createTextNode(CARET_TEXT));\n });\n },\n [buildMentionNode],\n );\n\n const setCursorAtTextEnd = useCallback((node: Text) => {\n const range = document.createRange();\n const selection = window.getSelection();\n range.setStart(node, node.textContent?.length || 0);\n range.collapse(true);\n selection?.removeAllRanges();\n selection?.addRange(range);\n savedRangeRef.current = range.cloneRange();\n }, []);\n\n const saveSelectionRange = useCallback(() => {\n const editor = editorRef.current;\n const selection = window.getSelection();\n if (!editor || !selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n if (!editor.contains(range.startContainer) || !editor.contains(range.endContainer)) {\n return;\n }\n savedRangeRef.current = range.cloneRange();\n }, []);\n\n const restoreCursorAfterInsert = useCallback(\n (node: Text) => {\n const editor = editorRef.current;\n if (!editor || !editor.contains(node)) return;\n editor.focus();\n setCursorAtTextEnd(node);\n },\n [setCursorAtTextEnd],\n );\n\n const isMentionNode = (node: Node | null): node is HTMLElement =>\n node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR);\n\n const isOnlyCaretText = (text: string) => normalizeText(text) === \"\";\n\n // Backspace/Delete 需要跨过零宽锚点识别相邻 Mention,不能只看光标所在文本节点。\n const getMentionBeforeRange = (range: Range) => {\n const container = range.startContainer;\n if (container.nodeType === Node.TEXT_NODE) {\n const text = container.textContent || \"\";\n const beforeCursor = text.slice(0, range.startOffset);\n if (isOnlyCaretText(beforeCursor) && isMentionNode(container.previousSibling)) {\n return container.previousSibling;\n }\n }\n\n if (container instanceof HTMLElement) {\n const previous = container.childNodes[range.startOffset - 1];\n if (isMentionNode(previous)) return previous;\n if (\n previous?.nodeType === Node.TEXT_NODE &&\n isOnlyCaretText(previous.textContent || \"\") &&\n isMentionNode(previous.previousSibling)\n ) {\n return previous.previousSibling;\n }\n }\n\n return null;\n };\n\n const getMentionAfterRange = (range: Range) => {\n const container = range.startContainer;\n if (container.nodeType === Node.TEXT_NODE) {\n const text = container.textContent || \"\";\n const afterCursor = text.slice(range.startOffset);\n if (isOnlyCaretText(afterCursor) && isMentionNode(container.nextSibling)) {\n return container.nextSibling;\n }\n }\n\n if (container instanceof HTMLElement) {\n const next = container.childNodes[range.startOffset];\n if (isMentionNode(next)) return next;\n if (\n next?.nodeType === Node.TEXT_NODE &&\n isOnlyCaretText(next.textContent || \"\") &&\n isMentionNode(next.nextSibling)\n ) {\n return next.nextSibling;\n }\n }\n\n return null;\n };\n\n // 读取光标在纯文本中的位置,供快捷键搜索词和 Mention 插入位置复用。\n const getOffsetInEditor = useCallback(() => {\n const editor = editorRef.current;\n const selection = window.getSelection();\n if (!editor || !selection || selection.rangeCount === 0) return 0;\n const range = selection.getRangeAt(0);\n let offset = 0;\n let found = false;\n\n const visit = (node: Node) => {\n if (found) return;\n if (node === range.startContainer) {\n if (node.nodeType === Node.TEXT_NODE) {\n offset += getPlainLength(\n (node.textContent || \"\").slice(0, range.startOffset),\n );\n }\n found = true;\n return;\n }\n if (node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR)) return;\n if (node.nodeType === Node.TEXT_NODE) {\n offset += getPlainLength(node.textContent || \"\");\n return;\n }\n node.childNodes.forEach(visit);\n };\n\n editor.childNodes.forEach(visit);\n return offset;\n }, []);\n\n const getNodeIndex = (node: Node) => {\n let index = 0;\n let current = node;\n while (current.previousSibling) {\n index += 1;\n current = current.previousSibling;\n }\n return index;\n };\n\n // 删除快捷键触发片段,例如把 “@文档” 替换成一个结构化 Mention,并返回删除位置对应的真实 DOM Range。\n // 注意:纯文本 offset 不包含 Mention,Mention 前后可能都是 offset 0;插入 Mention 必须依赖真实 Range,不能再反推 offset。\n const replaceTextRange = useCallback((start: number, end: number) => {\n const editor = editorRef.current;\n if (!editor) return null;\n let offset = 0;\n let insertRange: Range | null = null;\n const nodes = Array.from(editor.childNodes);\n nodes.forEach((node) => {\n if (node.nodeType !== Node.TEXT_NODE) return;\n const text = node.textContent || \"\";\n const nodeStart = offset;\n const plainLength = getPlainLength(text);\n const nodeEnd = offset + plainLength;\n offset = nodeEnd;\n if (nodeEnd <= start || nodeStart >= end) return;\n const rawStart = toRawOffset(text, Math.max(0, start - nodeStart));\n const rawEnd = toRawOffset(text, Math.max(0, end - nodeStart));\n const keepLeft = text.slice(0, rawStart);\n const keepRight = text.slice(rawEnd);\n const parent = node.parentNode;\n const nodeIndex = getNodeIndex(node);\n\n node.textContent = `${keepLeft}${keepRight}`;\n if (!insertRange) {\n insertRange = document.createRange();\n if (node.textContent) {\n insertRange.setStart(node, rawStart);\n } else if (parent) {\n insertRange.setStart(parent, nodeIndex);\n }\n insertRange.collapse(true);\n }\n if (!node.textContent) node.remove();\n });\n\n return insertRange;\n }, []);\n\n // 浏览器拆分 Range 后可能留下空文本节点;清理后才能保证后续 Mention 继续 append 在队尾。\n const cleanupCaretTextNodes = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return;\n Array.from(editor.childNodes).forEach((node) => {\n if (node.nodeType !== Node.TEXT_NODE) return;\n const text = node.textContent || \"\";\n if (!text) {\n node.remove();\n return;\n }\n if (text && normalizeText(text) === \"\") {\n node.textContent = CARET_TEXT;\n }\n });\n }, []);\n\n // Chrome 会把标签前临时输入的文字包进块级节点;文字被删空后,可能留下\n // <div><br></div>。它没有消息语义,却会在 contenteditable 中占据一整行。\n const cleanupEmptyStructuralNodes = useCallback(() => {\n const editor = editorRef.current;\n const selection = window.getSelection();\n if (!editor) return;\n\n Array.from(editor.children).forEach((node) => {\n if (node.hasAttribute(MENTION_ATTR)) return;\n if (node.querySelector(`[${MENTION_ATTR}]`)) return;\n if (normalizeText(node.textContent || \"\")) return;\n\n const range = selection?.rangeCount ? selection.getRangeAt(0) : null;\n const nodeIndex = getNodeIndex(node);\n const containsCursor = Boolean(\n range &&\n range.collapsed &&\n (range.startContainer === node ||\n node.contains(range.startContainer) ||\n (range.startContainer === editor &&\n (range.startOffset === nodeIndex ||\n range.startOffset === nodeIndex + 1))),\n );\n\n if (containsCursor && selection) {\n // 光标紧邻 contenteditable=false 的 Mention 时,单纯删除 <br> 会让 Chrome\n // 再次生成它。替换成零宽文本锚点,既能承接光标,也不会增加行高。\n const caretNode = createTextNode(CARET_TEXT);\n node.replaceWith(caretNode);\n const nextRange = document.createRange();\n nextRange.setStart(caretNode, CARET_TEXT.length);\n nextRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(nextRange);\n savedRangeRef.current = nextRange.cloneRange();\n return;\n }\n\n node.remove();\n });\n }, []);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // 某些业务容器会截断 React 委托事件;直接监听编辑器的原生 input,确保删除事务结束后\n // 仍能清理 Chrome 在不可编辑 Mention 前生成的占行 <br>。仅处理 delete*,不影响 Enter 换行。\n const handleNativeDelete = (event: Event) => {\n if (!(event instanceof InputEvent)) return;\n if (!event.inputType.startsWith(\"delete\")) return;\n if (structuralCleanupFrameRef.current !== null) {\n window.cancelAnimationFrame(structuralCleanupFrameRef.current);\n }\n structuralCleanupFrameRef.current = window.requestAnimationFrame(() => {\n structuralCleanupFrameRef.current = null;\n cleanupEmptyStructuralNodes();\n cleanupCaretTextNodes();\n });\n };\n\n editor.addEventListener(\"input\", handleNativeDelete);\n return () => editor.removeEventListener(\"input\", handleNativeDelete);\n }, [cleanupCaretTextNodes, cleanupEmptyStructuralNodes]);\n\n const insertMention = useCallback(\n (mention: MentionTag, replace?: { start: number; end: number }) => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.focus();\n latestMentionsRef.current = [\n ...latestMentionsRef.current.filter((item) => item.id !== mention.id),\n mention,\n ];\n let insertRange: Range | null = null;\n if (replace) {\n insertRange = replaceTextRange(replace.start, replace.end);\n cleanupCaretTextNodes();\n }\n // 浏览器会在空 contenteditable 中生成 <div><br> 等占位块。\n // 空编辑器插入首个 Mention 前先清掉这些无语义节点,避免标签被放进第二个视觉行。\n const isSemanticallyEmpty =\n !getPlainText() &&\n !editor.querySelector(`[${MENTION_ATTR}]`);\n if (isSemanticallyEmpty) {\n editor.innerHTML = \"\";\n savedRangeRef.current = null;\n insertRange = null;\n }\n const mentionNode = buildMentionNode(mention);\n const caretNode = createTextNode(CARET_TEXT);\n const selection = window.getSelection();\n const savedRange = savedRangeRef.current;\n const range =\n insertRange ||\n (selection?.rangeCount &&\n editor.contains(selection.getRangeAt(0).startContainer)\n ? selection.getRangeAt(0)\n : savedRange && editor.contains(savedRange.startContainer)\n ? savedRange\n : null);\n if (range && editor.contains(range.startContainer)) {\n // 用 DocumentFragment 一次性插入,避免连续 insertNode 导致 mention/caret 顺序被浏览器 Range 状态打乱。\n const fragment = document.createDocumentFragment();\n fragment.append(mentionNode, caretNode);\n range.insertNode(fragment);\n } else {\n editor.append(mentionNode, caretNode);\n }\n cleanupCaretTextNodes();\n lastInsertedCaretRef.current = caretNode;\n setCursorAtTextEnd(caretNode);\n emitChange();\n\n // 关闭快捷列表和父组件同步 mentions/value 会触发一次 React 更新;\n // 下一帧再恢复到刚插入 Mention 后的零宽锚点,避免光标被 focus 或重渲染带回旧位置。\n window.requestAnimationFrame(() => {\n if (lastInsertedCaretRef.current === caretNode) {\n restoreCursorAfterInsert(caretNode);\n }\n });\n },\n [\n buildMentionNode,\n cleanupCaretTextNodes,\n emitChange,\n getPlainText,\n replaceTextRange,\n restoreCursorAfterInsert,\n setCursorAtTextEnd,\n ],\n );\n\n useEffect(() => {\n document.addEventListener(\"selectionchange\", saveSelectionRange);\n return () => {\n document.removeEventListener(\"selectionchange\", saveSelectionRange);\n };\n }, [saveSelectionRange]);\n\n useEffect(\n () => () => {\n if (structuralCleanupFrameRef.current !== null) {\n window.cancelAnimationFrame(structuralCleanupFrameRef.current);\n }\n },\n [],\n );\n\n useImperativeHandle(ref, () => ({\n focus: () => editorRef.current?.focus(),\n getText: getPlainText,\n getParts,\n getCursorOffset: getOffsetInEditor,\n insertMention,\n insertTag: insertMention,\n }), [getOffsetInEditor, getParts, getPlainText, insertMention]);\n\n useIsomorphicLayoutEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // 默认片段只在空输入首次挂载时灌入,避免外部重新渲染覆盖用户正在编辑的内容。\n if (\n !defaultInputPartsAppliedRef.current &&\n defaultInputParts?.length &&\n !value &&\n mentions.length === 0\n ) {\n defaultInputPartsAppliedRef.current = true;\n // emitChange 的受控回写要到下一次 render 才生效;跳过本轮紧随其后的空值清理,\n // 避免刚渲染的默认 Mention 被旧的空 value/mentions 立即移除。\n skipEmptyCleanupOnceRef.current = true;\n renderPartsToEditor(defaultInputParts);\n emitChange();\n return;\n }\n\n const incomingMentionIds = mentions.map((mention) => mention.id).join(\"|\");\n const lastEmittedState = lastEmittedStateRef.current;\n const isInternalControlledEcho =\n value === lastEmittedState.value &&\n incomingMentionIds === lastEmittedState.mentionIds;\n\n if (isInternalControlledEcho && editor.childNodes.length > 0) return;\n\n renderPartsToEditor([\n ...(value ? [{ type: \"text\" as const, text: value }] : []),\n ...mentions.map((mention) => ({ type: \"mention\" as const, mention })),\n ]);\n setHasContent(Boolean(value || mentions.length));\n\n // 外部主动写入 value/mentions 后,需要在首帧绘制前同步 DOM;若输入区已有焦点,则把光标放在内容末尾。\n const lastTextNode = Array.from(editor.childNodes)\n .reverse()\n .find((node): node is Text => node.nodeType === Node.TEXT_NODE);\n if (document.activeElement === editor && lastTextNode) {\n setCursorAtTextEnd(lastTextNode);\n }\n }, [\n defaultInputParts,\n emitChange,\n renderPartsToEditor,\n setCursorAtTextEnd,\n mentions,\n value,\n ]);\n\n useIsomorphicLayoutEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n if (skipEmptyCleanupOnceRef.current) {\n skipEmptyCleanupOnceRef.current = false;\n return;\n }\n if (!value && mentions.length === 0 && editor.childNodes.length > 0) {\n editor.querySelectorAll(`[${MENTION_ATTR}]`).forEach((node) => {\n tagRootMapRef.current.get(node)?.unmount();\n });\n editor.innerHTML = \"\";\n }\n }, [mentions.length, value]);\n\n const handleInput = () => {\n if (!composingRef.current) {\n cleanupEmptyStructuralNodes();\n cleanupCaretTextNodes();\n emitChange();\n\n // Chrome 可能在 input 回调返回后才补上用于承接光标的 <br>;下一帧再归一化一次。\n if (structuralCleanupFrameRef.current !== null) {\n window.cancelAnimationFrame(structuralCleanupFrameRef.current);\n }\n structuralCleanupFrameRef.current = window.requestAnimationFrame(() => {\n structuralCleanupFrameRef.current = null;\n cleanupEmptyStructuralNodes();\n cleanupCaretTextNodes();\n });\n }\n };\n\n const handlePaste: React.ClipboardEventHandler<HTMLDivElement> = (event) => {\n event.preventDefault();\n const editor = editorRef.current;\n if (!editor) return;\n\n // 始终按 text/plain 粘贴,避免消息气泡的背景色等 HTML 样式进入 contenteditable。\n const text = event.clipboardData.getData(\"text/plain\");\n if (!text) return;\n const parts = parseMarkdownResourceLinksAsParts(text);\n const selection = window.getSelection();\n const range =\n selection?.rangeCount && editor.contains(selection.getRangeAt(0).startContainer)\n ? selection.getRangeAt(0)\n : null;\n const fragment = document.createDocumentFragment();\n let lastTextNode: Text | null = null;\n\n for (const part of parts) {\n if (part.type === \"text\") {\n lastTextNode = createTextNode(part.text);\n fragment.append(lastTextNode);\n continue;\n }\n latestMentionsRef.current = [...latestMentionsRef.current, part.mention];\n fragment.append(buildMentionNode(part.mention));\n lastTextNode = createTextNode(CARET_TEXT);\n fragment.append(lastTextNode);\n }\n\n if (range) {\n range.deleteContents();\n range.insertNode(fragment);\n } else {\n editor.append(fragment);\n }\n cleanupCaretTextNodes();\n if (lastTextNode) setCursorAtTextEnd(lastTextNode);\n emitChange();\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (event) => {\n if (event.key === \"Backspace\" || event.key === \"Delete\") {\n const selection = window.getSelection();\n if (selection?.rangeCount) {\n const range = selection.getRangeAt(0);\n if (range.collapsed) {\n const targetMention =\n event.key === \"Backspace\"\n ? getMentionBeforeRange(range)\n : getMentionAfterRange(range);\n\n if (targetMention) {\n event.preventDefault();\n removeMentionById(targetMention.dataset.xadkInlineMentionId || \"\");\n return;\n }\n }\n }\n }\n onKeyDown?.(event);\n };\n\n // placeholder 只由受控 value/mentions 派生,避免从 contenteditable DOM 读取导致外部插入 Mention 后状态滞后一帧。\n const showPlaceholder = !hasContent;\n\n return (\n <div className={styles.inlineInputWrapper}>\n {showPlaceholder && placeholder && (\n <div className={styles.inlinePlaceholder}>{placeholder}</div>\n )}\n <div\n ref={editorRef}\n className={styles.inlineInput}\n contentEditable={!disabled}\n suppressContentEditableWarning\n role=\"textbox\"\n aria-multiline=\"true\"\n onInput={handleInput}\n onPaste={handlePaste}\n onKeyDown={handleKeyDown}\n onKeyUp={(event) => {\n cleanupEmptyStructuralNodes();\n cleanupCaretTextNodes();\n saveSelectionRange();\n onKeyUp?.(event);\n }}\n onMouseUp={saveSelectionRange}\n onFocus={saveSelectionRange}\n onCompositionStart={() => {\n composingRef.current = true;\n // 中文 IME 在 compositionend 前不会触发受控 value 更新;候选输入一出现就应隐藏 placeholder。\n setHasContent(true);\n }}\n onCompositionEnd={() => {\n composingRef.current = false;\n emitChange();\n }}\n data-cursor-offset={getOffsetInEditor()}\n />\n </div>\n );\n },\n);\n\nInlineTagInput.displayName = \"InlineTagInput\";\n\nexport default InlineTagInput;\n"],"mappings":"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"}
|