@ai-group/chat-sdk 2.1.1 → 2.1.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/index.js +61 -98
- package/dist/cjs/components/XAdkChatbot/index.js.map +3 -3
- package/dist/cjs/components/XAdkSender/XAdkSender.stories.d.ts +6 -0
- package/dist/cjs/components/XAdkSender/XAdkSender.stories.js +93 -0
- package/dist/cjs/components/XAdkSender/XAdkSender.stories.js.map +7 -0
- package/dist/cjs/components/XAdkSender/index.d.ts +4 -0
- package/dist/cjs/components/XAdkSender/index.js +444 -0
- package/dist/cjs/components/XAdkSender/index.js.map +7 -0
- package/dist/cjs/components/XAdkSender/styles.d.ts +56 -0
- package/dist/cjs/components/XAdkSender/styles.js +340 -0
- package/dist/cjs/components/XAdkSender/styles.js.map +7 -0
- package/dist/cjs/components/XAdkWebProvider/XAdkWebProvider.stories.js +1 -1
- package/dist/cjs/components/XAdkWebProvider/XAdkWebProvider.stories.js.map +1 -1
- package/dist/cjs/components/XAdkWebProvider/index.js +6 -3
- package/dist/cjs/components/XAdkWebProvider/index.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.d.ts +1 -0
- package/dist/cjs/components/XAiConversations/styles.js +3 -0
- package/dist/cjs/components/XAiConversations/styles.js.map +2 -2
- package/dist/cjs/components/XAiSender/index.js +17 -35
- package/dist/cjs/components/XAiSender/index.js.map +2 -2
- package/dist/cjs/hooks/useADKChat.d.ts +2 -2
- package/dist/cjs/hooks/useADKChat.js +10 -6
- package/dist/cjs/hooks/useADKChat.js.map +2 -2
- package/dist/cjs/types/XAdkChatbot.d.ts +6 -1
- package/dist/cjs/types/XAdkChatbot.js.map +1 -1
- package/dist/cjs/types/XAdkProvider.d.ts +1 -0
- package/dist/cjs/types/XAdkProvider.js.map +1 -1
- package/dist/cjs/types/XAdkSender.d.ts +38 -0
- package/dist/cjs/types/XAdkSender.js +18 -0
- package/dist/cjs/types/XAdkSender.js.map +7 -0
- package/dist/esm/components/XAdkChatbot/index.js +74 -125
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkSender/XAdkSender.stories.d.ts +6 -0
- package/dist/esm/components/XAdkSender/XAdkSender.stories.js +77 -0
- package/dist/esm/components/XAdkSender/XAdkSender.stories.js.map +1 -0
- package/dist/esm/components/XAdkSender/index.d.ts +4 -0
- package/dist/esm/components/XAdkSender/index.js +611 -0
- package/dist/esm/components/XAdkSender/index.js.map +1 -0
- package/dist/esm/components/XAdkSender/styles.d.ts +56 -0
- package/dist/esm/components/XAdkSender/styles.js +50 -0
- package/dist/esm/components/XAdkSender/styles.js.map +1 -0
- package/dist/esm/components/XAdkWebProvider/XAdkWebProvider.stories.js +1 -1
- package/dist/esm/components/XAdkWebProvider/XAdkWebProvider.stories.js.map +1 -1
- package/dist/esm/components/XAdkWebProvider/index.js +26 -19
- package/dist/esm/components/XAdkWebProvider/index.js.map +1 -1
- package/dist/esm/components/XAiConversations/index.js +1 -0
- package/dist/esm/components/XAiConversations/index.js.map +1 -1
- package/dist/esm/components/XAiConversations/styles.d.ts +1 -0
- package/dist/esm/components/XAiConversations/styles.js +15 -14
- package/dist/esm/components/XAiConversations/styles.js.map +1 -1
- package/dist/esm/components/XAiSender/index.js +16 -22
- package/dist/esm/components/XAiSender/index.js.map +1 -1
- package/dist/esm/hooks/useADKChat.d.ts +2 -2
- package/dist/esm/hooks/useADKChat.js +38 -30
- package/dist/esm/hooks/useADKChat.js.map +1 -1
- package/dist/esm/types/XAdkChatbot.d.ts +6 -1
- package/dist/esm/types/XAdkChatbot.js.map +1 -1
- package/dist/esm/types/XAdkProvider.d.ts +1 -0
- package/dist/esm/types/XAdkProvider.js.map +1 -1
- package/dist/esm/types/XAdkSender.d.ts +38 -0
- package/dist/esm/types/XAdkSender.js +2 -0
- package/dist/esm/types/XAdkSender.js.map +1 -0
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,444 @@
|
|
|
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/components/XAdkSender/index.tsx
|
|
20
|
+
var XAdkSender_exports = {};
|
|
21
|
+
__export(XAdkSender_exports, {
|
|
22
|
+
default: () => XAdkSender_default
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(XAdkSender_exports);
|
|
25
|
+
var import_react = require("react");
|
|
26
|
+
var import_antd = require("antd");
|
|
27
|
+
var import_icons = require("@ant-design/icons");
|
|
28
|
+
var import_styles = require("./styles");
|
|
29
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
30
|
+
var FILE_ICONS = {
|
|
31
|
+
// ... 保持不变
|
|
32
|
+
};
|
|
33
|
+
var XAdkSender = ({
|
|
34
|
+
clearBtnShow = true,
|
|
35
|
+
allowUpload = false,
|
|
36
|
+
loading = false,
|
|
37
|
+
uploadProps = {},
|
|
38
|
+
onClear,
|
|
39
|
+
onChange,
|
|
40
|
+
onSubmit,
|
|
41
|
+
onStop,
|
|
42
|
+
onFilesChange,
|
|
43
|
+
maxFileSize = 10,
|
|
44
|
+
allowedFileTypes = ["image/*", "application/pdf", "text/plain"],
|
|
45
|
+
maxFiles = 5
|
|
46
|
+
}) => {
|
|
47
|
+
const styles = (0, import_styles.useStyles)();
|
|
48
|
+
const [value, setValue] = (0, import_react.useState)("");
|
|
49
|
+
const [files, setFiles] = (0, import_react.useState)([]);
|
|
50
|
+
const [isDragOver, setIsDragOver] = (0, import_react.useState)(false);
|
|
51
|
+
const containerRef = (0, import_react.useRef)(null);
|
|
52
|
+
const fileInputRef = (0, import_react.useRef)(null);
|
|
53
|
+
const uploadRef = (0, import_react.useRef)(null);
|
|
54
|
+
const generateId = () => {
|
|
55
|
+
return Date.now().toString(36) + Math.random().toString(36).substr(2);
|
|
56
|
+
};
|
|
57
|
+
const getFileIcon = (fileType) => {
|
|
58
|
+
return FILE_ICONS[fileType] || FILE_ICONS.default;
|
|
59
|
+
};
|
|
60
|
+
const formatFileSize = (bytes) => {
|
|
61
|
+
if (bytes < 1024)
|
|
62
|
+
return bytes + " Bytes";
|
|
63
|
+
if (bytes < 1024 * 1024)
|
|
64
|
+
return (bytes / 1024).toFixed(1) + " KB";
|
|
65
|
+
return (bytes / (1024 * 1024)).toFixed(1) + " MB";
|
|
66
|
+
};
|
|
67
|
+
const checkFileType = (file) => {
|
|
68
|
+
if (!allowedFileTypes.length)
|
|
69
|
+
return true;
|
|
70
|
+
return allowedFileTypes.some((type) => {
|
|
71
|
+
if (type.includes("/*")) {
|
|
72
|
+
const mainType = type.split("/")[0];
|
|
73
|
+
return file.type.startsWith(mainType);
|
|
74
|
+
}
|
|
75
|
+
return file.type === type;
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const checkFileSize = (file) => {
|
|
79
|
+
const maxSize = maxFileSize * 1024 * 1024;
|
|
80
|
+
return file.size <= maxSize;
|
|
81
|
+
};
|
|
82
|
+
const validateFile = (file) => {
|
|
83
|
+
if (files.length >= maxFiles) {
|
|
84
|
+
return { valid: false, message: `最多只能上传 ${maxFiles} 个文件` };
|
|
85
|
+
}
|
|
86
|
+
if (!checkFileSize(file)) {
|
|
87
|
+
return { valid: false, message: `文件大小不能超过 ${maxFileSize}MB` };
|
|
88
|
+
}
|
|
89
|
+
if (!checkFileType(file)) {
|
|
90
|
+
return { valid: false, message: "不支持的文件类型" };
|
|
91
|
+
}
|
|
92
|
+
return { valid: true };
|
|
93
|
+
};
|
|
94
|
+
const getFileExtension = (filename) => {
|
|
95
|
+
const ext = filename.split(".").pop();
|
|
96
|
+
return ext ? ext.toLowerCase() : "";
|
|
97
|
+
};
|
|
98
|
+
const handleFileSelect = (0, import_react.useCallback)((selectedFiles) => {
|
|
99
|
+
const fileArray = Array.from(selectedFiles);
|
|
100
|
+
const validFiles = [];
|
|
101
|
+
fileArray.forEach((file) => {
|
|
102
|
+
const validation = validateFile(file);
|
|
103
|
+
if (validation.valid) {
|
|
104
|
+
validFiles.push({
|
|
105
|
+
id: generateId(),
|
|
106
|
+
uid: generateId(),
|
|
107
|
+
name: file.name,
|
|
108
|
+
size: file.size,
|
|
109
|
+
type: file.type,
|
|
110
|
+
file,
|
|
111
|
+
progress: 0,
|
|
112
|
+
status: "pending",
|
|
113
|
+
response: null
|
|
114
|
+
});
|
|
115
|
+
} else {
|
|
116
|
+
import_antd.message.error(validation.message);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
if (validFiles.length > 0) {
|
|
120
|
+
setFiles((prev) => [...prev, ...validFiles]);
|
|
121
|
+
uploadFiles(validFiles);
|
|
122
|
+
}
|
|
123
|
+
}, [files.length, maxFiles, maxFileSize, allowedFileTypes]);
|
|
124
|
+
const uploadFiles = async (fileList) => {
|
|
125
|
+
for (const localFile of fileList) {
|
|
126
|
+
setFiles((prev) => prev.map(
|
|
127
|
+
(f) => f.id === localFile.id ? { ...f, status: "uploading" } : f
|
|
128
|
+
));
|
|
129
|
+
try {
|
|
130
|
+
if (uploadProps.customRequest) {
|
|
131
|
+
const rcFile = Object.assign(localFile.file, {
|
|
132
|
+
uid: localFile.uid
|
|
133
|
+
});
|
|
134
|
+
const options = {
|
|
135
|
+
action: uploadProps.action,
|
|
136
|
+
file: rcFile,
|
|
137
|
+
filename: "file",
|
|
138
|
+
data: uploadProps.data,
|
|
139
|
+
headers: uploadProps.headers,
|
|
140
|
+
withCredentials: uploadProps.withCredentials,
|
|
141
|
+
method: "POST",
|
|
142
|
+
onProgress: (event) => {
|
|
143
|
+
setFiles((prev) => prev.map(
|
|
144
|
+
(f) => f.id === localFile.id ? { ...f, progress: event.percent || 0 } : f
|
|
145
|
+
));
|
|
146
|
+
},
|
|
147
|
+
onSuccess: (response, file) => {
|
|
148
|
+
setFiles((prev) => prev.map(
|
|
149
|
+
(f) => f.id === localFile.id ? {
|
|
150
|
+
...f,
|
|
151
|
+
status: "success",
|
|
152
|
+
progress: 100,
|
|
153
|
+
response
|
|
154
|
+
} : f
|
|
155
|
+
));
|
|
156
|
+
},
|
|
157
|
+
onError: (error) => {
|
|
158
|
+
let errorMessage = "上传失败";
|
|
159
|
+
if (error instanceof Error) {
|
|
160
|
+
errorMessage = error.message;
|
|
161
|
+
} else if (error && typeof error === "object" && "status" in error) {
|
|
162
|
+
errorMessage = `HTTP ${error.status}`;
|
|
163
|
+
}
|
|
164
|
+
setFiles((prev) => prev.map(
|
|
165
|
+
(f) => f.id === localFile.id ? { ...f, status: "error" } : f
|
|
166
|
+
));
|
|
167
|
+
import_antd.message.error(`${localFile.name} 上传失败: ${errorMessage}`);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
uploadProps.customRequest(options, {
|
|
171
|
+
defaultRequest: () => {
|
|
172
|
+
simulateUpload([localFile]);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
} else {
|
|
176
|
+
simulateUpload([localFile]);
|
|
177
|
+
}
|
|
178
|
+
} catch (error) {
|
|
179
|
+
setFiles((prev) => prev.map(
|
|
180
|
+
(f) => f.id === localFile.id ? { ...f, status: "error" } : f
|
|
181
|
+
));
|
|
182
|
+
import_antd.message.error(`${localFile.name} 上传失败`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
const simulateUpload = async (uploadFilesList) => {
|
|
187
|
+
uploadFilesList.forEach((localFile) => {
|
|
188
|
+
let progress = 0;
|
|
189
|
+
const interval = setInterval(() => {
|
|
190
|
+
progress += 10;
|
|
191
|
+
setFiles((prev) => prev.map(
|
|
192
|
+
(f) => f.id === localFile.id ? { ...f, progress } : f
|
|
193
|
+
));
|
|
194
|
+
if (progress >= 100) {
|
|
195
|
+
clearInterval(interval);
|
|
196
|
+
setTimeout(() => {
|
|
197
|
+
const mockResponse = {
|
|
198
|
+
code: 200,
|
|
199
|
+
data: {
|
|
200
|
+
fileId: Math.floor(Math.random() * 1e3) + 1,
|
|
201
|
+
tempUrl: `https://example.com/uploads/${localFile.name}`,
|
|
202
|
+
fileName: localFile.name,
|
|
203
|
+
fileType: getFileExtension(localFile.name)
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
setFiles((prev) => prev.map(
|
|
207
|
+
(f) => f.id === localFile.id ? {
|
|
208
|
+
...f,
|
|
209
|
+
status: "success",
|
|
210
|
+
progress: 100,
|
|
211
|
+
response: mockResponse
|
|
212
|
+
} : f
|
|
213
|
+
));
|
|
214
|
+
}, 300);
|
|
215
|
+
}
|
|
216
|
+
}, 100);
|
|
217
|
+
});
|
|
218
|
+
};
|
|
219
|
+
const handleRemoveFile = (id) => {
|
|
220
|
+
setFiles((prev) => prev.filter((file) => file.id !== id));
|
|
221
|
+
};
|
|
222
|
+
const triggerFileSelect = () => {
|
|
223
|
+
if (fileInputRef.current) {
|
|
224
|
+
fileInputRef.current.click();
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
const handleDragOver = (0, import_react.useCallback)((e) => {
|
|
228
|
+
e.preventDefault();
|
|
229
|
+
e.stopPropagation();
|
|
230
|
+
if (allowUpload) {
|
|
231
|
+
setIsDragOver(true);
|
|
232
|
+
}
|
|
233
|
+
}, [allowUpload]);
|
|
234
|
+
const handleDragLeave = (0, import_react.useCallback)((e) => {
|
|
235
|
+
e.preventDefault();
|
|
236
|
+
e.stopPropagation();
|
|
237
|
+
if (allowUpload) {
|
|
238
|
+
setIsDragOver(false);
|
|
239
|
+
}
|
|
240
|
+
}, [allowUpload]);
|
|
241
|
+
const handleDrop = (0, import_react.useCallback)((e) => {
|
|
242
|
+
e.preventDefault();
|
|
243
|
+
e.stopPropagation();
|
|
244
|
+
setIsDragOver(false);
|
|
245
|
+
if (allowUpload && e.dataTransfer.files && e.dataTransfer.files.length > 0) {
|
|
246
|
+
handleFileSelect(Array.from(e.dataTransfer.files));
|
|
247
|
+
}
|
|
248
|
+
}, [allowUpload, handleFileSelect]);
|
|
249
|
+
const handleSubmit = () => {
|
|
250
|
+
if (!value.trim() && files.length === 0) {
|
|
251
|
+
import_antd.message.warning("请输入消息或选择文件");
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
const successFiles = files.filter((file) => file.status === "success");
|
|
255
|
+
const uploadingFiles = files.filter((file) => file.status === "uploading");
|
|
256
|
+
if (uploadingFiles.length > 0) {
|
|
257
|
+
import_antd.Modal.confirm({
|
|
258
|
+
title: "文件上传中",
|
|
259
|
+
content: `还有 ${uploadingFiles.length} 个文件正在上传,是否继续发送?`,
|
|
260
|
+
okText: "发送已完成的",
|
|
261
|
+
cancelText: "等待全部完成",
|
|
262
|
+
onOk: () => {
|
|
263
|
+
const formattedFiles = formatFilesForServer(successFiles);
|
|
264
|
+
if (onSubmit) {
|
|
265
|
+
onSubmit({
|
|
266
|
+
text: value,
|
|
267
|
+
files: formattedFiles
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
setValue("");
|
|
271
|
+
setFiles((prev) => prev.filter((f) => f.status !== "success"));
|
|
272
|
+
},
|
|
273
|
+
onCancel: () => {
|
|
274
|
+
import_antd.message.info("请等待文件上传完成后再发送");
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
} else {
|
|
278
|
+
const formattedFiles = formatFilesForServer(successFiles);
|
|
279
|
+
if (onSubmit) {
|
|
280
|
+
onSubmit({
|
|
281
|
+
text: value,
|
|
282
|
+
files: formattedFiles
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
setValue("");
|
|
286
|
+
setFiles((prev) => prev.filter((f) => f.status !== "success"));
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
const formatFilesForServer = (fileList) => {
|
|
290
|
+
return fileList.filter((file) => {
|
|
291
|
+
var _a;
|
|
292
|
+
return file.status === "success" && ((_a = file.response) == null ? void 0 : _a.data);
|
|
293
|
+
}).map((file) => {
|
|
294
|
+
const responseData = file.response.data;
|
|
295
|
+
return {
|
|
296
|
+
fileName: file.name,
|
|
297
|
+
fileId: responseData.fileId || responseData.id || 0,
|
|
298
|
+
tempUrl: responseData.tempUrl || responseData.url || "",
|
|
299
|
+
type: responseData.fileType || getFileExtension(file.name),
|
|
300
|
+
mimeType: file.type
|
|
301
|
+
};
|
|
302
|
+
});
|
|
303
|
+
};
|
|
304
|
+
const handleInputChange = (e) => {
|
|
305
|
+
const newValue = e.target.value;
|
|
306
|
+
setValue(newValue);
|
|
307
|
+
onChange == null ? void 0 : onChange(newValue);
|
|
308
|
+
};
|
|
309
|
+
const handleKeyDown = (e) => {
|
|
310
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
311
|
+
e.preventDefault();
|
|
312
|
+
handleSubmit();
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
const renderFileList = () => {
|
|
316
|
+
if (files.length === 0)
|
|
317
|
+
return null;
|
|
318
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.fileListArea, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.fileList, children: files.map((file) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.fileCard, children: [
|
|
319
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.fileIcon, children: getFileIcon(file.type) }),
|
|
320
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.fileInfo, children: [
|
|
321
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.fileName, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: file.name, children: file.name.length > 15 ? `${file.name.substring(0, 15)}...` : file.name }) }),
|
|
322
|
+
file.status === "uploading" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.uploadProgress, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
323
|
+
import_antd.Progress,
|
|
324
|
+
{
|
|
325
|
+
percent: file.progress,
|
|
326
|
+
size: "small",
|
|
327
|
+
showInfo: false,
|
|
328
|
+
strokeColor: "#1890ff"
|
|
329
|
+
}
|
|
330
|
+
) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.fileSize, children: formatFileSize(file.size) })
|
|
331
|
+
] }),
|
|
332
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
333
|
+
"button",
|
|
334
|
+
{
|
|
335
|
+
className: styles.fileRemoveBtn,
|
|
336
|
+
onClick: () => handleRemoveFile(file.id),
|
|
337
|
+
disabled: file.status === "uploading",
|
|
338
|
+
"aria-label": "删除文件",
|
|
339
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.CloseOutlined, { style: { fontSize: 8 } })
|
|
340
|
+
}
|
|
341
|
+
)
|
|
342
|
+
] }, file.id)) }) });
|
|
343
|
+
};
|
|
344
|
+
const containerClass = `${styles.container} ${isDragOver ? "drag-over" : ""}`;
|
|
345
|
+
const uploading = files.some((f) => f.status === "uploading");
|
|
346
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
347
|
+
"div",
|
|
348
|
+
{
|
|
349
|
+
ref: containerRef,
|
|
350
|
+
className: containerClass,
|
|
351
|
+
onDragOver: allowUpload ? handleDragOver : void 0,
|
|
352
|
+
onDragLeave: allowUpload ? handleDragLeave : void 0,
|
|
353
|
+
onDrop: allowUpload ? handleDrop : void 0,
|
|
354
|
+
children: [
|
|
355
|
+
allowUpload && files.length > 0 && renderFileList(),
|
|
356
|
+
allowUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
357
|
+
"input",
|
|
358
|
+
{
|
|
359
|
+
ref: fileInputRef,
|
|
360
|
+
type: "file",
|
|
361
|
+
multiple: true,
|
|
362
|
+
accept: allowedFileTypes.join(","),
|
|
363
|
+
style: { display: "none" },
|
|
364
|
+
onChange: (e) => {
|
|
365
|
+
if (e.target.files) {
|
|
366
|
+
handleFileSelect(Array.from(e.target.files));
|
|
367
|
+
e.target.value = "";
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
),
|
|
372
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.mainArea, children: [
|
|
373
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.senderWrap, children: [
|
|
374
|
+
clearBtnShow && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
375
|
+
import_antd.Popconfirm,
|
|
376
|
+
{
|
|
377
|
+
title: "确定要清空聊天记录吗?",
|
|
378
|
+
onConfirm: onClear,
|
|
379
|
+
placement: "top",
|
|
380
|
+
okText: "确定",
|
|
381
|
+
cancelText: "取消",
|
|
382
|
+
disabled: uploading || loading,
|
|
383
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
384
|
+
"button",
|
|
385
|
+
{
|
|
386
|
+
className: `${styles.iconButton} ${styles.clearButton}`,
|
|
387
|
+
disabled: uploading || loading,
|
|
388
|
+
"aria-label": "清空聊天记录",
|
|
389
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.ClearOutlined, {})
|
|
390
|
+
}
|
|
391
|
+
)
|
|
392
|
+
}
|
|
393
|
+
),
|
|
394
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.inputAndButtons, children: [
|
|
395
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.textAreaWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
396
|
+
import_antd.Input.TextArea,
|
|
397
|
+
{
|
|
398
|
+
className: styles.textArea,
|
|
399
|
+
value,
|
|
400
|
+
onChange: handleInputChange,
|
|
401
|
+
onKeyDown: handleKeyDown,
|
|
402
|
+
placeholder: "请输入消息...",
|
|
403
|
+
disabled: uploading || loading,
|
|
404
|
+
autoSize: { minRows: 1, maxRows: 4 },
|
|
405
|
+
style: {
|
|
406
|
+
border: "none",
|
|
407
|
+
boxShadow: "none",
|
|
408
|
+
outline: "none",
|
|
409
|
+
padding: 0
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
) }),
|
|
413
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.buttonGroup, children: [
|
|
414
|
+
allowUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: "上传文件", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
415
|
+
"button",
|
|
416
|
+
{
|
|
417
|
+
className: `${styles.iconButton} ${styles.uploadButton}`,
|
|
418
|
+
onClick: triggerFileSelect,
|
|
419
|
+
disabled: uploading || loading,
|
|
420
|
+
"aria-label": "上传文件",
|
|
421
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.PaperClipOutlined, {})
|
|
422
|
+
}
|
|
423
|
+
) }),
|
|
424
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: loading ? "停止生成" : "发送消息", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
425
|
+
"button",
|
|
426
|
+
{
|
|
427
|
+
className: `${styles.iconButton} ${styles.sendButton} ${loading ? "stop" : ""}`,
|
|
428
|
+
onClick: loading ? onStop : handleSubmit,
|
|
429
|
+
disabled: uploading,
|
|
430
|
+
"aria-label": loading ? "停止生成" : "发送消息",
|
|
431
|
+
children: loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.LoadingOutlined, {}) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.ArrowUpOutlined, {})
|
|
432
|
+
}
|
|
433
|
+
) })
|
|
434
|
+
] })
|
|
435
|
+
] })
|
|
436
|
+
] }),
|
|
437
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.tip, children: "内容由AI生成,无法确保真实准确,仅供参考" })
|
|
438
|
+
] })
|
|
439
|
+
]
|
|
440
|
+
}
|
|
441
|
+
);
|
|
442
|
+
};
|
|
443
|
+
var XAdkSender_default = XAdkSender;
|
|
444
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/XAdkSender/index.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useState, useRef, useCallback } from 'react';\nimport {\n Popconfirm, \n message, \n Progress,\n Tooltip,\n Input,\n Modal,\n Upload,\n type UploadProps\n} from 'antd';\nimport type { RcFile } from 'antd/es/upload';\nimport { \n ClearOutlined, \n LoadingOutlined, \n ArrowUpOutlined,\n PaperClipOutlined,\n CloseOutlined,\n} from '@ant-design/icons';\nimport { XAdkSenderProps, ServerFile, LocalFile } from '../../types/XAdkSender';\nimport { useStyles } from './styles';\n\n// 文件类型图标映射\nconst FILE_ICONS: Record<string, React.ReactNode> = {\n // ... 保持不变\n};\n\nconst XAdkSender: React.FC<XAdkSenderProps> = ({ \n clearBtnShow = true,\n allowUpload = false,\n loading = false,\n uploadProps = {},\n onClear,\n onChange,\n onSubmit,\n onStop,\n onFilesChange,\n maxFileSize = 10,\n allowedFileTypes = ['image/*', 'application/pdf', 'text/plain'],\n maxFiles = 5\n}) => {\n const styles = useStyles();\n const [value, setValue] = useState<string>('');\n const [files, setFiles] = useState<LocalFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadRef = useRef<any>(null);\n \n // 生成唯一ID\n const generateId = () => {\n return Date.now().toString(36) + Math.random().toString(36).substr(2);\n };\n \n // 获取文件图标\n const getFileIcon = (fileType: string) => {\n return FILE_ICONS[fileType] || FILE_ICONS.default;\n };\n \n // 格式化文件大小\n const formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return bytes + ' Bytes';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n };\n \n // 检查文件类型\n const checkFileType = (file: File): boolean => {\n if (!allowedFileTypes.length) return true;\n \n return allowedFileTypes.some(type => {\n if (type.includes('/*')) {\n const mainType = type.split('/')[0];\n return file.type.startsWith(mainType);\n }\n return file.type === type;\n });\n };\n \n // 检查文件大小\n const checkFileSize = (file: File): boolean => {\n const maxSize = maxFileSize * 1024 * 1024;\n return file.size <= maxSize;\n };\n \n // 验证文件\n const validateFile = (file: File): { valid: boolean; message?: string } => {\n if (files.length >= maxFiles) {\n return { valid: false, message: `最多只能上传 ${maxFiles} 个文件` };\n }\n \n if (!checkFileSize(file)) {\n return { valid: false, message: `文件大小不能超过 ${maxFileSize}MB` };\n }\n \n if (!checkFileType(file)) {\n return { valid: false, message: '不支持的文件类型' };\n }\n \n return { valid: true };\n };\n\n // 获取文件扩展名\n const getFileExtension = (filename: string): string => {\n const ext = filename.split('.').pop();\n return ext ? ext.toLowerCase() : '';\n };\n\n // 处理文件选择\n const handleFileSelect = useCallback((selectedFiles: File[]) => {\n const fileArray = Array.from(selectedFiles);\n const validFiles: LocalFile[] = [];\n \n fileArray.forEach(file => {\n const validation = validateFile(file);\n if (validation.valid) {\n validFiles.push({\n id: generateId(),\n uid: generateId(),\n name: file.name,\n size: file.size,\n type: file.type,\n file,\n progress: 0,\n status: 'pending',\n response: null\n });\n } else {\n message.error(validation.message);\n }\n });\n \n if (validFiles.length > 0) {\n setFiles(prev => [...prev, ...validFiles]);\n uploadFiles(validFiles);\n }\n }, [files.length, maxFiles, maxFileSize, allowedFileTypes]);\n\n // 上传文件\n const uploadFiles = async (fileList: LocalFile[]) => {\n for (const localFile of fileList) {\n // 开始上传\n setFiles(prev => prev.map(f => \n f.id === localFile.id ? { ...f, status: 'uploading' } : f\n ));\n \n try {\n // 如果外部提供了 customRequest,使用它\n if (uploadProps.customRequest) {\n // 构建 UploadRequestOption\n const rcFile: RcFile = Object.assign(localFile.file, {\n uid: localFile.uid,\n }) as RcFile;\n const options = {\n action: uploadProps.action,\n file: rcFile,\n filename: 'file',\n data: uploadProps.data,\n headers: uploadProps.headers,\n withCredentials: uploadProps.withCredentials,\n method: 'POST' as const,\n onProgress: (event: any) => {\n setFiles(prev => prev.map(f => \n f.id === localFile.id ? { ...f, progress: event.percent || 0 } : f\n ));\n },\n onSuccess: (response: any, file: any) => {\n setFiles(prev => prev.map(f => \n f.id === localFile.id ? { \n ...f, \n status: 'success', \n progress: 100,\n response \n } : f\n ));\n },\n onError: (error: ProgressEvent<EventTarget>) => {\n // 提取错误信息\n let errorMessage = '上传失败';\n if (error instanceof Error) {\n errorMessage = error.message;\n } else if (error && typeof error === 'object' && 'status' in error) {\n errorMessage = `HTTP ${error.status}`;\n }\n \n setFiles(prev => prev.map(f => \n f.id === localFile.id ? { ...f, status: 'error' } : f\n ));\n message.error(`${localFile.name} 上传失败: ${errorMessage}`);\n }\n } as any;\n \n // 调用外部传入的 customRequest\n uploadProps.customRequest(options, {\n defaultRequest: () => {\n // 默认的上传逻辑\n simulateUpload([localFile]);\n }\n });\n } else {\n // 使用默认的上传逻辑\n simulateUpload([localFile]);\n }\n } catch (error) {\n setFiles(prev => prev.map(f => \n f.id === localFile.id ? { ...f, status: 'error' } : f\n ));\n message.error(`${localFile.name} 上传失败`);\n }\n }\n };\n\n // 模拟上传过程\n const simulateUpload = async (uploadFilesList: LocalFile[]) => {\n uploadFilesList.forEach(localFile => {\n let progress = 0;\n const interval = setInterval(() => {\n progress += 10;\n setFiles(prev => prev.map(f => \n f.id === localFile.id ? { ...f, progress } : f\n ));\n \n if (progress >= 100) {\n clearInterval(interval);\n setTimeout(() => {\n // 模拟服务器响应\n const mockResponse = {\n code: 200,\n data: {\n fileId: Math.floor(Math.random() * 1000) + 1,\n tempUrl: `https://example.com/uploads/${localFile.name}`,\n fileName: localFile.name,\n fileType: getFileExtension(localFile.name)\n }\n };\n \n setFiles(prev => prev.map(f => \n f.id === localFile.id ? { \n ...f, \n status: 'success', \n progress: 100,\n response: mockResponse\n } : f\n ));\n }, 300);\n }\n }, 100);\n });\n };\n \n // 删除文件\n const handleRemoveFile = (id: string) => {\n setFiles(prev => prev.filter(file => file.id !== id));\n };\n \n // 触发文件选择\n const triggerFileSelect = () => {\n if (fileInputRef.current) {\n fileInputRef.current.click();\n }\n };\n \n // 处理拖拽事件\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(true);\n }\n }, [allowUpload]);\n \n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(false);\n }\n }, [allowUpload]);\n \n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n \n if (allowUpload && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n handleFileSelect(Array.from(e.dataTransfer.files));\n }\n }, [allowUpload, handleFileSelect]);\n \n // 处理提交\n const handleSubmit = () => {\n if (!value.trim() && files.length === 0) {\n message.warning('请输入消息或选择文件');\n return;\n }\n\n const successFiles = files.filter(file => file.status === 'success');\n const uploadingFiles = files.filter(file => file.status === 'uploading');\n \n if (uploadingFiles.length > 0) {\n Modal.confirm({\n title: '文件上传中',\n content: `还有 ${uploadingFiles.length} 个文件正在上传,是否继续发送?`,\n okText: '发送已完成的',\n cancelText: '等待全部完成',\n onOk: () => {\n const formattedFiles = formatFilesForServer(successFiles);\n if (onSubmit) {\n onSubmit({ \n text: value, \n files: formattedFiles \n });\n }\n \n setValue('');\n setFiles(prev => prev.filter(f => f.status !== 'success'));\n },\n onCancel: () => {\n message.info('请等待文件上传完成后再发送');\n },\n });\n } else {\n const formattedFiles = formatFilesForServer(successFiles);\n \n if (onSubmit) {\n onSubmit({ \n text: value, \n files: formattedFiles \n });\n }\n \n setValue('');\n setFiles(prev => prev.filter(f => f.status !== 'success'));\n }\n };\n\n // 格式化文件列表为服务端格式\n const formatFilesForServer = (fileList: LocalFile[]): ServerFile[] => {\n return fileList\n .filter(file => file.status === 'success' && file.response?.data)\n .map(file => {\n const responseData = file.response.data;\n \n return {\n fileName: file.name,\n fileId: responseData.fileId || responseData.id || 0,\n tempUrl: responseData.tempUrl || responseData.url || '',\n type: responseData.fileType || getFileExtension(file.name),\n mimeType: file.type\n };\n });\n };\n \n // 处理输入框变化\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n setValue(newValue);\n onChange?.(newValue);\n };\n \n // 处理回车键\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n \n // 渲染文件列表\n const renderFileList = () => {\n if (files.length === 0) return null;\n \n return (\n <div className={styles.fileListArea}>\n <div className={styles.fileList}>\n {files.map(file => (\n <div key={file.id} className={styles.fileCard}>\n <div className={styles.fileIcon}>\n {getFileIcon(file.type)}\n </div>\n <div className={styles.fileInfo}>\n <div className={styles.fileName}>\n <Tooltip title={file.name}>\n {file.name.length > 15 ? `${file.name.substring(0, 15)}...` : file.name}\n </Tooltip>\n </div>\n \n {file.status === 'uploading' ? (\n <div className={styles.uploadProgress}>\n <Progress \n percent={file.progress} \n size=\"small\" \n showInfo={false}\n strokeColor=\"#1890ff\"\n />\n </div>\n ) : (\n <div className={styles.fileSize}>\n {formatFileSize(file.size)}\n </div>\n )}\n </div>\n <button\n className={styles.fileRemoveBtn}\n onClick={() => handleRemoveFile(file.id)}\n disabled={file.status === 'uploading'}\n aria-label=\"删除文件\"\n >\n <CloseOutlined style={{ fontSize: 8 }} />\n </button>\n </div>\n ))}\n </div>\n </div>\n );\n };\n \n const containerClass = `${styles.container} ${isDragOver ? 'drag-over' : ''}`;\n const uploading = files.some(f => f.status === 'uploading');\n \n return (\n <div \n ref={containerRef}\n className={containerClass}\n onDragOver={allowUpload ? handleDragOver : undefined}\n onDragLeave={allowUpload ? handleDragLeave : undefined}\n onDrop={allowUpload ? handleDrop : undefined}\n >\n {allowUpload && files.length > 0 && renderFileList()}\n \n {/* 隐藏的原生 file input */}\n {allowUpload && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={allowedFileTypes.join(',')}\n style={{ display: 'none' }}\n onChange={(e) => {\n if (e.target.files) {\n handleFileSelect(Array.from(e.target.files));\n e.target.value = '';\n }\n }}\n />\n )}\n \n <div className={styles.mainArea}>\n <div className={styles.senderWrap}>\n {clearBtnShow && (\n <Popconfirm\n title=\"确定要清空聊天记录吗?\"\n onConfirm={onClear}\n placement=\"top\"\n okText=\"确定\"\n cancelText=\"取消\"\n disabled={uploading || loading}\n >\n <button\n className={`${styles.iconButton} ${styles.clearButton}`}\n disabled={uploading || loading}\n aria-label=\"清空聊天记录\"\n >\n <ClearOutlined />\n </button>\n </Popconfirm>\n )}\n \n <div className={styles.inputAndButtons}>\n <div className={styles.textAreaWrapper}>\n <Input.TextArea\n className={styles.textArea}\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder=\"请输入消息...\"\n disabled={uploading || loading}\n autoSize={{ minRows: 1, maxRows: 4 }}\n style={{\n border: 'none',\n boxShadow: 'none',\n outline: 'none',\n padding: 0,\n }}\n />\n </div>\n \n <div className={styles.buttonGroup}>\n {allowUpload && (\n <Tooltip title=\"上传文件\">\n <button\n className={`${styles.iconButton} ${styles.uploadButton}`}\n onClick={triggerFileSelect}\n disabled={uploading || loading}\n aria-label=\"上传文件\"\n >\n <PaperClipOutlined />\n </button>\n </Tooltip>\n )}\n \n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? 'stop' : ''}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n >\n {loading ? <LoadingOutlined /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n </div>\n </div>\n </div>\n \n <div className={styles.tip}>\n 内容由AI生成,无法确保真实准确,仅供参考\n </div>\n </div>\n </div>\n );\n};\n\nexport default XAdkSender;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export declare const useStyles: () => {
|
|
2
|
+
container: string;
|
|
3
|
+
fileListArea: string;
|
|
4
|
+
fileList: string;
|
|
5
|
+
fileCard: string;
|
|
6
|
+
fileSize: string;
|
|
7
|
+
uploadProgress: string;
|
|
8
|
+
fileIcon: string;
|
|
9
|
+
fileInfo: string;
|
|
10
|
+
fileName: string;
|
|
11
|
+
fileRemoveBtn: string;
|
|
12
|
+
mainArea: string;
|
|
13
|
+
senderWrap: string;
|
|
14
|
+
inputAndButtons: string;
|
|
15
|
+
textAreaWrapper: string;
|
|
16
|
+
textArea: string;
|
|
17
|
+
buttonGroup: string;
|
|
18
|
+
iconButton: string;
|
|
19
|
+
clearButton: string;
|
|
20
|
+
uploadButton: string;
|
|
21
|
+
sendButton: string;
|
|
22
|
+
tip: string;
|
|
23
|
+
} & {
|
|
24
|
+
w: (width: string | number) => string;
|
|
25
|
+
h: (height: string | number) => string;
|
|
26
|
+
p: (padding: string) => string;
|
|
27
|
+
pb: (padding: string | number) => string;
|
|
28
|
+
pt: (padding: string | number) => string;
|
|
29
|
+
pl: (padding: string | number) => string;
|
|
30
|
+
pr: (padding: string | number) => string;
|
|
31
|
+
m: (margin: string) => string;
|
|
32
|
+
mb: (margin: string | number) => string;
|
|
33
|
+
mt: (margin: string | number) => string;
|
|
34
|
+
ml: (margin: string | number) => string;
|
|
35
|
+
mr: (margin: string | number) => string;
|
|
36
|
+
text: (size: string | number) => string;
|
|
37
|
+
weight: (size: number) => string;
|
|
38
|
+
textColor: (c: string) => string;
|
|
39
|
+
bg: (c: string) => string;
|
|
40
|
+
rs: (radius: string | number) => string;
|
|
41
|
+
gap: (g: string | number) => string;
|
|
42
|
+
flex: string;
|
|
43
|
+
flexCenter: string;
|
|
44
|
+
flexBetween: string;
|
|
45
|
+
flexColumn: string;
|
|
46
|
+
flex1: string;
|
|
47
|
+
cursor: (type: string) => string;
|
|
48
|
+
border: (color: string, width?: string) => string;
|
|
49
|
+
boxShadow: (shadow: string) => string;
|
|
50
|
+
transition: (property?: string, duration?: string) => string;
|
|
51
|
+
overflow: (type: string) => string;
|
|
52
|
+
position: (type: string) => string;
|
|
53
|
+
zIndex: (index: number) => string;
|
|
54
|
+
flexCenterGap2: string;
|
|
55
|
+
flexCenterGap4: string;
|
|
56
|
+
};
|