@ai-group/chat-sdk 3.7.1-alpha1 → 3.7.1-alpha10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/cjs/components/FileGallery/index.js +59 -40
- package/dist/cjs/components/FileGallery/index.js.map +2 -2
- package/dist/cjs/components/FileGallery/styles.d.ts +7 -0
- package/dist/cjs/components/FileGallery/styles.js +78 -0
- package/dist/cjs/components/FileGallery/styles.js.map +2 -2
- package/dist/cjs/components/Sources/components/CarouselCard.d.ts +12 -0
- package/dist/cjs/components/Sources/components/CarouselCard.js +130 -0
- package/dist/cjs/components/Sources/components/CarouselCard.js.map +7 -0
- package/dist/cjs/components/Sources/index.d.ts +5 -0
- package/dist/cjs/components/Sources/index.js +162 -0
- package/dist/cjs/components/Sources/index.js.map +7 -0
- package/dist/cjs/components/Sources/styles.d.ts +59 -0
- package/dist/cjs/components/Sources/styles.js +179 -0
- package/dist/cjs/components/Sources/styles.js.map +7 -0
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +19 -1
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +232 -22
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +83 -0
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.d.ts +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +75 -8
- package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/styles.js +1 -1
- package/dist/cjs/components/XAdkChatbot/styles.js.map +1 -1
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +7 -2
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +30 -12
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +3 -1
- package/dist/cjs/components/XAdkProvider/compound/Sender.js +81 -4
- package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +3 -3
- 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/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
- package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
- package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js +34 -0
- package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js.map +7 -0
- package/dist/cjs/components/XAdkProvider/context/index.d.ts +5 -4
- package/dist/cjs/components/XAdkProvider/context/index.js +3 -1
- package/dist/cjs/components/XAdkProvider/context/index.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/index.js +11 -10
- package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
- package/dist/cjs/components/XAdkSender/InlineTagInput.d.ts +12 -5
- package/dist/cjs/components/XAdkSender/InlineTagInput.js +419 -121
- package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
- package/dist/cjs/components/XAdkSender/InputTags.d.ts +2 -2
- package/dist/cjs/components/XAdkSender/InputTags.js +8 -8
- package/dist/cjs/components/XAdkSender/InputTags.js.map +2 -2
- package/dist/cjs/components/XAdkSender/index.js +173 -112
- package/dist/cjs/components/XAdkSender/index.js.map +3 -3
- package/dist/cjs/components/XAdkSender/styles.d.ts +4 -0
- package/dist/cjs/components/XAdkSender/styles.js +47 -6
- package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
- package/dist/cjs/components/XAiConversations/styles.js +11 -1
- package/dist/cjs/components/XAiConversations/styles.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 +8 -2
- package/dist/cjs/index.js +44 -7
- package/dist/cjs/index.js.map +3 -3
- package/dist/cjs/presets/base.d.ts +6 -0
- package/dist/cjs/presets/base.js +50 -0
- package/dist/cjs/presets/base.js.map +7 -0
- package/dist/cjs/presets/define.d.ts +11 -0
- package/dist/cjs/presets/define.js +58 -0
- package/dist/cjs/presets/define.js.map +7 -0
- package/dist/cjs/presets/index.d.ts +3 -0
- package/dist/cjs/presets/index.js +28 -0
- package/dist/cjs/presets/index.js.map +7 -0
- package/dist/cjs/presets/runtime.d.ts +22 -0
- package/dist/cjs/presets/runtime.js +75 -0
- package/dist/cjs/presets/runtime.js.map +7 -0
- package/dist/cjs/presets/xgroup/index.d.ts +5 -0
- package/dist/cjs/presets/xgroup/index.js +10 -0
- package/dist/cjs/presets/xgroup/index.js.map +2 -2
- package/dist/cjs/presets/xgroup/knowledgeReference.d.ts +17 -0
- package/dist/cjs/presets/xgroup/knowledgeReference.js +162 -0
- package/dist/cjs/presets/xgroup/knowledgeReference.js.map +7 -0
- package/dist/cjs/presets/xgroup/preset.d.ts +1 -13
- package/dist/cjs/presets/xgroup/preset.js +16 -37
- package/dist/cjs/presets/xgroup/preset.js.map +2 -2
- package/dist/cjs/presets/xgroup/strategies.d.ts +5 -4
- package/dist/cjs/presets/xgroup/strategies.js +11 -15
- package/dist/cjs/presets/xgroup/strategies.js.map +3 -3
- package/dist/cjs/presets/xgroup/webReference.d.ts +10 -0
- package/dist/cjs/presets/xgroup/webReference.js +85 -0
- package/dist/cjs/presets/xgroup/webReference.js.map +7 -0
- package/dist/cjs/types/ChatStrategies.d.ts +11 -2
- package/dist/cjs/types/ChatStrategies.js.map +1 -1
- package/dist/cjs/types/FileGallery.d.ts +3 -0
- package/dist/cjs/types/FileGallery.js.map +1 -1
- package/dist/cjs/types/Sources.d.ts +30 -0
- package/dist/cjs/types/Sources.js +18 -0
- package/dist/cjs/types/Sources.js.map +7 -0
- package/dist/cjs/types/XAdkChatbot.d.ts +33 -0
- package/dist/cjs/types/XAdkChatbot.js.map +1 -1
- package/dist/cjs/types/XAdkSender.d.ts +112 -21
- package/dist/cjs/types/XAdkSender.js.map +1 -1
- package/dist/cjs/types/index.d.ts +1 -0
- package/dist/cjs/types/index.js +3 -1
- package/dist/cjs/types/index.js.map +2 -2
- package/dist/cjs/utils/index.d.ts +1 -0
- package/dist/cjs/utils/index.js +3 -1
- package/dist/cjs/utils/index.js.map +2 -2
- package/dist/cjs/utils/markdownResource.d.ts +14 -0
- package/dist/cjs/utils/markdownResource.js +131 -0
- package/dist/cjs/utils/markdownResource.js.map +7 -0
- package/dist/esm/components/FileGallery/index.js +22 -16
- package/dist/esm/components/FileGallery/index.js.map +1 -1
- package/dist/esm/components/FileGallery/styles.d.ts +7 -0
- package/dist/esm/components/FileGallery/styles.js +24 -17
- package/dist/esm/components/FileGallery/styles.js.map +1 -1
- package/dist/esm/components/Sources/components/CarouselCard.d.ts +12 -0
- package/dist/esm/components/Sources/components/CarouselCard.js +107 -0
- package/dist/esm/components/Sources/components/CarouselCard.js.map +1 -0
- package/dist/esm/components/Sources/index.d.ts +5 -0
- package/dist/esm/components/Sources/index.js +127 -0
- package/dist/esm/components/Sources/index.js.map +1 -0
- package/dist/esm/components/Sources/styles.d.ts +59 -0
- package/dist/esm/components/Sources/styles.js +34 -0
- package/dist/esm/components/Sources/styles.js.map +1 -0
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +19 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +190 -11
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +5 -2
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.d.ts +2 -2
- package/dist/esm/components/XAdkChatbot/index.js +55 -10
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/styles.js +1 -1
- package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +7 -2
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +40 -17
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +3 -1
- package/dist/esm/components/XAdkProvider/compound/Sender.js +70 -6
- 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/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
- package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.js.map +1 -1
- package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
- package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js +9 -0
- package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js.map +1 -0
- package/dist/esm/components/XAdkProvider/context/index.d.ts +5 -4
- package/dist/esm/components/XAdkProvider/context/index.js +1 -0
- package/dist/esm/components/XAdkProvider/context/index.js.map +1 -1
- package/dist/esm/components/XAdkProvider/index.js +7 -3
- package/dist/esm/components/XAdkProvider/index.js.map +1 -1
- package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +12 -5
- package/dist/esm/components/XAdkSender/InlineTagInput.js +408 -111
- package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
- package/dist/esm/components/XAdkSender/InputTags.d.ts +2 -2
- package/dist/esm/components/XAdkSender/InputTags.js +10 -9
- package/dist/esm/components/XAdkSender/InputTags.js.map +1 -1
- package/dist/esm/components/XAdkSender/index.js +206 -122
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/components/XAdkSender/styles.d.ts +4 -0
- package/dist/esm/components/XAdkSender/styles.js +29 -25
- package/dist/esm/components/XAdkSender/styles.js.map +1 -1
- package/dist/esm/components/XAiConversations/styles.js +3 -3
- package/dist/esm/components/XAiConversations/styles.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 +8 -2
- package/dist/esm/index.js +7 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/presets/base.d.ts +6 -0
- package/dist/esm/presets/base.js +28 -0
- package/dist/esm/presets/base.js.map +1 -0
- package/dist/esm/presets/define.d.ts +11 -0
- package/dist/esm/presets/define.js +33 -0
- package/dist/esm/presets/define.js.map +1 -0
- package/dist/esm/presets/index.d.ts +3 -0
- package/dist/esm/presets/index.js +4 -0
- package/dist/esm/presets/index.js.map +1 -0
- package/dist/esm/presets/runtime.d.ts +22 -0
- package/dist/esm/presets/runtime.js +45 -0
- package/dist/esm/presets/runtime.js.map +1 -0
- package/dist/esm/presets/xgroup/index.d.ts +5 -0
- package/dist/esm/presets/xgroup/index.js +6 -0
- package/dist/esm/presets/xgroup/index.js.map +1 -1
- package/dist/esm/presets/xgroup/knowledgeReference.d.ts +17 -0
- package/dist/esm/presets/xgroup/knowledgeReference.js +95 -0
- package/dist/esm/presets/xgroup/knowledgeReference.js.map +1 -0
- package/dist/esm/presets/xgroup/preset.d.ts +1 -13
- package/dist/esm/presets/xgroup/preset.js +9 -29
- package/dist/esm/presets/xgroup/preset.js.map +1 -1
- package/dist/esm/presets/xgroup/strategies.d.ts +5 -4
- package/dist/esm/presets/xgroup/strategies.js +8 -20
- package/dist/esm/presets/xgroup/strategies.js.map +1 -1
- package/dist/esm/presets/xgroup/webReference.d.ts +10 -0
- package/dist/esm/presets/xgroup/webReference.js +46 -0
- package/dist/esm/presets/xgroup/webReference.js.map +1 -0
- package/dist/esm/types/ChatStrategies.d.ts +11 -2
- package/dist/esm/types/ChatStrategies.js.map +1 -1
- package/dist/esm/types/FileGallery.d.ts +3 -0
- package/dist/esm/types/FileGallery.js.map +1 -1
- package/dist/esm/types/Sources.d.ts +30 -0
- package/dist/esm/types/Sources.js +2 -0
- package/dist/esm/types/Sources.js.map +1 -0
- package/dist/esm/types/XAdkChatbot.d.ts +33 -0
- package/dist/esm/types/XAdkChatbot.js.map +1 -1
- package/dist/esm/types/XAdkSender.d.ts +112 -21
- package/dist/esm/types/XAdkSender.js.map +1 -1
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/index.js +1 -0
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/markdownResource.d.ts +14 -0
- package/dist/esm/utils/markdownResource.js +101 -0
- package/dist/esm/utils/markdownResource.js.map +1 -0
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +6 -1
|
@@ -25,10 +25,12 @@ module.exports = __toCommonJS(InlineTagInput_exports);
|
|
|
25
25
|
var import_react = require("react");
|
|
26
26
|
var import_client = require("react-dom/client");
|
|
27
27
|
var import_styles = require("./styles");
|
|
28
|
+
var import_markdownResource = require("../../utils/markdownResource");
|
|
28
29
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
29
|
-
var
|
|
30
|
+
var MENTION_ATTR = "data-xadk-inline-mention-id";
|
|
30
31
|
var CARET_TEXT = "";
|
|
31
32
|
var createTextNode = (text) => document.createTextNode(text);
|
|
33
|
+
var useIsomorphicLayoutEffect = typeof window === "undefined" ? import_react.useEffect : import_react.useLayoutEffect;
|
|
32
34
|
var normalizeText = (text) => text.replace(/\u200B/g, "").replace(/\u00a0/g, " ");
|
|
33
35
|
var getPlainLength = (text) => normalizeText(text).length;
|
|
34
36
|
var toRawOffset = (text, plainOffset) => {
|
|
@@ -44,30 +46,48 @@ var toRawOffset = (text, plainOffset) => {
|
|
|
44
46
|
var InlineTagInput = (0, import_react.forwardRef)(
|
|
45
47
|
({
|
|
46
48
|
value,
|
|
47
|
-
|
|
49
|
+
mentions,
|
|
50
|
+
defaultInputParts,
|
|
48
51
|
placeholder,
|
|
49
52
|
disabled,
|
|
50
53
|
onChange,
|
|
51
|
-
|
|
54
|
+
onMentionsChange,
|
|
52
55
|
onKeyDown,
|
|
53
56
|
onKeyUp,
|
|
54
|
-
|
|
57
|
+
renderMention
|
|
55
58
|
}, ref) => {
|
|
56
59
|
const styles = (0, import_styles.useStyles)();
|
|
57
60
|
const editorRef = (0, import_react.useRef)(null);
|
|
58
|
-
const
|
|
61
|
+
const latestMentionsRef = (0, import_react.useRef)(mentions);
|
|
59
62
|
const tagRootMapRef = (0, import_react.useRef)(/* @__PURE__ */ new WeakMap());
|
|
60
63
|
const composingRef = (0, import_react.useRef)(false);
|
|
61
64
|
const lastInsertedCaretRef = (0, import_react.useRef)(null);
|
|
65
|
+
const savedRangeRef = (0, import_react.useRef)(null);
|
|
66
|
+
const defaultInputPartsAppliedRef = (0, import_react.useRef)(false);
|
|
67
|
+
const skipEmptyCleanupOnceRef = (0, import_react.useRef)(false);
|
|
68
|
+
const structuralCleanupFrameRef = (0, import_react.useRef)(null);
|
|
69
|
+
const [hasContent, setHasContent] = (0, import_react.useState)(
|
|
70
|
+
() => Boolean(value || mentions.length)
|
|
71
|
+
);
|
|
72
|
+
const lastEmittedStateRef = (0, import_react.useRef)({
|
|
73
|
+
value,
|
|
74
|
+
mentionIds: mentions.map((mention) => mention.id).join("|")
|
|
75
|
+
});
|
|
62
76
|
(0, import_react.useEffect)(() => {
|
|
63
|
-
|
|
64
|
-
}, [
|
|
65
|
-
const
|
|
77
|
+
latestMentionsRef.current = mentions;
|
|
78
|
+
}, [mentions]);
|
|
79
|
+
const getOrderedMentions = (0, import_react.useCallback)(() => {
|
|
66
80
|
const editor = editorRef.current;
|
|
67
81
|
if (!editor)
|
|
68
82
|
return [];
|
|
69
|
-
const
|
|
70
|
-
|
|
83
|
+
const mentionMap = new Map(
|
|
84
|
+
latestMentionsRef.current.map((mention) => [mention.id, mention])
|
|
85
|
+
);
|
|
86
|
+
return Array.from(editor.querySelectorAll(`[${MENTION_ATTR}]`)).map(
|
|
87
|
+
(node) => mentionMap.get(
|
|
88
|
+
node.dataset.xadkInlineMentionId || ""
|
|
89
|
+
)
|
|
90
|
+
).filter(Boolean);
|
|
71
91
|
}, []);
|
|
72
92
|
const getPlainText = (0, import_react.useCallback)(() => {
|
|
73
93
|
const editor = editorRef.current;
|
|
@@ -81,17 +101,51 @@ var InlineTagInput = (0, import_react.forwardRef)(
|
|
|
81
101
|
});
|
|
82
102
|
return normalizeText(text);
|
|
83
103
|
}, []);
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
104
|
+
const getParts = (0, import_react.useCallback)(() => {
|
|
105
|
+
const editor = editorRef.current;
|
|
106
|
+
if (!editor)
|
|
107
|
+
return [];
|
|
108
|
+
const mentionMap = new Map(
|
|
109
|
+
latestMentionsRef.current.map((mention) => [mention.id, mention])
|
|
110
|
+
);
|
|
111
|
+
const parts = [];
|
|
112
|
+
editor.childNodes.forEach((node) => {
|
|
113
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
114
|
+
const text = normalizeText(node.textContent || "");
|
|
115
|
+
if (text)
|
|
116
|
+
parts.push({ type: "text", text });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR)) {
|
|
120
|
+
const mentionId = node.dataset.xadkInlineMentionId || "";
|
|
121
|
+
const mention = mentionMap.get(mentionId);
|
|
122
|
+
if (mention)
|
|
123
|
+
parts.push({ type: "mention", mention });
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return parts;
|
|
93
127
|
}, []);
|
|
94
|
-
const
|
|
128
|
+
const emitChange = (0, import_react.useCallback)(() => {
|
|
129
|
+
const nextValue = getPlainText();
|
|
130
|
+
const nextMentions = getOrderedMentions();
|
|
131
|
+
setHasContent(Boolean(nextValue || nextMentions.length));
|
|
132
|
+
lastEmittedStateRef.current = {
|
|
133
|
+
value: nextValue,
|
|
134
|
+
mentionIds: nextMentions.map((mention) => mention.id).join("|")
|
|
135
|
+
};
|
|
136
|
+
onChange(nextValue);
|
|
137
|
+
onMentionsChange(nextMentions);
|
|
138
|
+
}, [getOrderedMentions, getPlainText, onChange, onMentionsChange]);
|
|
139
|
+
const removeTextRange = (0, import_react.useCallback)(
|
|
140
|
+
(node, start, end) => {
|
|
141
|
+
const text = node.textContent || "";
|
|
142
|
+
node.textContent = `${text.slice(0, start)}${text.slice(end)}`;
|
|
143
|
+
if (!node.textContent)
|
|
144
|
+
node.remove();
|
|
145
|
+
},
|
|
146
|
+
[]
|
|
147
|
+
);
|
|
148
|
+
const removeMentionNode = (0, import_react.useCallback)(
|
|
95
149
|
(node) => {
|
|
96
150
|
var _a, _b, _c;
|
|
97
151
|
const previous = node.previousSibling;
|
|
@@ -110,56 +164,87 @@ var InlineTagInput = (0, import_react.forwardRef)(
|
|
|
110
164
|
const text = previous.textContent || "";
|
|
111
165
|
const spaceLength = ((_c = text.match(/\s+$/)) == null ? void 0 : _c[0].length) || 0;
|
|
112
166
|
if (spaceLength > 0) {
|
|
113
|
-
removeTextRange(
|
|
167
|
+
removeTextRange(
|
|
168
|
+
previous,
|
|
169
|
+
text.length - spaceLength,
|
|
170
|
+
text.length
|
|
171
|
+
);
|
|
114
172
|
}
|
|
115
173
|
}
|
|
116
174
|
},
|
|
117
175
|
[removeTextRange]
|
|
118
176
|
);
|
|
119
|
-
const
|
|
177
|
+
const removeMentionById = (0, import_react.useCallback)(
|
|
120
178
|
(id) => {
|
|
121
179
|
const editor = editorRef.current;
|
|
122
|
-
const node = Array.from(
|
|
123
|
-
(
|
|
180
|
+
const node = Array.from(
|
|
181
|
+
(editor == null ? void 0 : editor.querySelectorAll(`[${MENTION_ATTR}]`)) || []
|
|
182
|
+
).find(
|
|
183
|
+
(item) => item.dataset.xadkInlineMentionId === id
|
|
124
184
|
);
|
|
125
185
|
if (node) {
|
|
126
|
-
|
|
186
|
+
removeMentionNode(node);
|
|
127
187
|
}
|
|
128
188
|
emitChange();
|
|
129
189
|
editor == null ? void 0 : editor.focus();
|
|
130
190
|
},
|
|
131
|
-
[emitChange,
|
|
191
|
+
[emitChange, removeMentionNode]
|
|
132
192
|
);
|
|
133
|
-
const
|
|
134
|
-
(
|
|
193
|
+
const buildMentionNode = (0, import_react.useCallback)(
|
|
194
|
+
(mention) => {
|
|
135
195
|
const span = document.createElement("span");
|
|
136
196
|
span.setAttribute("contenteditable", "false");
|
|
137
|
-
span.setAttribute(
|
|
138
|
-
span.dataset.
|
|
197
|
+
span.setAttribute(MENTION_ATTR, mention.id);
|
|
198
|
+
span.dataset.xadkInlineMentionId = mention.id;
|
|
199
|
+
span.dataset.xadkInlineMentionType = mention.type;
|
|
139
200
|
span.className = styles.inlineTag;
|
|
140
|
-
if (
|
|
201
|
+
if (renderMention) {
|
|
141
202
|
const root = (0, import_client.createRoot)(span);
|
|
142
203
|
tagRootMapRef.current.set(span, root);
|
|
143
204
|
root.render(
|
|
144
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children:
|
|
205
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: renderMention(mention, {
|
|
206
|
+
onRemove: () => removeMentionById(mention.id)
|
|
207
|
+
}) })
|
|
145
208
|
);
|
|
146
209
|
} else {
|
|
147
210
|
const label = document.createElement("span");
|
|
148
211
|
label.className = "xadk-inline-tag-label";
|
|
149
|
-
label.textContent =
|
|
212
|
+
label.textContent = mention.displayName || mention.label;
|
|
150
213
|
const close = document.createElement("span");
|
|
151
214
|
close.className = "xadk-inline-tag-close";
|
|
152
215
|
close.innerHTML = "×";
|
|
153
216
|
close.onclick = (event) => {
|
|
154
217
|
event.preventDefault();
|
|
155
218
|
event.stopPropagation();
|
|
156
|
-
|
|
219
|
+
removeMentionById(mention.id);
|
|
157
220
|
};
|
|
158
221
|
span.append(label, close);
|
|
159
222
|
}
|
|
160
223
|
return span;
|
|
161
224
|
},
|
|
162
|
-
[
|
|
225
|
+
[removeMentionById, renderMention, styles.inlineTag]
|
|
226
|
+
);
|
|
227
|
+
const renderPartsToEditor = (0, import_react.useCallback)(
|
|
228
|
+
(parts) => {
|
|
229
|
+
const editor = editorRef.current;
|
|
230
|
+
if (!editor)
|
|
231
|
+
return;
|
|
232
|
+
editor.querySelectorAll(`[${MENTION_ATTR}]`).forEach((node) => {
|
|
233
|
+
var _a;
|
|
234
|
+
(_a = tagRootMapRef.current.get(node)) == null ? void 0 : _a.unmount();
|
|
235
|
+
});
|
|
236
|
+
editor.innerHTML = "";
|
|
237
|
+
parts.forEach((part) => {
|
|
238
|
+
if (part.type === "text") {
|
|
239
|
+
if (part.text)
|
|
240
|
+
editor.appendChild(createTextNode(part.text));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const mention = part.type === "mention" ? part.mention : part.tag;
|
|
244
|
+
editor.append(buildMentionNode(mention), createTextNode(CARET_TEXT));
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
[buildMentionNode]
|
|
163
248
|
);
|
|
164
249
|
const setCursorAtTextEnd = (0, import_react.useCallback)((node) => {
|
|
165
250
|
var _a;
|
|
@@ -169,6 +254,18 @@ var InlineTagInput = (0, import_react.forwardRef)(
|
|
|
169
254
|
range.collapse(true);
|
|
170
255
|
selection == null ? void 0 : selection.removeAllRanges();
|
|
171
256
|
selection == null ? void 0 : selection.addRange(range);
|
|
257
|
+
savedRangeRef.current = range.cloneRange();
|
|
258
|
+
}, []);
|
|
259
|
+
const saveSelectionRange = (0, import_react.useCallback)(() => {
|
|
260
|
+
const editor = editorRef.current;
|
|
261
|
+
const selection = window.getSelection();
|
|
262
|
+
if (!editor || !selection || selection.rangeCount === 0)
|
|
263
|
+
return;
|
|
264
|
+
const range = selection.getRangeAt(0);
|
|
265
|
+
if (!editor.contains(range.startContainer) || !editor.contains(range.endContainer)) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
savedRangeRef.current = range.cloneRange();
|
|
172
269
|
}, []);
|
|
173
270
|
const restoreCursorAfterInsert = (0, import_react.useCallback)(
|
|
174
271
|
(node) => {
|
|
@@ -180,46 +277,77 @@ var InlineTagInput = (0, import_react.forwardRef)(
|
|
|
180
277
|
},
|
|
181
278
|
[setCursorAtTextEnd]
|
|
182
279
|
);
|
|
183
|
-
const
|
|
280
|
+
const isMentionNode = (node) => node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR);
|
|
184
281
|
const isOnlyCaretText = (text) => normalizeText(text) === "";
|
|
185
|
-
const
|
|
282
|
+
const getMentionBeforeRange = (range) => {
|
|
186
283
|
const container = range.startContainer;
|
|
187
284
|
if (container.nodeType === Node.TEXT_NODE) {
|
|
188
285
|
const text = container.textContent || "";
|
|
189
286
|
const beforeCursor = text.slice(0, range.startOffset);
|
|
190
|
-
if (isOnlyCaretText(beforeCursor) &&
|
|
287
|
+
if (isOnlyCaretText(beforeCursor) && isMentionNode(container.previousSibling)) {
|
|
191
288
|
return container.previousSibling;
|
|
192
289
|
}
|
|
193
290
|
}
|
|
194
291
|
if (container instanceof HTMLElement) {
|
|
195
292
|
const previous = container.childNodes[range.startOffset - 1];
|
|
196
|
-
if (
|
|
293
|
+
if (isMentionNode(previous))
|
|
197
294
|
return previous;
|
|
198
|
-
if ((previous == null ? void 0 : previous.nodeType) === Node.TEXT_NODE && isOnlyCaretText(previous.textContent || "") &&
|
|
295
|
+
if ((previous == null ? void 0 : previous.nodeType) === Node.TEXT_NODE && isOnlyCaretText(previous.textContent || "") && isMentionNode(previous.previousSibling)) {
|
|
199
296
|
return previous.previousSibling;
|
|
200
297
|
}
|
|
201
298
|
}
|
|
202
299
|
return null;
|
|
203
300
|
};
|
|
204
|
-
const
|
|
301
|
+
const getMentionAfterRange = (range) => {
|
|
205
302
|
const container = range.startContainer;
|
|
206
303
|
if (container.nodeType === Node.TEXT_NODE) {
|
|
207
304
|
const text = container.textContent || "";
|
|
208
305
|
const afterCursor = text.slice(range.startOffset);
|
|
209
|
-
if (isOnlyCaretText(afterCursor) &&
|
|
306
|
+
if (isOnlyCaretText(afterCursor) && isMentionNode(container.nextSibling)) {
|
|
210
307
|
return container.nextSibling;
|
|
211
308
|
}
|
|
212
309
|
}
|
|
213
310
|
if (container instanceof HTMLElement) {
|
|
214
311
|
const next = container.childNodes[range.startOffset];
|
|
215
|
-
if (
|
|
312
|
+
if (isMentionNode(next))
|
|
216
313
|
return next;
|
|
217
|
-
if ((next == null ? void 0 : next.nodeType) === Node.TEXT_NODE && isOnlyCaretText(next.textContent || "") &&
|
|
314
|
+
if ((next == null ? void 0 : next.nodeType) === Node.TEXT_NODE && isOnlyCaretText(next.textContent || "") && isMentionNode(next.nextSibling)) {
|
|
218
315
|
return next.nextSibling;
|
|
219
316
|
}
|
|
220
317
|
}
|
|
221
318
|
return null;
|
|
222
319
|
};
|
|
320
|
+
const moveCursorAroundMention = (0, import_react.useCallback)(
|
|
321
|
+
(mention, direction) => {
|
|
322
|
+
var _a, _b;
|
|
323
|
+
const editor = editorRef.current;
|
|
324
|
+
const selection = window.getSelection();
|
|
325
|
+
if (!editor || !selection || !editor.contains(mention))
|
|
326
|
+
return;
|
|
327
|
+
const range = document.createRange();
|
|
328
|
+
if (direction === "before") {
|
|
329
|
+
const previous = mention.previousSibling;
|
|
330
|
+
if ((previous == null ? void 0 : previous.nodeType) === Node.TEXT_NODE) {
|
|
331
|
+
range.setStart(previous, ((_a = previous.textContent) == null ? void 0 : _a.length) || 0);
|
|
332
|
+
} else {
|
|
333
|
+
range.setStartBefore(mention);
|
|
334
|
+
}
|
|
335
|
+
} else {
|
|
336
|
+
const next = mention.nextSibling;
|
|
337
|
+
if ((next == null ? void 0 : next.nodeType) === Node.TEXT_NODE) {
|
|
338
|
+
const leadingCaretLength = ((_b = (next.textContent || "").match(/^\u200B+/)) == null ? void 0 : _b[0].length) || 0;
|
|
339
|
+
range.setStart(next, leadingCaretLength);
|
|
340
|
+
} else {
|
|
341
|
+
range.setStartAfter(mention);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
range.collapse(true);
|
|
345
|
+
selection.removeAllRanges();
|
|
346
|
+
selection.addRange(range);
|
|
347
|
+
savedRangeRef.current = range.cloneRange();
|
|
348
|
+
},
|
|
349
|
+
[]
|
|
350
|
+
);
|
|
223
351
|
const getOffsetInEditor = (0, import_react.useCallback)(() => {
|
|
224
352
|
const editor = editorRef.current;
|
|
225
353
|
const selection = window.getSelection();
|
|
@@ -240,7 +368,7 @@ var InlineTagInput = (0, import_react.forwardRef)(
|
|
|
240
368
|
found = true;
|
|
241
369
|
return;
|
|
242
370
|
}
|
|
243
|
-
if (node instanceof HTMLElement && node.hasAttribute(
|
|
371
|
+
if (node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR))
|
|
244
372
|
return;
|
|
245
373
|
if (node.nodeType === Node.TEXT_NODE) {
|
|
246
374
|
offset += getPlainLength(node.textContent || "");
|
|
@@ -315,31 +443,92 @@ var InlineTagInput = (0, import_react.forwardRef)(
|
|
|
315
443
|
}
|
|
316
444
|
});
|
|
317
445
|
}, []);
|
|
318
|
-
const
|
|
319
|
-
|
|
446
|
+
const cleanupEmptyStructuralNodes = (0, import_react.useCallback)(() => {
|
|
447
|
+
const editor = editorRef.current;
|
|
448
|
+
const selection = window.getSelection();
|
|
449
|
+
if (!editor)
|
|
450
|
+
return;
|
|
451
|
+
Array.from(editor.children).forEach((node) => {
|
|
452
|
+
if (node.hasAttribute(MENTION_ATTR))
|
|
453
|
+
return;
|
|
454
|
+
if (node.querySelector(`[${MENTION_ATTR}]`))
|
|
455
|
+
return;
|
|
456
|
+
if (normalizeText(node.textContent || ""))
|
|
457
|
+
return;
|
|
458
|
+
const range = (selection == null ? void 0 : selection.rangeCount) ? selection.getRangeAt(0) : null;
|
|
459
|
+
const nodeIndex = getNodeIndex(node);
|
|
460
|
+
const containsCursor = Boolean(
|
|
461
|
+
range && range.collapsed && (range.startContainer === node || node.contains(range.startContainer) || range.startContainer === editor && (range.startOffset === nodeIndex || range.startOffset === nodeIndex + 1))
|
|
462
|
+
);
|
|
463
|
+
if (containsCursor && selection) {
|
|
464
|
+
const caretNode = createTextNode(CARET_TEXT);
|
|
465
|
+
node.replaceWith(caretNode);
|
|
466
|
+
const nextRange = document.createRange();
|
|
467
|
+
nextRange.setStart(caretNode, CARET_TEXT.length);
|
|
468
|
+
nextRange.collapse(true);
|
|
469
|
+
selection.removeAllRanges();
|
|
470
|
+
selection.addRange(nextRange);
|
|
471
|
+
savedRangeRef.current = nextRange.cloneRange();
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
node.remove();
|
|
475
|
+
});
|
|
476
|
+
}, []);
|
|
477
|
+
(0, import_react.useEffect)(() => {
|
|
478
|
+
const editor = editorRef.current;
|
|
479
|
+
if (!editor)
|
|
480
|
+
return;
|
|
481
|
+
const handleNativeDelete = (event) => {
|
|
482
|
+
if (!(event instanceof InputEvent))
|
|
483
|
+
return;
|
|
484
|
+
if (!event.inputType.startsWith("delete"))
|
|
485
|
+
return;
|
|
486
|
+
if (structuralCleanupFrameRef.current !== null) {
|
|
487
|
+
window.cancelAnimationFrame(structuralCleanupFrameRef.current);
|
|
488
|
+
}
|
|
489
|
+
structuralCleanupFrameRef.current = window.requestAnimationFrame(() => {
|
|
490
|
+
structuralCleanupFrameRef.current = null;
|
|
491
|
+
cleanupEmptyStructuralNodes();
|
|
492
|
+
cleanupCaretTextNodes();
|
|
493
|
+
});
|
|
494
|
+
};
|
|
495
|
+
editor.addEventListener("input", handleNativeDelete);
|
|
496
|
+
return () => editor.removeEventListener("input", handleNativeDelete);
|
|
497
|
+
}, [cleanupCaretTextNodes, cleanupEmptyStructuralNodes]);
|
|
498
|
+
const insertMention = (0, import_react.useCallback)(
|
|
499
|
+
(mention, replace) => {
|
|
320
500
|
const editor = editorRef.current;
|
|
321
501
|
if (!editor)
|
|
322
502
|
return;
|
|
503
|
+
const selectionBeforeFocus = window.getSelection();
|
|
504
|
+
const activeRangeBeforeFocus = (selectionBeforeFocus == null ? void 0 : selectionBeforeFocus.rangeCount) && editor.contains(selectionBeforeFocus.getRangeAt(0).startContainer) ? selectionBeforeFocus.getRangeAt(0).cloneRange() : null;
|
|
505
|
+
const savedRangeBeforeFocus = savedRangeRef.current && editor.contains(savedRangeRef.current.startContainer) ? savedRangeRef.current.cloneRange() : null;
|
|
506
|
+
const rangeBeforeFocus = activeRangeBeforeFocus || savedRangeBeforeFocus;
|
|
323
507
|
editor.focus();
|
|
324
|
-
|
|
325
|
-
...
|
|
326
|
-
|
|
508
|
+
latestMentionsRef.current = [
|
|
509
|
+
...latestMentionsRef.current.filter((item) => item.id !== mention.id),
|
|
510
|
+
mention
|
|
327
511
|
];
|
|
328
512
|
let insertRange = null;
|
|
329
513
|
if (replace) {
|
|
330
514
|
insertRange = replaceTextRange(replace.start, replace.end);
|
|
331
515
|
cleanupCaretTextNodes();
|
|
332
516
|
}
|
|
333
|
-
const
|
|
517
|
+
const isSemanticallyEmpty = !getPlainText() && !editor.querySelector(`[${MENTION_ATTR}]`);
|
|
518
|
+
if (isSemanticallyEmpty) {
|
|
519
|
+
editor.innerHTML = "";
|
|
520
|
+
savedRangeRef.current = null;
|
|
521
|
+
insertRange = null;
|
|
522
|
+
}
|
|
523
|
+
const mentionNode = buildMentionNode(mention);
|
|
334
524
|
const caretNode = createTextNode(CARET_TEXT);
|
|
335
|
-
const
|
|
336
|
-
const range = insertRange || ((selection == null ? void 0 : selection.rangeCount) ? selection.getRangeAt(0) : null);
|
|
525
|
+
const range = insertRange || rangeBeforeFocus;
|
|
337
526
|
if (range && editor.contains(range.startContainer)) {
|
|
338
527
|
const fragment = document.createDocumentFragment();
|
|
339
|
-
fragment.append(
|
|
528
|
+
fragment.append(mentionNode, caretNode);
|
|
340
529
|
range.insertNode(fragment);
|
|
341
530
|
} else {
|
|
342
|
-
editor.append(
|
|
531
|
+
editor.append(mentionNode, caretNode);
|
|
343
532
|
}
|
|
344
533
|
cleanupCaretTextNodes();
|
|
345
534
|
lastInsertedCaretRef.current = caretNode;
|
|
@@ -352,78 +541,175 @@ var InlineTagInput = (0, import_react.forwardRef)(
|
|
|
352
541
|
});
|
|
353
542
|
},
|
|
354
543
|
[
|
|
355
|
-
|
|
544
|
+
buildMentionNode,
|
|
356
545
|
cleanupCaretTextNodes,
|
|
357
546
|
emitChange,
|
|
547
|
+
getPlainText,
|
|
358
548
|
replaceTextRange,
|
|
359
549
|
restoreCursorAfterInsert,
|
|
360
550
|
setCursorAtTextEnd
|
|
361
551
|
]
|
|
362
552
|
);
|
|
363
|
-
(0, import_react.useImperativeHandle)(ref, () => ({
|
|
364
|
-
focus: () => {
|
|
365
|
-
var _a;
|
|
366
|
-
return (_a = editorRef.current) == null ? void 0 : _a.focus();
|
|
367
|
-
},
|
|
368
|
-
getText: getPlainText,
|
|
369
|
-
getCursorOffset: getOffsetInEditor,
|
|
370
|
-
insertTag
|
|
371
|
-
}), [getOffsetInEditor, getPlainText, insertTag]);
|
|
372
|
-
(0, import_react.useEffect)(() => {
|
|
373
|
-
const editor = editorRef.current;
|
|
374
|
-
if (!editor || editor.childNodes.length > 0)
|
|
375
|
-
return;
|
|
376
|
-
if (value)
|
|
377
|
-
editor.appendChild(createTextNode(value));
|
|
378
|
-
tags.forEach((tag) => editor.append(buildTagNode(tag), createTextNode(CARET_TEXT)));
|
|
379
|
-
}, []);
|
|
380
553
|
(0, import_react.useEffect)(() => {
|
|
554
|
+
document.addEventListener("selectionchange", saveSelectionRange);
|
|
555
|
+
return () => {
|
|
556
|
+
document.removeEventListener("selectionchange", saveSelectionRange);
|
|
557
|
+
};
|
|
558
|
+
}, [saveSelectionRange]);
|
|
559
|
+
(0, import_react.useEffect)(
|
|
560
|
+
() => () => {
|
|
561
|
+
if (structuralCleanupFrameRef.current !== null) {
|
|
562
|
+
window.cancelAnimationFrame(structuralCleanupFrameRef.current);
|
|
563
|
+
}
|
|
564
|
+
},
|
|
565
|
+
[]
|
|
566
|
+
);
|
|
567
|
+
(0, import_react.useImperativeHandle)(
|
|
568
|
+
ref,
|
|
569
|
+
() => ({
|
|
570
|
+
focus: () => {
|
|
571
|
+
var _a;
|
|
572
|
+
return (_a = editorRef.current) == null ? void 0 : _a.focus();
|
|
573
|
+
},
|
|
574
|
+
getText: getPlainText,
|
|
575
|
+
getParts,
|
|
576
|
+
getCursorOffset: getOffsetInEditor,
|
|
577
|
+
insertMention,
|
|
578
|
+
insertTag: insertMention
|
|
579
|
+
}),
|
|
580
|
+
[getOffsetInEditor, getParts, getPlainText, insertMention]
|
|
581
|
+
);
|
|
582
|
+
useIsomorphicLayoutEffect(() => {
|
|
381
583
|
const editor = editorRef.current;
|
|
382
584
|
if (!editor)
|
|
383
585
|
return;
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
586
|
+
if (!defaultInputPartsAppliedRef.current && (defaultInputParts == null ? void 0 : defaultInputParts.length) && !value && mentions.length === 0) {
|
|
587
|
+
defaultInputPartsAppliedRef.current = true;
|
|
588
|
+
skipEmptyCleanupOnceRef.current = true;
|
|
589
|
+
renderPartsToEditor(defaultInputParts);
|
|
590
|
+
emitChange();
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
const incomingMentionIds = mentions.map((mention) => mention.id).join("|");
|
|
594
|
+
const lastEmittedState = lastEmittedStateRef.current;
|
|
595
|
+
const isInternalControlledEcho = value === lastEmittedState.value && incomingMentionIds === lastEmittedState.mentionIds;
|
|
596
|
+
if (isInternalControlledEcho && editor.childNodes.length > 0)
|
|
597
|
+
return;
|
|
598
|
+
renderPartsToEditor([
|
|
599
|
+
...value ? [{ type: "text", text: value }] : [],
|
|
600
|
+
...mentions.map((mention) => ({ type: "mention", mention }))
|
|
601
|
+
]);
|
|
602
|
+
setHasContent(Boolean(value || mentions.length));
|
|
603
|
+
const lastTextNode = Array.from(editor.childNodes).reverse().find((node) => node.nodeType === Node.TEXT_NODE);
|
|
604
|
+
if (document.activeElement === editor && lastTextNode) {
|
|
605
|
+
setCursorAtTextEnd(lastTextNode);
|
|
606
|
+
}
|
|
607
|
+
}, [
|
|
608
|
+
defaultInputParts,
|
|
609
|
+
emitChange,
|
|
610
|
+
renderPartsToEditor,
|
|
611
|
+
setCursorAtTextEnd,
|
|
612
|
+
mentions,
|
|
613
|
+
value
|
|
614
|
+
]);
|
|
615
|
+
useIsomorphicLayoutEffect(() => {
|
|
402
616
|
const editor = editorRef.current;
|
|
403
617
|
if (!editor)
|
|
404
618
|
return;
|
|
405
|
-
if (
|
|
406
|
-
|
|
619
|
+
if (skipEmptyCleanupOnceRef.current) {
|
|
620
|
+
skipEmptyCleanupOnceRef.current = false;
|
|
621
|
+
return;
|
|
622
|
+
}
|
|
623
|
+
if (!value && mentions.length === 0 && editor.childNodes.length > 0) {
|
|
624
|
+
editor.querySelectorAll(`[${MENTION_ATTR}]`).forEach((node) => {
|
|
407
625
|
var _a;
|
|
408
626
|
(_a = tagRootMapRef.current.get(node)) == null ? void 0 : _a.unmount();
|
|
409
627
|
});
|
|
410
628
|
editor.innerHTML = "";
|
|
411
629
|
}
|
|
412
|
-
}, [
|
|
630
|
+
}, [mentions.length, value]);
|
|
413
631
|
const handleInput = () => {
|
|
414
|
-
if (!composingRef.current)
|
|
632
|
+
if (!composingRef.current) {
|
|
633
|
+
cleanupEmptyStructuralNodes();
|
|
634
|
+
cleanupCaretTextNodes();
|
|
415
635
|
emitChange();
|
|
636
|
+
if (structuralCleanupFrameRef.current !== null) {
|
|
637
|
+
window.cancelAnimationFrame(structuralCleanupFrameRef.current);
|
|
638
|
+
}
|
|
639
|
+
structuralCleanupFrameRef.current = window.requestAnimationFrame(() => {
|
|
640
|
+
structuralCleanupFrameRef.current = null;
|
|
641
|
+
cleanupEmptyStructuralNodes();
|
|
642
|
+
cleanupCaretTextNodes();
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
};
|
|
646
|
+
const handlePaste = (event) => {
|
|
647
|
+
event.preventDefault();
|
|
648
|
+
const editor = editorRef.current;
|
|
649
|
+
if (!editor)
|
|
650
|
+
return;
|
|
651
|
+
const text = event.clipboardData.getData("text/plain");
|
|
652
|
+
if (!text)
|
|
653
|
+
return;
|
|
654
|
+
const parts = (0, import_markdownResource.parseMarkdownResourceLinksAsParts)(text);
|
|
655
|
+
const selection = window.getSelection();
|
|
656
|
+
const range = (selection == null ? void 0 : selection.rangeCount) && editor.contains(selection.getRangeAt(0).startContainer) ? selection.getRangeAt(0) : null;
|
|
657
|
+
const fragment = document.createDocumentFragment();
|
|
658
|
+
let lastTextNode = null;
|
|
659
|
+
for (const part of parts) {
|
|
660
|
+
if (part.type === "text") {
|
|
661
|
+
lastTextNode = createTextNode(part.text);
|
|
662
|
+
fragment.append(lastTextNode);
|
|
663
|
+
continue;
|
|
664
|
+
}
|
|
665
|
+
latestMentionsRef.current = [
|
|
666
|
+
...latestMentionsRef.current,
|
|
667
|
+
part.mention
|
|
668
|
+
];
|
|
669
|
+
fragment.append(buildMentionNode(part.mention));
|
|
670
|
+
lastTextNode = createTextNode(CARET_TEXT);
|
|
671
|
+
fragment.append(lastTextNode);
|
|
672
|
+
}
|
|
673
|
+
if (range) {
|
|
674
|
+
range.deleteContents();
|
|
675
|
+
range.insertNode(fragment);
|
|
676
|
+
} else {
|
|
677
|
+
editor.append(fragment);
|
|
678
|
+
}
|
|
679
|
+
cleanupCaretTextNodes();
|
|
680
|
+
if (lastTextNode)
|
|
681
|
+
setCursorAtTextEnd(lastTextNode);
|
|
682
|
+
emitChange();
|
|
416
683
|
};
|
|
417
684
|
const handleKeyDown = (event) => {
|
|
685
|
+
if (event.key === "ArrowLeft" || event.key === "ArrowRight") {
|
|
686
|
+
const selection = window.getSelection();
|
|
687
|
+
if (selection == null ? void 0 : selection.rangeCount) {
|
|
688
|
+
const range = selection.getRangeAt(0);
|
|
689
|
+
if (range.collapsed) {
|
|
690
|
+
const targetMention = event.key === "ArrowLeft" ? getMentionBeforeRange(range) : getMentionAfterRange(range);
|
|
691
|
+
if (targetMention) {
|
|
692
|
+
event.preventDefault();
|
|
693
|
+
moveCursorAroundMention(
|
|
694
|
+
targetMention,
|
|
695
|
+
event.key === "ArrowLeft" ? "before" : "after"
|
|
696
|
+
);
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
}
|
|
418
702
|
if (event.key === "Backspace" || event.key === "Delete") {
|
|
419
703
|
const selection = window.getSelection();
|
|
420
704
|
if (selection == null ? void 0 : selection.rangeCount) {
|
|
421
705
|
const range = selection.getRangeAt(0);
|
|
422
706
|
if (range.collapsed) {
|
|
423
|
-
const
|
|
424
|
-
if (
|
|
707
|
+
const targetMention = event.key === "Backspace" ? getMentionBeforeRange(range) : getMentionAfterRange(range);
|
|
708
|
+
if (targetMention) {
|
|
425
709
|
event.preventDefault();
|
|
426
|
-
|
|
710
|
+
removeMentionById(
|
|
711
|
+
targetMention.dataset.xadkInlineMentionId || ""
|
|
712
|
+
);
|
|
427
713
|
return;
|
|
428
714
|
}
|
|
429
715
|
}
|
|
@@ -431,29 +717,41 @@ var InlineTagInput = (0, import_react.forwardRef)(
|
|
|
431
717
|
}
|
|
432
718
|
onKeyDown == null ? void 0 : onKeyDown(event);
|
|
433
719
|
};
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
{
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
720
|
+
const showPlaceholder = !hasContent;
|
|
721
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.inlineInputWrapper, children: [
|
|
722
|
+
showPlaceholder && placeholder && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.inlinePlaceholder, children: placeholder }),
|
|
723
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
724
|
+
"div",
|
|
725
|
+
{
|
|
726
|
+
ref: editorRef,
|
|
727
|
+
className: styles.inlineInput,
|
|
728
|
+
contentEditable: !disabled,
|
|
729
|
+
suppressContentEditableWarning: true,
|
|
730
|
+
role: "textbox",
|
|
731
|
+
"aria-multiline": "true",
|
|
732
|
+
onInput: handleInput,
|
|
733
|
+
onPaste: handlePaste,
|
|
734
|
+
onKeyDown: handleKeyDown,
|
|
735
|
+
onKeyUp: (event) => {
|
|
736
|
+
cleanupEmptyStructuralNodes();
|
|
737
|
+
cleanupCaretTextNodes();
|
|
738
|
+
saveSelectionRange();
|
|
739
|
+
onKeyUp == null ? void 0 : onKeyUp(event);
|
|
740
|
+
},
|
|
741
|
+
onMouseUp: saveSelectionRange,
|
|
742
|
+
onFocus: saveSelectionRange,
|
|
743
|
+
onCompositionStart: () => {
|
|
744
|
+
composingRef.current = true;
|
|
745
|
+
setHasContent(true);
|
|
746
|
+
},
|
|
747
|
+
onCompositionEnd: () => {
|
|
748
|
+
composingRef.current = false;
|
|
749
|
+
emitChange();
|
|
750
|
+
},
|
|
751
|
+
"data-cursor-offset": getOffsetInEditor()
|
|
752
|
+
}
|
|
753
|
+
)
|
|
754
|
+
] });
|
|
457
755
|
}
|
|
458
756
|
);
|
|
459
757
|
InlineTagInput.displayName = "InlineTagInput";
|