@ai-group/chat-sdk 3.7.1-alpha9 → 3.7.3
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/styles.js +8 -1
- package/dist/cjs/components/XAdkChatbot/styles.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +17 -50
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +3 -2
- 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/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/XAdkSender/InlineTagInput.d.ts +4 -0
- package/dist/cjs/components/XAdkSender/InlineTagInput.js +28 -1
- package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
- package/dist/cjs/components/XAdkSender/{QuickList.d.ts → InputSuggestionList.d.ts} +4 -3
- package/dist/cjs/components/XAdkSender/{QuickList.js → InputSuggestionList.js} +55 -30
- package/dist/cjs/components/XAdkSender/InputSuggestionList.js.map +7 -0
- package/dist/cjs/components/XAdkSender/index.js +35 -13
- package/dist/cjs/components/XAdkSender/index.js.map +3 -3
- package/dist/cjs/components/XAdkSender/styles.js +13 -1
- package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
- package/dist/cjs/components/XAiConversations/index.js +1 -1
- package/dist/cjs/components/XAiConversations/index.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/index.d.ts +3 -3
- package/dist/cjs/index.js +5 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/presets/xgroup/index.d.ts +1 -0
- package/dist/cjs/presets/xgroup/index.js +2 -0
- package/dist/cjs/presets/xgroup/index.js.map +2 -2
- package/dist/cjs/presets/xgroup/knowledgeReference.js +3 -1
- package/dist/cjs/presets/xgroup/knowledgeReference.js.map +2 -2
- 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/XAdkSender.d.ts +4 -0
- package/dist/cjs/types/XAdkSender.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/styles.js +3 -3
- package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +16 -41
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +3 -2
- package/dist/esm/components/XAdkProvider/compound/Sender.js +70 -7
- package/dist/esm/components/XAdkProvider/compound/Sender.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/XAdkSender/InlineTagInput.d.ts +4 -0
- package/dist/esm/components/XAdkSender/InlineTagInput.js +26 -7
- package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
- package/dist/esm/components/XAdkSender/{QuickList.d.ts → InputSuggestionList.d.ts} +4 -3
- package/dist/esm/components/XAdkSender/{QuickList.js → InputSuggestionList.js} +53 -28
- package/dist/esm/components/XAdkSender/InputSuggestionList.js.map +1 -0
- package/dist/esm/components/XAdkSender/index.js +39 -18
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/components/XAdkSender/styles.js +2 -2
- package/dist/esm/components/XAdkSender/styles.js.map +1 -1
- package/dist/esm/components/XAiConversations/index.js +2 -1
- package/dist/esm/components/XAiConversations/index.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/index.d.ts +3 -3
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/presets/xgroup/index.d.ts +1 -0
- package/dist/esm/presets/xgroup/index.js +1 -0
- package/dist/esm/presets/xgroup/index.js.map +1 -1
- package/dist/esm/presets/xgroup/knowledgeReference.js +2 -1
- package/dist/esm/presets/xgroup/knowledgeReference.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/XAdkSender.d.ts +4 -0
- package/dist/esm/types/XAdkSender.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
- package/dist/cjs/components/XAdkSender/QuickList.js.map +0 -7
- package/dist/esm/components/XAdkSender/QuickList.js.map +0 -1
|
@@ -21,6 +21,7 @@ __reExport(xgroup_exports, require("../define"), module.exports);
|
|
|
21
21
|
__reExport(xgroup_exports, require("../runtime"), module.exports);
|
|
22
22
|
__reExport(xgroup_exports, require("./preset"), module.exports);
|
|
23
23
|
__reExport(xgroup_exports, require("./knowledgeReference"), module.exports);
|
|
24
|
+
__reExport(xgroup_exports, require("./webReference"), module.exports);
|
|
24
25
|
__reExport(xgroup_exports, require("./strategies"), module.exports);
|
|
25
26
|
__reExport(xgroup_exports, require("./transport"), module.exports);
|
|
26
27
|
__reExport(xgroup_exports, require("./upload"), module.exports);
|
|
@@ -31,6 +32,7 @@ __reExport(xgroup_exports, require("./upload"), module.exports);
|
|
|
31
32
|
...require("../runtime"),
|
|
32
33
|
...require("./preset"),
|
|
33
34
|
...require("./knowledgeReference"),
|
|
35
|
+
...require("./webReference"),
|
|
34
36
|
...require("./strategies"),
|
|
35
37
|
...require("./transport"),
|
|
36
38
|
...require("./upload")
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/presets/xgroup/index.ts"],
|
|
4
|
-
"sourcesContent": ["// 兼容历史从 presets/xgroup 导入的基础预设工具;新代码建议从 presets 导入。\nexport * from \"../base\";\nexport * from \"../define\";\nexport * from \"../runtime\";\nexport * from \"./preset\";\nexport * from \"./knowledgeReference\";\nexport * from \"./strategies\";\nexport * from \"./transport\";\nexport * from \"./upload\";\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;AACA,2BAAc,oBADd;AAEA,2BAAc,sBAFd;AAGA,2BAAc,uBAHd;AAIA,2BAAc,qBAJd;AAKA,2BAAc,iCALd;AAMA,2BAAc,
|
|
4
|
+
"sourcesContent": ["// 兼容历史从 presets/xgroup 导入的基础预设工具;新代码建议从 presets 导入。\nexport * from \"../base\";\nexport * from \"../define\";\nexport * from \"../runtime\";\nexport * from \"./preset\";\nexport * from \"./knowledgeReference\";\nexport * from \"./webReference\";\nexport * from \"./strategies\";\nexport * from \"./transport\";\nexport * from \"./upload\";\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;AACA,2BAAc,oBADd;AAEA,2BAAc,sBAFd;AAGA,2BAAc,uBAHd;AAIA,2BAAc,qBAJd;AAKA,2BAAc,iCALd;AAMA,2BAAc,2BANd;AAOA,2BAAc,yBAPd;AAQA,2BAAc,wBARd;AASA,2BAAc,qBATd;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -29,6 +29,7 @@ __export(knowledgeReference_exports, {
|
|
|
29
29
|
xGroupMarkdownExtensions: () => xGroupMarkdownExtensions
|
|
30
30
|
});
|
|
31
31
|
module.exports = __toCommonJS(knowledgeReference_exports);
|
|
32
|
+
var import_webReference = require("./webReference");
|
|
32
33
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
33
34
|
var XGROUP_KNOWLEDGE_NO_ATTRIBUTES = [
|
|
34
35
|
"knowledge-no",
|
|
@@ -144,7 +145,8 @@ var xGroupKnowledgeReferenceMarkdownExtension = {
|
|
|
144
145
|
render: renderStaticKnowledgeReference
|
|
145
146
|
};
|
|
146
147
|
var xGroupMarkdownExtensions = [
|
|
147
|
-
xGroupKnowledgeReferenceMarkdownExtension
|
|
148
|
+
xGroupKnowledgeReferenceMarkdownExtension,
|
|
149
|
+
import_webReference.xGroupWebReferenceMarkdownExtension
|
|
148
150
|
];
|
|
149
151
|
// Annotate the CommonJS export names for ESM import in node:
|
|
150
152
|
0 && (module.exports = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/presets/xgroup/knowledgeReference.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from \"react\";\n\nimport type { MarkdownExtension, MarkdownExtensionNode } from \"@/types\";\n\nexport interface XGroupKnowledgeReference {\n knowledgeNo: string;\n documentNo: string;\n shardingNos: string[];\n label: string;\n version?: string;\n}\n\nexport const XGROUP_KNOWLEDGE_NO_ATTRIBUTES = [\n \"knowledge-no\",\n \"knowledge-base-no\",\n \"workspace-no\",\n \"knowledgeno\",\n \"knowledgebaseno\",\n \"workspaceno\",\n] as const;\nexport const XGROUP_DOCUMENT_NO_ATTRIBUTES = [\n \"document-no\",\n \"document-id\",\n \"documentno\",\n \"documentid\",\n] as const;\nexport const XGROUP_VERSION_ATTRIBUTES = [\n \"version\",\n \"document-version\",\n \"documentversion\",\n] as const;\nexport const XGROUP_SHARDING_NO_ATTRIBUTES = [\n \"sharding-nos\",\n \"sharding-no\",\n \"shardingnos\",\n \"shardingno\",\n] as const;\n\nconst AI_KB_REF_REGEX = /<ai-kb-ref\\b([^>]*)>([\\s\\S]*?)<\\/ai-kb-ref>/gi;\nconst XML_ATTRIBUTE_REGEX = /([a-z][a-z0-9-]*)\\s*=\\s*([\"'])(.*?)\\2/gi;\n\nconst getFirstAttribute = (\n attributes: Readonly<Record<string, string>>,\n names: readonly string[],\n) => {\n for (const name of names) {\n const value = attributes[name];\n if (value?.trim()) return value.trim();\n }\n return \"\";\n};\n\nexport const parseXGroupKnowledgeReference = ({\n attributes,\n text,\n}: Pick<MarkdownExtensionNode, \"attributes\" | \"text\">): XGroupKnowledgeReference => {\n const rawShardingNos =\n getFirstAttribute(attributes, XGROUP_SHARDING_NO_ATTRIBUTES) || text;\n return {\n knowledgeNo: getFirstAttribute(attributes, XGROUP_KNOWLEDGE_NO_ATTRIBUTES),\n documentNo: getFirstAttribute(attributes, XGROUP_DOCUMENT_NO_ATTRIBUTES),\n shardingNos: rawShardingNos\n .split(/[,,\\s]+/)\n .map((item) => item.trim())\n .filter(Boolean),\n label: text,\n version:\n getFirstAttribute(attributes, XGROUP_VERSION_ATTRIBUTES) || undefined,\n };\n};\n\n/** 从已完成的 Agent 文本中提取知识库引用,不在流式渲染期间产生副作用。 */\nexport const extractXGroupKnowledgeReferences = (\n text: string,\n): XGroupKnowledgeReference[] => {\n if (!text) return [];\n const references: XGroupKnowledgeReference[] = [];\n const referenceRegex = new RegExp(\n AI_KB_REF_REGEX.source,\n AI_KB_REF_REGEX.flags,\n );\n let referenceMatch: RegExpExecArray | null;\n\n while ((referenceMatch = referenceRegex.exec(text)) !== null) {\n const attributes: Record<string, string> = {};\n const attributeRegex = new RegExp(\n XML_ATTRIBUTE_REGEX.source,\n XML_ATTRIBUTE_REGEX.flags,\n );\n let attributeMatch: RegExpExecArray | null;\n while ((attributeMatch = attributeRegex.exec(referenceMatch[1] || \"\"))) {\n attributes[(attributeMatch[1] || \"\").toLowerCase()] =\n attributeMatch[3] || \"\";\n }\n const label = (referenceMatch[2] || \"\")\n .replace(/<[^>]+>/g, \"\")\n .trim();\n references.push(\n parseXGroupKnowledgeReference({ attributes, text: label }),\n );\n }\n return references;\n};\n\nconst renderStaticKnowledgeReference = (node: MarkdownExtensionNode) => {\n const reference = parseXGroupKnowledgeReference(node);\n return (\n <span\n aria-label={`知识库引用 ${reference.label || \"引\"}`}\n data-xadk-knowledge-reference=\"true\"\n style={{\n boxSizing: \"border-box\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n margin: \"0 3px\",\n padding: \"0 5px\",\n border: \"1px solid #e4e6eb\",\n borderRadius: 9,\n background: \"#f1f2f4\",\n color: \"#8a8f99\",\n fontSize: 12,\n fontWeight: 500,\n lineHeight: \"18px\",\n verticalAlign: \"1px\",\n }}\n >\n {reference.label || \"引\"}\n </span>\n );\n};\n\nexport const xGroupKnowledgeReferenceMarkdownExtension: MarkdownExtension = {\n tagName: \"ai-kb-ref\",\n allowedAttributes: [\n ...XGROUP_KNOWLEDGE_NO_ATTRIBUTES,\n ...XGROUP_DOCUMENT_NO_ATTRIBUTES,\n ...XGROUP_VERSION_ATTRIBUTES,\n ...XGROUP_SHARDING_NO_ATTRIBUTES,\n ],\n render: renderStaticKnowledgeReference,\n};\n\nexport const xGroupMarkdownExtensions: readonly MarkdownExtension[] = [\n xGroupKnowledgeReferenceMarkdownExtension,\n];\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\n\nimport type { MarkdownExtension, MarkdownExtensionNode } from \"@/types\";\nimport { xGroupWebReferenceMarkdownExtension } from \"./webReference\";\n\nexport interface XGroupKnowledgeReference {\n knowledgeNo: string;\n documentNo: string;\n shardingNos: string[];\n label: string;\n version?: string;\n}\n\nexport const XGROUP_KNOWLEDGE_NO_ATTRIBUTES = [\n \"knowledge-no\",\n \"knowledge-base-no\",\n \"workspace-no\",\n \"knowledgeno\",\n \"knowledgebaseno\",\n \"workspaceno\",\n] as const;\nexport const XGROUP_DOCUMENT_NO_ATTRIBUTES = [\n \"document-no\",\n \"document-id\",\n \"documentno\",\n \"documentid\",\n] as const;\nexport const XGROUP_VERSION_ATTRIBUTES = [\n \"version\",\n \"document-version\",\n \"documentversion\",\n] as const;\nexport const XGROUP_SHARDING_NO_ATTRIBUTES = [\n \"sharding-nos\",\n \"sharding-no\",\n \"shardingnos\",\n \"shardingno\",\n] as const;\n\nconst AI_KB_REF_REGEX = /<ai-kb-ref\\b([^>]*)>([\\s\\S]*?)<\\/ai-kb-ref>/gi;\nconst XML_ATTRIBUTE_REGEX = /([a-z][a-z0-9-]*)\\s*=\\s*([\"'])(.*?)\\2/gi;\n\nconst getFirstAttribute = (\n attributes: Readonly<Record<string, string>>,\n names: readonly string[],\n) => {\n for (const name of names) {\n const value = attributes[name];\n if (value?.trim()) return value.trim();\n }\n return \"\";\n};\n\nexport const parseXGroupKnowledgeReference = ({\n attributes,\n text,\n}: Pick<MarkdownExtensionNode, \"attributes\" | \"text\">): XGroupKnowledgeReference => {\n const rawShardingNos =\n getFirstAttribute(attributes, XGROUP_SHARDING_NO_ATTRIBUTES) || text;\n return {\n knowledgeNo: getFirstAttribute(attributes, XGROUP_KNOWLEDGE_NO_ATTRIBUTES),\n documentNo: getFirstAttribute(attributes, XGROUP_DOCUMENT_NO_ATTRIBUTES),\n shardingNos: rawShardingNos\n .split(/[,,\\s]+/)\n .map((item) => item.trim())\n .filter(Boolean),\n label: text,\n version:\n getFirstAttribute(attributes, XGROUP_VERSION_ATTRIBUTES) || undefined,\n };\n};\n\n/** 从已完成的 Agent 文本中提取知识库引用,不在流式渲染期间产生副作用。 */\nexport const extractXGroupKnowledgeReferences = (\n text: string,\n): XGroupKnowledgeReference[] => {\n if (!text) return [];\n const references: XGroupKnowledgeReference[] = [];\n const referenceRegex = new RegExp(\n AI_KB_REF_REGEX.source,\n AI_KB_REF_REGEX.flags,\n );\n let referenceMatch: RegExpExecArray | null;\n\n while ((referenceMatch = referenceRegex.exec(text)) !== null) {\n const attributes: Record<string, string> = {};\n const attributeRegex = new RegExp(\n XML_ATTRIBUTE_REGEX.source,\n XML_ATTRIBUTE_REGEX.flags,\n );\n let attributeMatch: RegExpExecArray | null;\n while ((attributeMatch = attributeRegex.exec(referenceMatch[1] || \"\"))) {\n attributes[(attributeMatch[1] || \"\").toLowerCase()] =\n attributeMatch[3] || \"\";\n }\n const label = (referenceMatch[2] || \"\")\n .replace(/<[^>]+>/g, \"\")\n .trim();\n references.push(\n parseXGroupKnowledgeReference({ attributes, text: label }),\n );\n }\n return references;\n};\n\nconst renderStaticKnowledgeReference = (node: MarkdownExtensionNode) => {\n const reference = parseXGroupKnowledgeReference(node);\n return (\n <span\n aria-label={`知识库引用 ${reference.label || \"引\"}`}\n data-xadk-knowledge-reference=\"true\"\n style={{\n boxSizing: \"border-box\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n margin: \"0 3px\",\n padding: \"0 5px\",\n border: \"1px solid #e4e6eb\",\n borderRadius: 9,\n background: \"#f1f2f4\",\n color: \"#8a8f99\",\n fontSize: 12,\n fontWeight: 500,\n lineHeight: \"18px\",\n verticalAlign: \"1px\",\n }}\n >\n {reference.label || \"引\"}\n </span>\n );\n};\n\nexport const xGroupKnowledgeReferenceMarkdownExtension: MarkdownExtension = {\n tagName: \"ai-kb-ref\",\n allowedAttributes: [\n ...XGROUP_KNOWLEDGE_NO_ATTRIBUTES,\n ...XGROUP_DOCUMENT_NO_ATTRIBUTES,\n ...XGROUP_VERSION_ATTRIBUTES,\n ...XGROUP_SHARDING_NO_ATTRIBUTES,\n ],\n render: renderStaticKnowledgeReference,\n};\n\nexport const xGroupMarkdownExtensions: readonly MarkdownExtension[] = [\n xGroupKnowledgeReferenceMarkdownExtension,\n xGroupWebReferenceMarkdownExtension,\n];\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MarkdownExtension, MarkdownExtensionNode } from "../../types";
|
|
2
|
+
export interface XGroupWebReference {
|
|
3
|
+
url: string;
|
|
4
|
+
title: string;
|
|
5
|
+
snippet: string;
|
|
6
|
+
label: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const XGROUP_WEB_REFERENCE_ATTRIBUTES: readonly ["url", "title", "snippet"];
|
|
9
|
+
export declare const parseXGroupWebReference: ({ attributes, text, }: Pick<MarkdownExtensionNode, "attributes" | "text">) => XGroupWebReference;
|
|
10
|
+
export declare const xGroupWebReferenceMarkdownExtension: MarkdownExtension;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/presets/xgroup/webReference.tsx
|
|
20
|
+
var webReference_exports = {};
|
|
21
|
+
__export(webReference_exports, {
|
|
22
|
+
XGROUP_WEB_REFERENCE_ATTRIBUTES: () => XGROUP_WEB_REFERENCE_ATTRIBUTES,
|
|
23
|
+
parseXGroupWebReference: () => parseXGroupWebReference,
|
|
24
|
+
xGroupWebReferenceMarkdownExtension: () => xGroupWebReferenceMarkdownExtension
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(webReference_exports);
|
|
27
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
28
|
+
var XGROUP_WEB_REFERENCE_ATTRIBUTES = [
|
|
29
|
+
"url",
|
|
30
|
+
"title",
|
|
31
|
+
"snippet"
|
|
32
|
+
];
|
|
33
|
+
var parseXGroupWebReference = ({
|
|
34
|
+
attributes,
|
|
35
|
+
text
|
|
36
|
+
}) => {
|
|
37
|
+
var _a, _b, _c;
|
|
38
|
+
return {
|
|
39
|
+
url: ((_a = attributes.url) == null ? void 0 : _a.trim()) || "",
|
|
40
|
+
title: ((_b = attributes.title) == null ? void 0 : _b.trim()) || "",
|
|
41
|
+
snippet: ((_c = attributes.snippet) == null ? void 0 : _c.trim()) || "",
|
|
42
|
+
label: text.trim()
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
var renderStaticWebReference = (node) => {
|
|
46
|
+
const reference = parseXGroupWebReference(node);
|
|
47
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
48
|
+
"span",
|
|
49
|
+
{
|
|
50
|
+
"aria-label": `外部搜索引用 ${reference.label || "引"}`,
|
|
51
|
+
"data-xadk-web-reference": "true",
|
|
52
|
+
style: {
|
|
53
|
+
boxSizing: "border-box",
|
|
54
|
+
display: "inline-flex",
|
|
55
|
+
alignItems: "center",
|
|
56
|
+
justifyContent: "center",
|
|
57
|
+
minWidth: 18,
|
|
58
|
+
height: 18,
|
|
59
|
+
margin: "0 3px",
|
|
60
|
+
padding: "0 5px",
|
|
61
|
+
border: "1px solid #e4e6eb",
|
|
62
|
+
borderRadius: 9,
|
|
63
|
+
background: "#f1f2f4",
|
|
64
|
+
color: "#8a8f99",
|
|
65
|
+
fontSize: 12,
|
|
66
|
+
fontWeight: 500,
|
|
67
|
+
lineHeight: "18px",
|
|
68
|
+
verticalAlign: "1px"
|
|
69
|
+
},
|
|
70
|
+
children: reference.label || "引"
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
};
|
|
74
|
+
var xGroupWebReferenceMarkdownExtension = {
|
|
75
|
+
tagName: "ai-web-ref",
|
|
76
|
+
allowedAttributes: XGROUP_WEB_REFERENCE_ATTRIBUTES,
|
|
77
|
+
render: renderStaticWebReference
|
|
78
|
+
};
|
|
79
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
80
|
+
0 && (module.exports = {
|
|
81
|
+
XGROUP_WEB_REFERENCE_ATTRIBUTES,
|
|
82
|
+
parseXGroupWebReference,
|
|
83
|
+
xGroupWebReferenceMarkdownExtension
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=webReference.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/presets/xgroup/webReference.tsx"],
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\n\nimport type { MarkdownExtension, MarkdownExtensionNode } from \"@/types\";\n\nexport interface XGroupWebReference {\n url: string;\n title: string;\n snippet: string;\n label: string;\n}\n\nexport const XGROUP_WEB_REFERENCE_ATTRIBUTES = [\n \"url\",\n \"title\",\n \"snippet\",\n] as const;\n\nexport const parseXGroupWebReference = ({\n attributes,\n text,\n}: Pick<MarkdownExtensionNode, \"attributes\" | \"text\">): XGroupWebReference => ({\n url: attributes.url?.trim() || \"\",\n title: attributes.title?.trim() || \"\",\n snippet: attributes.snippet?.trim() || \"\",\n label: text.trim(),\n});\n\nconst renderStaticWebReference = (node: MarkdownExtensionNode) => {\n const reference = parseXGroupWebReference(node);\n return (\n <span\n aria-label={`外部搜索引用 ${reference.label || \"引\"}`}\n data-xadk-web-reference=\"true\"\n style={{\n boxSizing: \"border-box\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n margin: \"0 3px\",\n padding: \"0 5px\",\n border: \"1px solid #e4e6eb\",\n borderRadius: 9,\n background: \"#f1f2f4\",\n color: \"#8a8f99\",\n fontSize: 12,\n fontWeight: 500,\n lineHeight: \"18px\",\n verticalAlign: \"1px\",\n }}\n >\n {reference.label || \"引\"}\n </span>\n );\n};\n\nexport const xGroupWebReferenceMarkdownExtension: MarkdownExtension = {\n tagName: \"ai-web-ref\",\n allowedAttributes: XGROUP_WEB_REFERENCE_ATTRIBUTES,\n render: renderStaticWebReference,\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BI;AAnBG,IAAM,kCAAkC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AACF,MAA2E;AApB3E;AAoB+E;AAAA,IAC7E,OAAK,gBAAW,QAAX,mBAAgB,WAAU;AAAA,IAC/B,SAAO,gBAAW,UAAX,mBAAkB,WAAU;AAAA,IACnC,WAAS,gBAAW,YAAX,mBAAoB,WAAU;AAAA,IACvC,OAAO,KAAK,KAAK;AAAA,EACnB;AAAA;AAEA,IAAM,2BAA2B,CAAC,SAAgC;AAChE,QAAM,YAAY,wBAAwB,IAAI;AAC9C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,UAAU,UAAU,SAAS;AAAA,MACzC,2BAAwB;AAAA,MACxB,OAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA,MAEC,oBAAU,SAAS;AAAA;AAAA,EACtB;AAEJ;AAEO,IAAM,sCAAyD;AAAA,EACpE,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,QAAQ;AACV;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -5,6 +5,10 @@ export interface QuickListOption {
|
|
|
5
5
|
label: string;
|
|
6
6
|
description?: string;
|
|
7
7
|
icon?: React.ReactNode;
|
|
8
|
+
/** 选中后的行为。insert 会写入 Mention;command 仅执行回调。默认 insert。 */
|
|
9
|
+
action?: "insert" | "command";
|
|
10
|
+
/** 选中当前选项时执行,可用于 command 类型的业务动作。 */
|
|
11
|
+
onSelect?: (option: QuickListOption) => void;
|
|
8
12
|
/** 分组名(用于聚合列表,子分组通过下划线分割) */
|
|
9
13
|
group?: string;
|
|
10
14
|
[key: string]: any;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/types/XAdkSender.ts"],
|
|
4
|
-
"sourcesContent": ["// types/XAdkSender.ts\nimport React from \"react\";\n\n// ===================== 快捷键/Mention 相关类型 =====================\n\n/** 快捷键触发的列表项 */\nexport interface QuickListOption {\n id: string;\n label: string;\n description?: string;\n icon?: React.ReactNode;\n /** 分组名(用于聚合列表,子分组通过下划线分割) */\n group?: string;\n [key: string]: any;\n}\n\n/** 快捷键配置 */\nexport interface QuickKeyConfig {\n /** 触发字符,如 '@', '#', '$' */\n key: string;\n /** 选中后写入 MentionTag.type 的语义类型,不传时回退为 key */\n mentionType?: string;\n /** @deprecated 请使用 mentionType。 */\n tagType?: string;\n /** 列表标题 */\n title?: string;\n /** 列表数据 */\n options: QuickListOption[];\n /** 自定义列表项渲染 */\n renderItem?: (option: QuickListOption) => React.ReactNode;\n /** 选中回调 */\n onSelect?: (option: QuickListOption) => void;\n}\n\n/** 输入框内的资源引用。SDK 只理解通用 Mention,业务语义可放入 data 或可选语义字段。 */\nexport interface MentionTag {\n id: string;\n label: string;\n /** Mention 类型,如 'knowledge', 'skill', 'plugin', 'agent' */\n type: string;\n /** 资源 URI,如 skill://skillNo、kb://kb/knNo/dir/docs/2024 */\n uri?: string;\n /** 业务资源 ID,如 skillNo、knowledgeNo */\n targetId?: string;\n /** 展示名;不传时回退 label */\n displayName?: string;\n /** 提交为纯文本/Markdown/XML 时使用的业务值,不传时回退 uri/targetId/label */\n value?: string;\n /** 触发字符,如 '@', '#', '$',用于业务方区分来源 */\n trigger?: string;\n color?: string;\n icon?: React.ReactNode;\n /** 业务扩展上下文,例如知识库目录 scope */\n scope?: any;\n /** 原始数据 */\n data?: any;\n}\n\n/** @deprecated 请使用 MentionTag。 */\nexport type InputTag = MentionTag;\n\nexport interface InlineTagRenderInfo {\n onRemove: () => void;\n}\n\nexport type XAdkSenderSubmitFormat = \"text\" | \"structured\" | \"markdown\" | \"xml\";\n\nexport type XAdkSenderSubmitPart =\n | { type: \"text\"; text: string }\n | { type: \"mention\"; mention: MentionTag };\n\n/** @deprecated 旧 tag part,仅用于兼容 defaultInputParts 历史传入。 */\nexport type XAdkSenderLegacyTagPart = { type: \"tag\"; tag: MentionTag };\n\n/** 输入框文本/Mention 有序片段,表示用户正在编辑的输入内容 */\nexport type XAdkSenderInputPart =\n | XAdkSenderSubmitPart\n | XAdkSenderLegacyTagPart;\n\nexport interface XAdkSenderFormatMentionContext {\n format: Exclude<XAdkSenderSubmitFormat, \"structured\">;\n index: number;\n}\n\n/** @deprecated 请使用 XAdkSenderFormatMentionContext。 */\nexport type XAdkSenderFormatTagContext = XAdkSenderFormatMentionContext;\n\nexport interface XAdkSenderSubmitData<TPayload = unknown> {\n /** 根据 submitFormat 生成的最终内容,默认是纯文本 */\n text: string;\n /** 去掉标签后的用户原始输入文本 */\n rawText: string;\n /** 当前提交格式 */\n format: XAdkSenderSubmitFormat;\n /** 文本与 Mention 的有序片段,inlineTags 模式下可还原资源引用在输入框中的位置 */\n parts: XAdkSenderSubmitPart[];\n files: ServerFile[];\n /** 当前 Mention 列表 */\n mentions?: MentionTag[];\n /** @deprecated 请使用 mentions。 */\n tags?: MentionTag[];\n /** 业务方通过 transformSubmitData 派生出的自定义提交结构 */\n payload?: TPayload;\n}\n\n// ===================== 上传相关类型 =====================\n\nexport interface UploadFileResult {\n fileName?: string;\n fileId?: string | number;\n tempUrl?: string;\n url?: string;\n fileUrl?: string;\n fileType?: string;\n fileSize?: number;\n mimeType?: string;\n [key: string]: any;\n}\n\nexport interface UploadSuccessResponse {\n data?: UploadFileResult | UploadFileResult[];\n [key: string]: any;\n}\n\ninterface uploadRequestProps {\n (options: {\n file: File;\n onProgress?: (e: { percent: number }) => void;\n onSuccess?: (\n response: UploadFileResult | UploadFileResult[] | UploadSuccessResponse,\n ) => void;\n onError?: (error: Error) => void;\n }): Promise<void> | void;\n}\n\nexport type UploadRequestFn = uploadRequestProps;\n\nexport interface ServerFile {\n fileName: string;\n fileId: string | number;\n tempUrl: string;\n type: string;\n size?: number;\n mimeType: string;\n raw?: UploadFileResult;\n}\n\nexport interface LocalFile {\n id: string;\n uid: string;\n name: string;\n file: File;\n size: number;\n type: string;\n progress: number;\n status: \"pending\" | \"uploading\" | \"success\" | \"error\";\n // 服务器返回字段\n fileId?: string | number;\n tempUrl?: string;\n response?: any;\n errorMessage?: string; // 上传错误信息\n}\n\nexport type FileValidator = (\n file: File,\n context: { files: LocalFile[] },\n) => string | null;\n\nexport interface ActionsComponents {\n SendButton: React.ComponentType<any>;\n ClearButton: React.ComponentType<any>;\n}\n\nexport type SlotRenderFunction = (\n oriNode: React.ReactNode,\n info: { components: ActionsComponents },\n) => React.ReactNode | false;\n\n// 上传相关\nexport interface UploaderCoreProps {\n uploadRequest?: uploadRequestProps;\n\n maxFileSize?: number;\n allowedFileTypes?: string[];\n maxFiles?: number;\n\n validators?: FileValidator[];\n\n // 数据层回调\n onFilesChange?: (files: LocalFile[]) => void;\n onUploadSuccess?: (file: LocalFile) => void;\n onUploadError?: (file: LocalFile, error: Error) => void;\n}\n\n// UI 相关\nexport interface SenderUIProps {\n clearBtnShow?: boolean;\n /**\n * 是否启用 Sender 自身的拖拽上传。\n * 拖拽产生的文件通过 onFileSelect 回调交给业务/外层处理;\n * 默认 false,由外层(如 DefaultLayout)管理拖拽时无需开启。\n */\n draggable?: boolean;\n /**\n * 拖拽文件回调:当 draggable 为 true 且用户向输入区拖拽文件时触发。\n * 业务/外层在此回调中决定如何处理文件(通常调用 senderRef.addFiles 注入)。\n */\n onFileSelect?: (files: File[]) => void;\n loading?: boolean;\n disabled?: boolean; // 只读状态\n placeholder?: string;\n /** 受控:输入框的值 */\n value?: string;\n /** 非受控:输入框默认值 */\n defaultValue?: string;\n onClear?: () => void;\n onChange?: (value: string) => void;\n onSubmit?: (data: XAdkSenderSubmitData) => void;\n onStop?: () => void;\n\n /** 自定义发送按钮渲染 */\n sendButtonRender?: (info: {\n loading: boolean;\n disabled: boolean;\n /** 当前是否可以发送(文本非空或有已上传的文件) */\n canSend: boolean;\n onSend: () => void;\n onStop?: () => void;\n }) => React.ReactNode;\n\n // UI插槽功能\n /** 后缀内容,默认展示操作按钮,设为 false 时不显示 */\n suffix?: React.ReactNode | false | SlotRenderFunction;\n /** 输入主体内部的头部内容 */\n header?: React.ReactNode | false | SlotRenderFunction;\n /** 前缀内容 */\n prefix?: React.ReactNode | false | SlotRenderFunction;\n /** 底部内容 */\n footer?: React.ReactNode | false | SlotRenderFunction;\n /** 底部左侧拓展区域,不传时 footer 保持原有居中布局 */\n footerLeft?: React.ReactNode | false | SlotRenderFunction;\n\n // 快捷键/Mention 功能\n /** 快捷键配置列表 */\n quickKeys?: QuickKeyConfig[];\n /** 是否把 Mention 以内联 token 形式展示在输入区内;默认 false 保持历史 textarea 行为 */\n inlineTags?: boolean;\n /** 自定义内联 Mention 渲染 */\n renderMention?: (\n mention: MentionTag,\n info: InlineTagRenderInfo,\n ) => React.ReactNode;\n /** @deprecated 请使用 renderMention。 */\n renderTag?: (\n mention: MentionTag,\n info: InlineTagRenderInfo,\n ) => React.ReactNode;\n /** 受控:Mention 列表 */\n mentions?: MentionTag[];\n /** @deprecated 请使用 mentions。 */\n tags?: MentionTag[];\n /** 非受控:默认 Mention 列表 */\n defaultMentions?: MentionTag[];\n /** @deprecated 请使用 defaultMentions。 */\n defaultTags?: MentionTag[];\n /** 非受控:默认输入内容片段,用于初始化内联 Mention 输入区 */\n defaultInputParts?: XAdkSenderInputPart[];\n /** Mention 变化回调 */\n onMentionsChange?: (mentions: MentionTag[]) => void;\n /** @deprecated 请使用 onMentionsChange。 */\n onTagsChange?: (mentions: MentionTag[]) => void;\n /** 快捷键触发回调(业务方可在此处理搜索等逻辑) */\n onQuickKeyTrigger?: (key: string, keyword: string) => void;\n /**\n * 提交内容格式:\n * - text: 默认,输出文字 + Mention 文本(如 @生图技能)\n * - structured: 保留 parts/mentions/files 结构化数据,text 为 rawText\n * - markdown/xml: 输出对应标记文本\n */\n submitFormat?: XAdkSenderSubmitFormat;\n /** 自定义 Mention 在 text/markdown/xml 格式中的序列化结果 */\n formatMention?: (\n mention: MentionTag,\n context: XAdkSenderFormatMentionContext,\n ) => string;\n /** @deprecated 请使用 formatMention。 */\n formatTag?: (\n mention: MentionTag,\n context: XAdkSenderFormatMentionContext,\n ) => string;\n /**\n * 基于 SDK 标准提交结构派生业务 payload。\n * SDK 不理解 knowledge/skill/agent 等业务字段,只负责把 payload 原样放入 onSubmit 数据中。\n */\n transformSubmitData?: (\n data: Omit<XAdkSenderSubmitData, \"payload\">,\n ) => unknown;\n}\n\nexport type XAdkSenderProps = SenderUIProps & UploaderCoreProps;\n\nexport interface XAdkSenderHandle {\n addFiles: (files: File[]) => void;\n /** 向当前光标位置插入一个内联 Mention;未启用 inlineTags 时会退化为追加 Mention。 */\n insertMention: (mention: MentionTag) => void;\n /** @deprecated 请使用 insertMention。 */\n insertTag: (mention: MentionTag) => void;\n /** 聚焦输入区 */\n focus: () => void;\n}\n"],
|
|
4
|
+
"sourcesContent": ["// types/XAdkSender.ts\nimport React from \"react\";\n\n// ===================== 快捷键/Mention 相关类型 =====================\n\n/** 快捷键触发的列表项 */\nexport interface QuickListOption {\n id: string;\n label: string;\n description?: string;\n icon?: React.ReactNode;\n /** 选中后的行为。insert 会写入 Mention;command 仅执行回调。默认 insert。 */\n action?: \"insert\" | \"command\";\n /** 选中当前选项时执行,可用于 command 类型的业务动作。 */\n onSelect?: (option: QuickListOption) => void;\n /** 分组名(用于聚合列表,子分组通过下划线分割) */\n group?: string;\n [key: string]: any;\n}\n\n/** 快捷键配置 */\nexport interface QuickKeyConfig {\n /** 触发字符,如 '@', '#', '$' */\n key: string;\n /** 选中后写入 MentionTag.type 的语义类型,不传时回退为 key */\n mentionType?: string;\n /** @deprecated 请使用 mentionType。 */\n tagType?: string;\n /** 列表标题 */\n title?: string;\n /** 列表数据 */\n options: QuickListOption[];\n /** 自定义列表项渲染 */\n renderItem?: (option: QuickListOption) => React.ReactNode;\n /** 选中回调 */\n onSelect?: (option: QuickListOption) => void;\n}\n\n/** 输入框内的资源引用。SDK 只理解通用 Mention,业务语义可放入 data 或可选语义字段。 */\nexport interface MentionTag {\n id: string;\n label: string;\n /** Mention 类型,如 'knowledge', 'skill', 'plugin', 'agent' */\n type: string;\n /** 资源 URI,如 skill://skillNo、kb://kb/knNo/dir/docs/2024 */\n uri?: string;\n /** 业务资源 ID,如 skillNo、knowledgeNo */\n targetId?: string;\n /** 展示名;不传时回退 label */\n displayName?: string;\n /** 提交为纯文本/Markdown/XML 时使用的业务值,不传时回退 uri/targetId/label */\n value?: string;\n /** 触发字符,如 '@', '#', '$',用于业务方区分来源 */\n trigger?: string;\n color?: string;\n icon?: React.ReactNode;\n /** 业务扩展上下文,例如知识库目录 scope */\n scope?: any;\n /** 原始数据 */\n data?: any;\n}\n\n/** @deprecated 请使用 MentionTag。 */\nexport type InputTag = MentionTag;\n\nexport interface InlineTagRenderInfo {\n onRemove: () => void;\n}\n\nexport type XAdkSenderSubmitFormat = \"text\" | \"structured\" | \"markdown\" | \"xml\";\n\nexport type XAdkSenderSubmitPart =\n | { type: \"text\"; text: string }\n | { type: \"mention\"; mention: MentionTag };\n\n/** @deprecated 旧 tag part,仅用于兼容 defaultInputParts 历史传入。 */\nexport type XAdkSenderLegacyTagPart = { type: \"tag\"; tag: MentionTag };\n\n/** 输入框文本/Mention 有序片段,表示用户正在编辑的输入内容 */\nexport type XAdkSenderInputPart =\n | XAdkSenderSubmitPart\n | XAdkSenderLegacyTagPart;\n\nexport interface XAdkSenderFormatMentionContext {\n format: Exclude<XAdkSenderSubmitFormat, \"structured\">;\n index: number;\n}\n\n/** @deprecated 请使用 XAdkSenderFormatMentionContext。 */\nexport type XAdkSenderFormatTagContext = XAdkSenderFormatMentionContext;\n\nexport interface XAdkSenderSubmitData<TPayload = unknown> {\n /** 根据 submitFormat 生成的最终内容,默认是纯文本 */\n text: string;\n /** 去掉标签后的用户原始输入文本 */\n rawText: string;\n /** 当前提交格式 */\n format: XAdkSenderSubmitFormat;\n /** 文本与 Mention 的有序片段,inlineTags 模式下可还原资源引用在输入框中的位置 */\n parts: XAdkSenderSubmitPart[];\n files: ServerFile[];\n /** 当前 Mention 列表 */\n mentions?: MentionTag[];\n /** @deprecated 请使用 mentions。 */\n tags?: MentionTag[];\n /** 业务方通过 transformSubmitData 派生出的自定义提交结构 */\n payload?: TPayload;\n}\n\n// ===================== 上传相关类型 =====================\n\nexport interface UploadFileResult {\n fileName?: string;\n fileId?: string | number;\n tempUrl?: string;\n url?: string;\n fileUrl?: string;\n fileType?: string;\n fileSize?: number;\n mimeType?: string;\n [key: string]: any;\n}\n\nexport interface UploadSuccessResponse {\n data?: UploadFileResult | UploadFileResult[];\n [key: string]: any;\n}\n\ninterface uploadRequestProps {\n (options: {\n file: File;\n onProgress?: (e: { percent: number }) => void;\n onSuccess?: (\n response: UploadFileResult | UploadFileResult[] | UploadSuccessResponse,\n ) => void;\n onError?: (error: Error) => void;\n }): Promise<void> | void;\n}\n\nexport type UploadRequestFn = uploadRequestProps;\n\nexport interface ServerFile {\n fileName: string;\n fileId: string | number;\n tempUrl: string;\n type: string;\n size?: number;\n mimeType: string;\n raw?: UploadFileResult;\n}\n\nexport interface LocalFile {\n id: string;\n uid: string;\n name: string;\n file: File;\n size: number;\n type: string;\n progress: number;\n status: \"pending\" | \"uploading\" | \"success\" | \"error\";\n // 服务器返回字段\n fileId?: string | number;\n tempUrl?: string;\n response?: any;\n errorMessage?: string; // 上传错误信息\n}\n\nexport type FileValidator = (\n file: File,\n context: { files: LocalFile[] },\n) => string | null;\n\nexport interface ActionsComponents {\n SendButton: React.ComponentType<any>;\n ClearButton: React.ComponentType<any>;\n}\n\nexport type SlotRenderFunction = (\n oriNode: React.ReactNode,\n info: { components: ActionsComponents },\n) => React.ReactNode | false;\n\n// 上传相关\nexport interface UploaderCoreProps {\n uploadRequest?: uploadRequestProps;\n\n maxFileSize?: number;\n allowedFileTypes?: string[];\n maxFiles?: number;\n\n validators?: FileValidator[];\n\n // 数据层回调\n onFilesChange?: (files: LocalFile[]) => void;\n onUploadSuccess?: (file: LocalFile) => void;\n onUploadError?: (file: LocalFile, error: Error) => void;\n}\n\n// UI 相关\nexport interface SenderUIProps {\n clearBtnShow?: boolean;\n /**\n * 是否启用 Sender 自身的拖拽上传。\n * 拖拽产生的文件通过 onFileSelect 回调交给业务/外层处理;\n * 默认 false,由外层(如 DefaultLayout)管理拖拽时无需开启。\n */\n draggable?: boolean;\n /**\n * 拖拽文件回调:当 draggable 为 true 且用户向输入区拖拽文件时触发。\n * 业务/外层在此回调中决定如何处理文件(通常调用 senderRef.addFiles 注入)。\n */\n onFileSelect?: (files: File[]) => void;\n loading?: boolean;\n disabled?: boolean; // 只读状态\n placeholder?: string;\n /** 受控:输入框的值 */\n value?: string;\n /** 非受控:输入框默认值 */\n defaultValue?: string;\n onClear?: () => void;\n onChange?: (value: string) => void;\n onSubmit?: (data: XAdkSenderSubmitData) => void;\n onStop?: () => void;\n\n /** 自定义发送按钮渲染 */\n sendButtonRender?: (info: {\n loading: boolean;\n disabled: boolean;\n /** 当前是否可以发送(文本非空或有已上传的文件) */\n canSend: boolean;\n onSend: () => void;\n onStop?: () => void;\n }) => React.ReactNode;\n\n // UI插槽功能\n /** 后缀内容,默认展示操作按钮,设为 false 时不显示 */\n suffix?: React.ReactNode | false | SlotRenderFunction;\n /** 输入主体内部的头部内容 */\n header?: React.ReactNode | false | SlotRenderFunction;\n /** 前缀内容 */\n prefix?: React.ReactNode | false | SlotRenderFunction;\n /** 底部内容 */\n footer?: React.ReactNode | false | SlotRenderFunction;\n /** 底部左侧拓展区域,不传时 footer 保持原有居中布局 */\n footerLeft?: React.ReactNode | false | SlotRenderFunction;\n\n // 快捷键/Mention 功能\n /** 快捷键配置列表 */\n quickKeys?: QuickKeyConfig[];\n /** 是否把 Mention 以内联 token 形式展示在输入区内;默认 false 保持历史 textarea 行为 */\n inlineTags?: boolean;\n /** 自定义内联 Mention 渲染 */\n renderMention?: (\n mention: MentionTag,\n info: InlineTagRenderInfo,\n ) => React.ReactNode;\n /** @deprecated 请使用 renderMention。 */\n renderTag?: (\n mention: MentionTag,\n info: InlineTagRenderInfo,\n ) => React.ReactNode;\n /** 受控:Mention 列表 */\n mentions?: MentionTag[];\n /** @deprecated 请使用 mentions。 */\n tags?: MentionTag[];\n /** 非受控:默认 Mention 列表 */\n defaultMentions?: MentionTag[];\n /** @deprecated 请使用 defaultMentions。 */\n defaultTags?: MentionTag[];\n /** 非受控:默认输入内容片段,用于初始化内联 Mention 输入区 */\n defaultInputParts?: XAdkSenderInputPart[];\n /** Mention 变化回调 */\n onMentionsChange?: (mentions: MentionTag[]) => void;\n /** @deprecated 请使用 onMentionsChange。 */\n onTagsChange?: (mentions: MentionTag[]) => void;\n /** 快捷键触发回调(业务方可在此处理搜索等逻辑) */\n onQuickKeyTrigger?: (key: string, keyword: string) => void;\n /**\n * 提交内容格式:\n * - text: 默认,输出文字 + Mention 文本(如 @生图技能)\n * - structured: 保留 parts/mentions/files 结构化数据,text 为 rawText\n * - markdown/xml: 输出对应标记文本\n */\n submitFormat?: XAdkSenderSubmitFormat;\n /** 自定义 Mention 在 text/markdown/xml 格式中的序列化结果 */\n formatMention?: (\n mention: MentionTag,\n context: XAdkSenderFormatMentionContext,\n ) => string;\n /** @deprecated 请使用 formatMention。 */\n formatTag?: (\n mention: MentionTag,\n context: XAdkSenderFormatMentionContext,\n ) => string;\n /**\n * 基于 SDK 标准提交结构派生业务 payload。\n * SDK 不理解 knowledge/skill/agent 等业务字段,只负责把 payload 原样放入 onSubmit 数据中。\n */\n transformSubmitData?: (\n data: Omit<XAdkSenderSubmitData, \"payload\">,\n ) => unknown;\n}\n\nexport type XAdkSenderProps = SenderUIProps & UploaderCoreProps;\n\nexport interface XAdkSenderHandle {\n addFiles: (files: File[]) => void;\n /** 向当前光标位置插入一个内联 Mention;未启用 inlineTags 时会退化为追加 Mention。 */\n insertMention: (mention: MentionTag) => void;\n /** @deprecated 请使用 insertMention。 */\n insertTag: (mention: MentionTag) => void;\n /** 聚焦输入区 */\n focus: () => void;\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -9,9 +9,9 @@ export var useStyles = withBasicStyles(function () {
|
|
|
9
9
|
prologue: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n margin-bottom: 12px;\n "]))),
|
|
10
10
|
suggestion: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n margin-bottom: 12px;\n "]))),
|
|
11
11
|
suggestContent: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n display: inline-flex;\n border: 2px solid #e7e7e7;\n border-radius: 8px;\n "]))),
|
|
12
|
-
userMsg: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n display: flex;\n justify-content: flex-end;\n margin-bottom: 24px;\n "]))),
|
|
13
|
-
userContainer: css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n "]))),
|
|
14
|
-
card: css(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n display: inline-block;\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 100%;\n white-space: pre-line;\n word-break: break-
|
|
12
|
+
userMsg: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n display: flex;\n justify-content: flex-end;\n width: 100%;\n min-width: 0;\n margin-bottom: 24px;\n "]))),
|
|
13
|
+
userContainer: css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n min-width: 0;\n max-width: 100%;\n "]))),
|
|
14
|
+
card: css(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n display: inline-block;\n box-sizing: border-box;\n min-width: 0;\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 100%;\n white-space: pre-line;\n overflow-wrap: anywhere;\n word-break: break-word;\n "]))),
|
|
15
15
|
botMsg: css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n margin-bottom: 12px;\n "]))),
|
|
16
16
|
emptyWrapper: css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 200px;\n "]))),
|
|
17
17
|
// 新增样式
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["css","withBasicStyles","useStyles","wrapper","_templateObject","_taggedTemplateLiteral","list","_templateObject2","prologue","_templateObject3","suggestion","_templateObject4","suggestContent","_templateObject5","userMsg","_templateObject6","userContainer","_templateObject7","card","_templateObject8","botMsg","_templateObject9","emptyWrapper","_templateObject10","welcomeWrapper","_templateObject11","welcomeIcon","_templateObject12","welcomeTitle","_templateObject13","welcomeDesc","_templateObject14","suggestionWrapper","_templateObject15","successBadge","_templateObject16","fileSection","_templateObject17","fileHeader","_templateObject18","metaFooter","_templateObject19","actionIcons","_templateObject20","fnCall","_templateObject21","confirm","_templateObject22","footer","_templateObject23","sender","_templateObject24","senderWrap","_templateObject25","tip","_templateObject26","input","_templateObject27"],"sources":["../../../../src/components/XAdkChatbot/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n wrapper: css`\n padding: 0 16px;\n min-height: 300px;\n height: 100%;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n\n .x-markdown {\n --margin-ul-ol: 0 0 1em 1em;\n\n code {\n background: rgba(150, 150, 150, 0.2);\n border-radius: 3px;\n }\n\n .ant-highlightCode-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--ant-highlight-code-color-text-title);\n background: var(--ant-highlight-code-color-bg-title);\n padding: var(--ant-padding-sm);\n border-top-left-radius: var(--ant-border-radius);\n border-top-right-radius: var(--ant-border-radius);\n }\n }\n `,\n\n list: css`\n flex: 1;\n margin-top: 16px;\n overflow-y: auto;\n /* Chrome, Safari, Edge, Opera */\n &::-webkit-scrollbar {\n display: none;\n }\n /* Firefox */\n scrollbar-width: none;\n /* IE 10+ */\n -ms-overflow-style: none;\n `,\n\n prologue: css`\n margin-bottom: 12px;\n `,\n\n suggestion: css`\n margin-bottom: 12px;\n `,\n\n suggestContent: css`\n display: inline-flex;\n border: 2px solid #e7e7e7;\n border-radius: 8px;\n `,\n\n userMsg: css`\n display: flex;\n justify-content: flex-end;\n margin-bottom: 24px;\n `,\n\n userContainer: css`\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n `,\n\n card: css`\n display: inline-block;\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 100%;\n white-space: pre-line;\n word-break: break-
|
|
1
|
+
{"version":3,"names":["css","withBasicStyles","useStyles","wrapper","_templateObject","_taggedTemplateLiteral","list","_templateObject2","prologue","_templateObject3","suggestion","_templateObject4","suggestContent","_templateObject5","userMsg","_templateObject6","userContainer","_templateObject7","card","_templateObject8","botMsg","_templateObject9","emptyWrapper","_templateObject10","welcomeWrapper","_templateObject11","welcomeIcon","_templateObject12","welcomeTitle","_templateObject13","welcomeDesc","_templateObject14","suggestionWrapper","_templateObject15","successBadge","_templateObject16","fileSection","_templateObject17","fileHeader","_templateObject18","metaFooter","_templateObject19","actionIcons","_templateObject20","fnCall","_templateObject21","confirm","_templateObject22","footer","_templateObject23","sender","_templateObject24","senderWrap","_templateObject25","tip","_templateObject26","input","_templateObject27"],"sources":["../../../../src/components/XAdkChatbot/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n wrapper: css`\n padding: 0 16px;\n min-height: 300px;\n height: 100%;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n\n .x-markdown {\n --margin-ul-ol: 0 0 1em 1em;\n\n code {\n background: rgba(150, 150, 150, 0.2);\n border-radius: 3px;\n }\n\n .ant-highlightCode-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--ant-highlight-code-color-text-title);\n background: var(--ant-highlight-code-color-bg-title);\n padding: var(--ant-padding-sm);\n border-top-left-radius: var(--ant-border-radius);\n border-top-right-radius: var(--ant-border-radius);\n }\n }\n `,\n\n list: css`\n flex: 1;\n margin-top: 16px;\n overflow-y: auto;\n /* Chrome, Safari, Edge, Opera */\n &::-webkit-scrollbar {\n display: none;\n }\n /* Firefox */\n scrollbar-width: none;\n /* IE 10+ */\n -ms-overflow-style: none;\n `,\n\n prologue: css`\n margin-bottom: 12px;\n `,\n\n suggestion: css`\n margin-bottom: 12px;\n `,\n\n suggestContent: css`\n display: inline-flex;\n border: 2px solid #e7e7e7;\n border-radius: 8px;\n `,\n\n userMsg: css`\n display: flex;\n justify-content: flex-end;\n width: 100%;\n min-width: 0;\n margin-bottom: 24px;\n `,\n\n userContainer: css`\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n min-width: 0;\n max-width: 100%;\n `,\n\n card: css`\n display: inline-block;\n box-sizing: border-box;\n min-width: 0;\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 100%;\n white-space: pre-line;\n overflow-wrap: anywhere;\n word-break: break-word;\n `,\n\n botMsg: css`\n margin-bottom: 12px;\n `,\n\n emptyWrapper: css`\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 200px;\n `,\n\n // 新增样式\n welcomeWrapper: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 40px 20px;\n text-align: center;\n `,\n\n welcomeIcon: css`\n width: 64px;\n height: 64px;\n border-radius: 12px;\n margin-bottom: 16px;\n `,\n\n welcomeTitle: css`\n font-size: 24px;\n font-weight: 600;\n color: rgba(0, 0, 0, 0.88);\n margin-bottom: 8px;\n `,\n\n welcomeDesc: css`\n font-size: 14px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 24px;\n `,\n\n suggestionWrapper: css`\n margin-top: 16px;\n `,\n\n successBadge: css`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n background: #f6ffed;\n border: 1px solid #b7eb8f;\n border-radius: 4px;\n color: #52c41a;\n font-size: 13px;\n margin-bottom: 12px;\n `,\n\n fileSection: css`\n margin: 12px 0;\n `,\n\n fileHeader: css`\n font-size: 13px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 8px;\n `,\n\n metaFooter: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #f0f0f0;\n `,\n\n actionIcons: css`\n color: rgba(0, 0, 0, 0.45);\n\n & > span {\n cursor: pointer;\n transition: color 0.2s;\n\n &:hover {\n color: #1890ff;\n }\n }\n `,\n\n fnCall: css`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 11px;\n border-radius: 24px;\n line-height: 16px;\n border: 1px solid #e7e7e7;\n cursor: pointer;\n `,\n\n confirm: css`\n padding: 12px;\n border-radius: 12px;\n border: 1px solid #e7e7e7;\n `,\n\n footer: css`\n /* senderWrap and tip moved to top-level keys so they are\n accessible as styles.senderWrap and styles.tip in the component */\n `,\n\n sender: css`\n width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 8px 8px 12px;\n border: 1px solid #e7e7e7;\n border-radius: 24px;\n\n /* .input moved to top-level key so component can use styles.input */\n `,\n\n senderWrap: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n `,\n\n tip: css`\n padding: 4px;\n font-size: 12px;\n text-align: center;\n color: rgba(0, 0, 0, 0.4);\n `,\n\n input: css`\n padding: 0;\n margin: 5px 0;\n line-height: 22px;\n font-size: 15px;\n border-radius: 0;\n border: none;\n\n &:focus {\n box-shadow: none;\n }\n `,\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,OAAO,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,ouBA2BX;IAEDC,IAAI,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,wQAYR;IAEDG,QAAQ,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,sCAEZ;IAEDK,UAAU,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,sCAEd;IAEDO,cAAc,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,gGAIlB;IAEDS,OAAO,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,+HAMX;IAEDW,aAAa,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,kKAOjB;IAEDa,IAAI,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,kRAWR;IAEDe,MAAM,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,sCAEV;IAEDiB,YAAY,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,8HAMhB;IAED;IACAmB,cAAc,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,yIAMlB;IAEDqB,WAAW,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,qGAKf;IAEDuB,YAAY,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,mHAKhB;IAEDyB,WAAW,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA,6FAIf;IAED2B,iBAAiB,EAAEhC,GAAG,CAAAiC,iBAAA,KAAAA,iBAAA,GAAA5B,sBAAA,mCAErB;IAED6B,YAAY,EAAElC,GAAG,CAAAmC,iBAAA,KAAAA,iBAAA,GAAA9B,sBAAA,gQAWhB;IAED+B,WAAW,EAAEpC,GAAG,CAAAqC,iBAAA,KAAAA,iBAAA,GAAAhC,sBAAA,iCAEf;IAEDiC,UAAU,EAAEtC,GAAG,CAAAuC,iBAAA,KAAAA,iBAAA,GAAAlC,sBAAA,4FAId;IAEDmC,UAAU,EAAExC,GAAG,CAAAyC,iBAAA,KAAAA,iBAAA,GAAApC,sBAAA,mLAQd;IAEDqC,WAAW,EAAE1C,GAAG,CAAA2C,iBAAA,KAAAA,iBAAA,GAAAtC,sBAAA,kLAWf;IAEDuC,MAAM,EAAE5C,GAAG,CAAA6C,iBAAA,KAAAA,iBAAA,GAAAxC,sBAAA,yMASV;IAEDyC,OAAO,EAAE9C,GAAG,CAAA+C,iBAAA,KAAAA,iBAAA,GAAA1C,sBAAA,0FAIX;IAED2C,MAAM,EAAEhD,GAAG,CAAAiD,iBAAA,KAAAA,iBAAA,GAAA5C,sBAAA,sJAGV;IAED6C,MAAM,EAAElD,GAAG,CAAAmD,iBAAA,KAAAA,iBAAA,GAAA9C,sBAAA,kQAUV;IAED+C,UAAU,EAAEpD,GAAG,CAAAqD,iBAAA,KAAAA,iBAAA,GAAAhD,sBAAA,8GAKd;IAEDiD,GAAG,EAAEtD,GAAG,CAAAuD,iBAAA,KAAAA,iBAAA,GAAAlD,sBAAA,8GAKP;IAEDmD,KAAK,EAAExD,GAAG,CAAAyD,iBAAA,KAAAA,iBAAA,GAAApD,sBAAA;EAYZ,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
-
import React, { useRef, useCallback, useState } from "react";
|
|
2
|
+
import React, { useRef, useCallback, useState, useMemo } from "react";
|
|
3
3
|
import { Attachments } from "@ant-design/x";
|
|
4
|
-
import { Tooltip } from "antd";
|
|
5
|
-
import { PaperClipOutlined } from "@ant-design/icons";
|
|
6
4
|
import { useChatState } from "../context/ChatStateContext";
|
|
7
5
|
import { useChatSenderState } from "../context/ChatSenderStateContext";
|
|
6
|
+
import { DefaultLayoutContext } from "../context/DefaultLayoutContext";
|
|
8
7
|
import Sidebar from "./Sidebar";
|
|
9
8
|
import Messages from "./Messages";
|
|
10
9
|
import Welcome from "./Welcome";
|
|
@@ -19,7 +18,6 @@ import { useStyles } from "./styles";
|
|
|
19
18
|
* - 右侧: 聊天区域 (标题 + 消息 + 输入框,居中显示,最大宽度800px)
|
|
20
19
|
*/
|
|
21
20
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
22
|
-
import { Fragment as _Fragment } from "react/jsx-runtime";
|
|
23
21
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
24
22
|
var DefaultLayout = function DefaultLayout(_ref) {
|
|
25
23
|
var _ref$showSessionList = _ref.showSessionList,
|
|
@@ -47,11 +45,19 @@ var DefaultLayout = function DefaultLayout(_ref) {
|
|
|
47
45
|
var styles = useStyles();
|
|
48
46
|
var chatAreaRef = useRef(null);
|
|
49
47
|
var senderRef = useRef(null);
|
|
50
|
-
var fileInputRef = useRef(null);
|
|
51
48
|
var _useState = useState([]),
|
|
52
49
|
_useState2 = _slicedToArray(_useState, 2),
|
|
53
50
|
dropFileList = _useState2[0],
|
|
54
51
|
setDropFileList = _useState2[1];
|
|
52
|
+
var registerSender = useCallback(function (sender) {
|
|
53
|
+
senderRef.current = sender;
|
|
54
|
+
}, []);
|
|
55
|
+
var layoutContextValue = useMemo(function () {
|
|
56
|
+
return {
|
|
57
|
+
allowUpload: mergedAllowUpload,
|
|
58
|
+
registerSender: registerSender
|
|
59
|
+
};
|
|
60
|
+
}, [mergedAllowUpload, registerSender]);
|
|
55
61
|
|
|
56
62
|
// 拖拽上传只有在上传能力开启时生效,避免关闭上传后仍响应文件拖入。
|
|
57
63
|
var enableDragUpload = mergedAllowUpload && mergedDraggable;
|
|
@@ -74,31 +80,6 @@ var DefaultLayout = function DefaultLayout(_ref) {
|
|
|
74
80
|
setDropFileList([]);
|
|
75
81
|
}, [handleFiles]);
|
|
76
82
|
|
|
77
|
-
// 隐藏 file input 的 change 回调
|
|
78
|
-
var handleFileInputChange = useCallback(function (e) {
|
|
79
|
-
if (e.target.files) {
|
|
80
|
-
handleFiles(Array.from(e.target.files));
|
|
81
|
-
e.target.value = "";
|
|
82
|
-
}
|
|
83
|
-
}, [handleFiles]);
|
|
84
|
-
|
|
85
|
-
// 内置上传按钮:点击触发隐藏 file input
|
|
86
|
-
var renderUploadButton = useCallback(function () {
|
|
87
|
-
return /*#__PURE__*/_jsx(Tooltip, {
|
|
88
|
-
title: "\u4E0A\u4F20\u6587\u4EF6",
|
|
89
|
-
children: /*#__PURE__*/_jsx("button", {
|
|
90
|
-
type: "button",
|
|
91
|
-
className: styles.uploadButton,
|
|
92
|
-
onClick: function onClick() {
|
|
93
|
-
var _fileInputRef$current;
|
|
94
|
-
return (_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 ? void 0 : _fileInputRef$current.click();
|
|
95
|
-
},
|
|
96
|
-
"aria-label": "\u4E0A\u4F20\u6587\u4EF6",
|
|
97
|
-
children: /*#__PURE__*/_jsx(PaperClipOutlined, {})
|
|
98
|
-
})
|
|
99
|
-
});
|
|
100
|
-
}, [styles]);
|
|
101
|
-
|
|
102
83
|
// 判断是否为空状态(展示Welcome)
|
|
103
84
|
var isEmpty = messages.length === 0 && !prologue && (!suggestions || suggestions.length === 0);
|
|
104
85
|
return /*#__PURE__*/_jsxs("div", {
|
|
@@ -194,20 +175,14 @@ var DefaultLayout = function DefaultLayout(_ref) {
|
|
|
194
175
|
padding: isEmpty ? "0 24px" : "0",
|
|
195
176
|
transition: "all 0.4s cubic-bezier(0.4, 0, 0.2, 1)"
|
|
196
177
|
},
|
|
197
|
-
children:
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
type: "file",
|
|
201
|
-
multiple: true,
|
|
202
|
-
hidden: true,
|
|
203
|
-
onChange: handleFileInputChange
|
|
204
|
-
}), /*#__PURE__*/_jsx(Sender, {
|
|
178
|
+
children: /*#__PURE__*/_jsx(DefaultLayoutContext.Provider, {
|
|
179
|
+
value: layoutContextValue,
|
|
180
|
+
children: footer || /*#__PURE__*/_jsx(Sender, {
|
|
205
181
|
ref: senderRef,
|
|
206
182
|
draggable: false,
|
|
207
183
|
onFileSelect: handleFiles,
|
|
208
|
-
clearBtnShow: clearBtnShow
|
|
209
|
-
|
|
210
|
-
})]
|
|
184
|
+
clearBtnShow: clearBtnShow
|
|
185
|
+
})
|
|
211
186
|
})
|
|
212
187
|
}), /*#__PURE__*/_jsx("div", {
|
|
213
188
|
style: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useRef","useCallback","useState","Attachments","Tooltip","PaperClipOutlined","useChatState","useChatSenderState","Sidebar","Messages","Welcome","Sender","useStyles","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","DefaultLayout","_ref","_ref$showSessionList","showSessionList","header","footer","allowUpload","draggable","_ref$clearBtnShow","clearBtnShow","showFnCallDetail","renderFunctionCall","strategies","_useChatState","appInfo","messages","prologue","suggestions","_useChatSenderState","providerAllowUpload","providerDraggable","mergedAllowUpload","mergedDraggable","styles","chatAreaRef","senderRef","fileInputRef","_useState","_useState2","_slicedToArray","dropFileList","setDropFileList","enableDragUpload","handleFiles","files","length","_senderRef$current","current","addFiles","handleDropFiles","info","rawFiles","fileList","map","f","originFileObj","filter","Boolean","handleFileInputChange","e","target","Array","from","value","renderUploadButton","title","children","type","className","uploadButton","onClick","_fileInputRef$current","click","isEmpty","style","display","height","width","position","overflow","isNarrow","ref","flex","justifyContent","alignItems","flexDirection","maxWidth","padding","background","gap","appName","fontSize","fontWeight","color","transition","marginBottom","sendWrapper","alignSelf","multiple","hidden","onChange","onFileSelect","footerLeft","undefined","items","getDropContainer","beforeUpload","displayName"],"sources":["../../../../../src/components/XAdkProvider/compound/DefaultLayout.tsx"],"sourcesContent":["import React, { useRef, useCallback, useState } from \"react\";\nimport { Attachments } from \"@ant-design/x\";\nimport { Tooltip } from \"antd\";\nimport { PaperClipOutlined } from \"@ant-design/icons\";\nimport type { UploadFile } from \"antd\";\nimport { useChatState } from \"../context/ChatStateContext\";\nimport { useChatSenderState } from \"../context/ChatSenderStateContext\";\nimport Sidebar from \"./Sidebar\";\nimport Messages from \"./Messages\";\nimport Welcome from \"./Welcome\";\nimport Sender from \"./Sender\";\nimport { useStyles } from \"./styles\";\nimport type { ChatStrategies } from \"@/types\";\nimport type { XAdkSenderHandle } from \"@/types/XAdkSender\";\n\n/**\n * XAdkProvider 默认布局\n *\n * 提供类似 ChatGPT/DeepSeek 的默认布局:\n * - 左侧: 会话列表侧边栏 (可选,支持展开/收起)\n * - 右侧: 聊天区域 (标题 + 消息 + 输入框,居中显示,最大宽度800px)\n */\nexport interface DefaultLayoutProps {\n /** 是否显示会话列表 */\n showSessionList?: boolean;\n /** 自定义头部 */\n header?: React.ReactNode;\n /** 自定义底部 (替代默认 Sender) */\n footer?: React.ReactNode;\n /**\n * 是否启用内置上传入口(上传按钮 + 隐藏 file input + 拖拽)。\n * 未传时继承 XAdkProvider config.allowUpload。\n * 内核 XAdkSender 不再内置上传逻辑,上传能力统一由 DefaultLayout 管理。\n * 业务方自定义 footer 时可自行控制上传。\n */\n allowUpload?: boolean;\n /** 是否启用拖拽上传;未传时继承 config.draggable */\n draggable?: boolean;\n /** 是否显示清空按钮 */\n clearBtnShow?: boolean;\n /** 是否显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 自定义消息 Footer */\n messagesFooter?: (msg: any) => React.ReactNode;\n /** 自定义工具调用渲染函数,返回 null 则降级使用默认渲染 */\n renderFunctionCall?: (\n msg: import(\"@/types\").IMessage,\n ) => React.ReactNode | null;\n /** 局部策略覆盖,优先级高于 Provider preset/strategies */\n strategies?: ChatStrategies;\n}\n\nconst DefaultLayout: React.FC<DefaultLayoutProps> = ({\n showSessionList = false,\n header,\n footer,\n allowUpload,\n draggable,\n clearBtnShow = true,\n showFnCallDetail,\n renderFunctionCall,\n strategies,\n}) => {\n const { appInfo, messages, prologue, suggestions } = useChatState();\n const { allowUpload: providerAllowUpload, draggable: providerDraggable } =\n useChatSenderState();\n // Layout props 用于局部覆盖;未传时继承 Provider config,保证 NPM 与 UMD 接入一致。\n const mergedAllowUpload = allowUpload ?? providerAllowUpload;\n const mergedDraggable = draggable ?? providerDraggable;\n const styles = useStyles();\n const chatAreaRef = useRef<HTMLDivElement>(null);\n const senderRef = useRef<XAdkSenderHandle>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [dropFileList, setDropFileList] = useState<UploadFile[]>([]);\n\n // 拖拽上传只有在上传能力开启时生效,避免关闭上传后仍响应文件拖入。\n const enableDragUpload = mergedAllowUpload && mergedDraggable;\n\n // 文件注入到 Sender(按钮点击 + 拖拽统一走这里)\n const handleFiles = useCallback((files: File[]) => {\n if (files.length > 0) {\n senderRef.current?.addFiles(files);\n }\n }, []);\n\n // Attachments 拖拽文件后的回调\n const handleDropFiles = useCallback(\n (info: { fileList: UploadFile[] }) => {\n const rawFiles = info.fileList\n .map((f) => f.originFileObj)\n .filter(Boolean) as File[];\n handleFiles(rawFiles);\n // 清空 Attachments 文件列表,避免累积\n setDropFileList([]);\n },\n [handleFiles],\n );\n\n // 隐藏 file input 的 change 回调\n const handleFileInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) {\n handleFiles(Array.from(e.target.files));\n e.target.value = \"\";\n }\n },\n [handleFiles],\n );\n\n // 内置上传按钮:点击触发隐藏 file input\n const renderUploadButton = useCallback(\n () => (\n <Tooltip title=\"上传文件\">\n <button\n type=\"button\"\n className={styles.uploadButton}\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"上传文件\"\n >\n <PaperClipOutlined />\n </button>\n </Tooltip>\n ),\n [styles],\n );\n\n // 判断是否为空状态(展示Welcome)\n const isEmpty =\n messages.length === 0 &&\n !prologue &&\n (!suggestions || suggestions.length === 0);\n\n return (\n <div\n style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n {/* 左侧会话列表 - XAiConversations 组件会处理展开/收起 */}\n {showSessionList && <Sidebar isNarrow={false} />}\n\n {/* 右侧聊天区域 - 使用 flex: 1 自动占据剩余空间 */}\n <div\n ref={chatAreaRef}\n style={{\n flex: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n {/* 居中容器 - 最大宽度 800px */}\n <div\n style={{\n width: \"100%\",\n maxWidth: \"800px\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 头部 */}\n {header ||\n (appInfo && (\n <div\n style={{\n padding: \"16px 24px\",\n display: \"flex\",\n justifyContent: \"center\",\n background: \"white\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {appInfo.appName && (\n <div>\n <div\n style={{\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#000\",\n }}\n >\n {appInfo.appName}\n </div>\n </div>\n )}\n </div>\n </div>\n ))}\n\n {/* 消息区域或Welcome区域 */}\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 上方弹性占位 - Welcome状态时占据空间 */}\n <div\n style={{\n flex: isEmpty ? 1 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n\n {/* Welcome 组件 - 只在空状态显示 */}\n {isEmpty && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: \"0 24px\",\n marginBottom: \"24px\",\n }}\n >\n <Welcome />\n </div>\n )}\n\n {/* Messages 组件 - 只在非空状态显示 */}\n {!isEmpty && (\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n <Messages\n showFnCallDetail={showFnCallDetail}\n renderFunctionCall={renderFunctionCall}\n strategies={strategies}\n />\n </div>\n )}\n {/* 输入区域 - 始终存在,通过样式控制位置 */}\n <div\n className={styles.sendWrapper}\n style={{\n maxWidth: isEmpty ? \"600px\" : \"100%\",\n alignSelf: \"center\",\n padding: isEmpty ? \"0 24px\" : \"0\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n {footer || (\n <>\n {/* 隐藏的原生 file input - 由 DefaultLayout 管理 */}\n {mergedAllowUpload && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n hidden\n onChange={handleFileInputChange}\n />\n )}\n <Sender\n ref={senderRef}\n draggable={false}\n onFileSelect={handleFiles}\n clearBtnShow={clearBtnShow}\n footerLeft={\n mergedAllowUpload ? renderUploadButton : undefined\n }\n />\n </>\n )}\n </div>\n\n {/* 下方弹性占位 - Welcome状态时占据更多空间,让内容偏上 */}\n <div\n style={{\n flex: isEmpty ? 1.5 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n </div>\n </div>\n\n {/* Attachments 拖拽遮罩 - 仅用于拖拽上传功能 */}\n {enableDragUpload && (\n <Attachments\n style={{ display: \"none\" }}\n items={dropFileList}\n getDropContainer={() => chatAreaRef.current}\n multiple\n beforeUpload={() => false}\n onChange={handleDropFiles}\n />\n )}\n </div>\n </div>\n );\n};\n\nDefaultLayout.displayName = \"XAdkProvider.DefaultLayout\";\n\nexport default DefaultLayout;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["React","useRef","useCallback","useState","useMemo","Attachments","useChatState","useChatSenderState","DefaultLayoutContext","Sidebar","Messages","Welcome","Sender","useStyles","jsx","_jsx","jsxs","_jsxs","DefaultLayout","_ref","_ref$showSessionList","showSessionList","header","footer","allowUpload","draggable","_ref$clearBtnShow","clearBtnShow","showFnCallDetail","renderFunctionCall","strategies","_useChatState","appInfo","messages","prologue","suggestions","_useChatSenderState","providerAllowUpload","providerDraggable","mergedAllowUpload","mergedDraggable","styles","chatAreaRef","senderRef","_useState","_useState2","_slicedToArray","dropFileList","setDropFileList","registerSender","sender","current","layoutContextValue","enableDragUpload","handleFiles","files","length","_senderRef$current","addFiles","handleDropFiles","info","rawFiles","fileList","map","f","originFileObj","filter","Boolean","isEmpty","style","display","height","width","position","overflow","children","isNarrow","ref","flex","justifyContent","alignItems","flexDirection","maxWidth","padding","background","gap","appName","fontSize","fontWeight","color","transition","marginBottom","className","sendWrapper","alignSelf","Provider","value","onFileSelect","items","getDropContainer","multiple","beforeUpload","onChange","displayName"],"sources":["../../../../../src/components/XAdkProvider/compound/DefaultLayout.tsx"],"sourcesContent":["import React, { useRef, useCallback, useState, useMemo } from \"react\";\nimport { Attachments } from \"@ant-design/x\";\nimport type { UploadFile } from \"antd\";\nimport { useChatState } from \"../context/ChatStateContext\";\nimport { useChatSenderState } from \"../context/ChatSenderStateContext\";\nimport { DefaultLayoutContext } from \"../context/DefaultLayoutContext\";\nimport Sidebar from \"./Sidebar\";\nimport Messages from \"./Messages\";\nimport Welcome from \"./Welcome\";\nimport Sender from \"./Sender\";\nimport { useStyles } from \"./styles\";\nimport type { ChatStrategies } from \"@/types\";\nimport type { XAdkSenderHandle } from \"@/types/XAdkSender\";\n\n/**\n * XAdkProvider 默认布局\n *\n * 提供类似 ChatGPT/DeepSeek 的默认布局:\n * - 左侧: 会话列表侧边栏 (可选,支持展开/收起)\n * - 右侧: 聊天区域 (标题 + 消息 + 输入框,居中显示,最大宽度800px)\n */\nexport interface DefaultLayoutProps {\n /** 是否显示会话列表 */\n showSessionList?: boolean;\n /** 自定义头部 */\n header?: React.ReactNode;\n /** 自定义底部 (替代默认 Sender) */\n footer?: React.ReactNode;\n /**\n * 是否启用内置上传入口(上传按钮 + 隐藏 file input + 拖拽)。\n * 未传时继承 XAdkProvider config.allowUpload。\n * 内核 XAdkSender 不再内置上传逻辑,上传能力统一由 DefaultLayout 管理。\n * 业务方自定义 footer 时可自行控制上传。\n */\n allowUpload?: boolean;\n /** 是否启用拖拽上传;未传时继承 config.draggable */\n draggable?: boolean;\n /** 是否显示清空按钮 */\n clearBtnShow?: boolean;\n /** 是否显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 自定义消息 Footer */\n messagesFooter?: (msg: any) => React.ReactNode;\n /** 自定义工具调用渲染函数,返回 null 则降级使用默认渲染 */\n renderFunctionCall?: (\n msg: import(\"@/types\").IMessage,\n ) => React.ReactNode | null;\n /** 局部策略覆盖,优先级高于 Provider preset/strategies */\n strategies?: ChatStrategies;\n}\n\nconst DefaultLayout: React.FC<DefaultLayoutProps> = ({\n showSessionList = false,\n header,\n footer,\n allowUpload,\n draggable,\n clearBtnShow = true,\n showFnCallDetail,\n renderFunctionCall,\n strategies,\n}) => {\n const { appInfo, messages, prologue, suggestions } = useChatState();\n const { allowUpload: providerAllowUpload, draggable: providerDraggable } =\n useChatSenderState();\n // Layout props 用于局部覆盖;未传时继承 Provider config,保证 NPM 与 UMD 接入一致。\n const mergedAllowUpload = allowUpload ?? providerAllowUpload;\n const mergedDraggable = draggable ?? providerDraggable;\n const styles = useStyles();\n const chatAreaRef = useRef<HTMLDivElement>(null);\n const senderRef = useRef<XAdkSenderHandle>(null);\n const [dropFileList, setDropFileList] = useState<UploadFile[]>([]);\n const registerSender = useCallback((sender: XAdkSenderHandle | null) => {\n senderRef.current = sender;\n }, []);\n const layoutContextValue = useMemo(\n () => ({ allowUpload: mergedAllowUpload, registerSender }),\n [mergedAllowUpload, registerSender],\n );\n\n // 拖拽上传只有在上传能力开启时生效,避免关闭上传后仍响应文件拖入。\n const enableDragUpload = mergedAllowUpload && mergedDraggable;\n\n // 文件注入到 Sender(按钮点击 + 拖拽统一走这里)\n const handleFiles = useCallback((files: File[]) => {\n if (files.length > 0) {\n senderRef.current?.addFiles(files);\n }\n }, []);\n\n // Attachments 拖拽文件后的回调\n const handleDropFiles = useCallback(\n (info: { fileList: UploadFile[] }) => {\n const rawFiles = info.fileList\n .map((f) => f.originFileObj)\n .filter(Boolean) as File[];\n handleFiles(rawFiles);\n // 清空 Attachments 文件列表,避免累积\n setDropFileList([]);\n },\n [handleFiles],\n );\n\n // 判断是否为空状态(展示Welcome)\n const isEmpty =\n messages.length === 0 &&\n !prologue &&\n (!suggestions || suggestions.length === 0);\n\n return (\n <div\n style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n {/* 左侧会话列表 - XAiConversations 组件会处理展开/收起 */}\n {showSessionList && <Sidebar isNarrow={false} />}\n\n {/* 右侧聊天区域 - 使用 flex: 1 自动占据剩余空间 */}\n <div\n ref={chatAreaRef}\n style={{\n flex: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n {/* 居中容器 - 最大宽度 800px */}\n <div\n style={{\n width: \"100%\",\n maxWidth: \"800px\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 头部 */}\n {header ||\n (appInfo && (\n <div\n style={{\n padding: \"16px 24px\",\n display: \"flex\",\n justifyContent: \"center\",\n background: \"white\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {appInfo.appName && (\n <div>\n <div\n style={{\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#000\",\n }}\n >\n {appInfo.appName}\n </div>\n </div>\n )}\n </div>\n </div>\n ))}\n\n {/* 消息区域或Welcome区域 */}\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 上方弹性占位 - Welcome状态时占据空间 */}\n <div\n style={{\n flex: isEmpty ? 1 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n\n {/* Welcome 组件 - 只在空状态显示 */}\n {isEmpty && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: \"0 24px\",\n marginBottom: \"24px\",\n }}\n >\n <Welcome />\n </div>\n )}\n\n {/* Messages 组件 - 只在非空状态显示 */}\n {!isEmpty && (\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n <Messages\n showFnCallDetail={showFnCallDetail}\n renderFunctionCall={renderFunctionCall}\n strategies={strategies}\n />\n </div>\n )}\n {/* 输入区域 - 始终存在,通过样式控制位置 */}\n <div\n className={styles.sendWrapper}\n style={{\n maxWidth: isEmpty ? \"600px\" : \"100%\",\n alignSelf: \"center\",\n padding: isEmpty ? \"0 24px\" : \"0\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n <DefaultLayoutContext.Provider value={layoutContextValue}>\n {footer || (\n <Sender\n ref={senderRef}\n draggable={false}\n onFileSelect={handleFiles}\n clearBtnShow={clearBtnShow}\n />\n )}\n </DefaultLayoutContext.Provider>\n </div>\n\n {/* 下方弹性占位 - Welcome状态时占据更多空间,让内容偏上 */}\n <div\n style={{\n flex: isEmpty ? 1.5 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n </div>\n </div>\n\n {/* Attachments 拖拽遮罩 - 仅用于拖拽上传功能 */}\n {enableDragUpload && (\n <Attachments\n style={{ display: \"none\" }}\n items={dropFileList}\n getDropContainer={() => chatAreaRef.current}\n multiple\n beforeUpload={() => false}\n onChange={handleDropFiles}\n />\n )}\n </div>\n </div>\n );\n};\n\nDefaultLayout.displayName = \"XAdkProvider.DefaultLayout\";\n\nexport default DefaultLayout;\n"],"mappings":"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"}
|
|
@@ -11,14 +11,15 @@ import type { XAdkSenderProps, XAdkSenderHandle } from "../../../types";
|
|
|
11
11
|
* <XAdkProvider url="..." token="...">
|
|
12
12
|
* <XAdkProvider.Sender
|
|
13
13
|
* clearBtnShow={true}
|
|
14
|
+
* allowUpload
|
|
14
15
|
* uploadRequest={myUploadHandler}
|
|
15
16
|
* />
|
|
16
17
|
* </XAdkProvider>
|
|
17
18
|
* ```
|
|
18
|
-
*
|
|
19
|
-
* 提示:如需内置上传按钮与拖拽上传,请使用 XAdkProvider.DefaultLayout 并设置 allowUpload。
|
|
20
19
|
*/
|
|
21
20
|
export interface XAdkSenderCompoundProps extends Partial<Omit<XAdkSenderProps, "loading" | "onSubmit" | "onStop" | "onClear">> {
|
|
21
|
+
/** 是否显示内置上传按钮;未传时依次继承 DefaultLayout 与 Provider 配置。 */
|
|
22
|
+
allowUpload?: boolean;
|
|
22
23
|
/** 额外的样式 */
|
|
23
24
|
style?: React.CSSProperties;
|
|
24
25
|
/** 额外的类名 */
|