@ai-group/chat-sdk 3.0.2 → 3.0.4

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.
@@ -1,7 +1,7 @@
1
1
  import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
2
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
- import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
4
3
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
+ import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
5
5
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
6
6
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
7
7
  import React, { useState, useRef, useCallback } from "react";
@@ -9,6 +9,7 @@ import { Popconfirm, message, Tooltip, Input, Modal } from "antd";
9
9
  import { ClearOutlined, LoadingOutlined, ArrowUpOutlined, PaperClipOutlined } from "@ant-design/icons";
10
10
  import { useStyles } from "./styles";
11
11
  import FileGallery from "../FileGallery";
12
+ import { getExt } from "../../utils/file";
12
13
  import { jsx as _jsx } from "react/jsx-runtime";
13
14
  import { jsxs as _jsxs } from "react/jsx-runtime";
14
15
  var XAdkSender = function XAdkSender(_ref) {
@@ -27,10 +28,14 @@ var XAdkSender = function XAdkSender(_ref) {
27
28
  onSubmit = _ref.onSubmit,
28
29
  onStop = _ref.onStop,
29
30
  onFilesChange = _ref.onFilesChange,
31
+ onUploadSuccess = _ref.onUploadSuccess,
32
+ onUploadError = _ref.onUploadError,
30
33
  _ref$maxFileSize = _ref.maxFileSize,
31
34
  maxFileSize = _ref$maxFileSize === void 0 ? 10 : _ref$maxFileSize,
35
+ _ref$validators = _ref.validators,
36
+ customValidators = _ref$validators === void 0 ? [] : _ref$validators,
32
37
  _ref$allowedFileTypes = _ref.allowedFileTypes,
33
- allowedFileTypes = _ref$allowedFileTypes === void 0 ? ["image/*", "audio/*", "video/*", "application/pdf", "text/plain", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx"] : _ref$allowedFileTypes,
38
+ allowedFileTypes = _ref$allowedFileTypes === void 0 ? [] : _ref$allowedFileTypes,
34
39
  _ref$maxFiles = _ref.maxFiles,
35
40
  maxFiles = _ref$maxFiles === void 0 ? 5 : _ref$maxFiles,
36
41
  suffix = _ref.suffix,
@@ -52,7 +57,6 @@ var XAdkSender = function XAdkSender(_ref) {
52
57
  setIsDragOver = _useState6[1];
53
58
  var containerRef = useRef(null);
54
59
  var fileInputRef = useRef(null);
55
- var uploadRef = useRef(null);
56
60
 
57
61
  // 生成唯一ID
58
62
  var generateId = function generateId() {
@@ -61,14 +65,23 @@ var XAdkSender = function XAdkSender(_ref) {
61
65
 
62
66
  // 检查文件类型
63
67
  var checkFileType = function checkFileType(file) {
64
- if (!allowedFileTypes.length) return true;
65
- return allowedFileTypes.some(function (type) {
66
- if (type.includes("/*")) {
67
- var mainType = type.split("/")[0];
68
- return file.type.startsWith(mainType);
69
- }
70
- return file.type === type;
71
- });
68
+ if ((allowedFileTypes === null || allowedFileTypes === void 0 ? void 0 : allowedFileTypes.length) > 0) {
69
+ var ext = getExt(file);
70
+ return allowedFileTypes.some(function (type) {
71
+ // 1️⃣ MIME 校验
72
+ if (type.includes("/")) {
73
+ if (type.endsWith("/*")) {
74
+ return file.type.startsWith(type.split("/")[0]);
75
+ }
76
+ return file.type === type;
77
+ }
78
+ if (type.startsWith(".")) {
79
+ return ext === type.slice(1);
80
+ }
81
+ return false;
82
+ });
83
+ }
84
+ return true;
72
85
  };
73
86
 
74
87
  // 检查文件大小
@@ -77,40 +90,82 @@ var XAdkSender = function XAdkSender(_ref) {
77
90
  return file.size <= maxSize;
78
91
  };
79
92
 
80
- // 验证文件
81
- var validateFile = function validateFile(file) {
93
+ // 重复文件检测
94
+ var isDuplicateFile = function isDuplicateFile(file, files) {
95
+ return files.some(function (f) {
96
+ return f.name === file.name && f.size === file.size;
97
+ });
98
+ };
99
+
100
+ // 内置校验器集合
101
+ var builtInValidators = [
102
+ // 数量校验(修复批量 bug)
103
+ function (_file, _ref2) {
104
+ var files = _ref2.files;
82
105
  if (files.length >= maxFiles) {
83
- return {
84
- valid: false,
85
- message: "\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ".concat(maxFiles, " \u4E2A\u6587\u4EF6")
86
- };
106
+ return "\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ".concat(maxFiles, " \u4E2A\u6587\u4EF6");
87
107
  }
88
- if (!checkFileSize(file)) {
89
- return {
90
- valid: false,
91
- message: "\u6587\u4EF6\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC7 ".concat(maxFileSize, "MB")
92
- };
108
+ return null;
109
+ },
110
+ // 大小校验
111
+ function (file) {
112
+ var maxSize = maxFileSize * 1024 * 1024;
113
+ if (file.size > maxSize) {
114
+ return "\u6587\u4EF6\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC7 ".concat(maxFileSize, "MB");
93
115
  }
116
+ return null;
117
+ },
118
+ // 类型校验
119
+ function (file) {
94
120
  if (!checkFileType(file)) {
95
- return {
96
- valid: false,
97
- message: "不支持的文件类型"
98
- };
121
+ return "不支持的文件类型";
122
+ }
123
+ return null;
124
+ },
125
+ // ⭐ 新增:去重校验
126
+ function (file, _ref3) {
127
+ var files = _ref3.files;
128
+ if (isDuplicateFile(file, files)) {
129
+ return "文件已存在";
130
+ }
131
+ return null;
132
+ }];
133
+ var allValidators = [].concat(builtInValidators, _toConsumableArray(customValidators));
134
+
135
+ // 验证文件
136
+ var validateFile = function validateFile(file) {
137
+ var _iterator = _createForOfIteratorHelper(allValidators),
138
+ _step;
139
+ try {
140
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
141
+ var validator = _step.value;
142
+ var error = validator(file, {
143
+ files: files
144
+ });
145
+ if (error) {
146
+ return {
147
+ valid: false,
148
+ message: error
149
+ };
150
+ }
151
+ }
152
+ } catch (err) {
153
+ _iterator.e(err);
154
+ } finally {
155
+ _iterator.f();
99
156
  }
100
157
  return {
101
158
  valid: true
102
159
  };
103
160
  };
104
161
 
105
- // 获取文件扩展名
106
- var getFileExtension = function getFileExtension(filename) {
107
- var ext = filename.split(".").pop();
108
- return ext ? ext.toLowerCase() : "";
109
- };
110
-
111
162
  // 处理文件选择
112
163
  var handleFileSelect = useCallback(function (selectedFiles) {
113
164
  var fileArray = Array.from(selectedFiles);
165
+ if (files.length + fileArray.length > maxFiles) {
166
+ message.error("\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ".concat(maxFiles, " \u4E2A\u6587\u4EF6"));
167
+ return;
168
+ }
114
169
  var validFiles = [];
115
170
  fileArray.forEach(function (file) {
116
171
  var validation = validateFile(file);
@@ -132,27 +187,29 @@ var XAdkSender = function XAdkSender(_ref) {
132
187
  });
133
188
  if (validFiles.length > 0) {
134
189
  setFiles(function (prev) {
135
- return [].concat(_toConsumableArray(prev), validFiles);
190
+ var next = [].concat(_toConsumableArray(prev), validFiles);
191
+ onFilesChange === null || onFilesChange === void 0 || onFilesChange(next);
192
+ return next;
136
193
  });
137
194
  uploadFiles(validFiles);
138
195
  }
139
- }, [files.length, maxFiles, maxFileSize, allowedFileTypes]);
196
+ }, [files, maxFiles, maxFileSize, allowedFileTypes]);
140
197
 
141
198
  // 上传文件
142
199
  var uploadFiles = /*#__PURE__*/function () {
143
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(fileList) {
144
- var _iterator, _step, _loop;
200
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(fileList) {
201
+ var _iterator2, _step2, _loop;
145
202
  return _regeneratorRuntime().wrap(function _callee$(_context2) {
146
203
  while (1) switch (_context2.prev = _context2.next) {
147
204
  case 0:
148
- _iterator = _createForOfIteratorHelper(fileList);
205
+ _iterator2 = _createForOfIteratorHelper(fileList);
149
206
  _context2.prev = 1;
150
207
  _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop() {
151
208
  var localFile;
152
209
  return _regeneratorRuntime().wrap(function _loop$(_context) {
153
210
  while (1) switch (_context.prev = _context.next) {
154
211
  case 0:
155
- localFile = _step.value;
212
+ localFile = _step2.value;
156
213
  // 开始上传
157
214
  setFiles(function (prev) {
158
215
  return prev.map(function (f) {
@@ -184,17 +241,21 @@ var XAdkSender = function XAdkSender(_ref) {
184
241
  }) : f;
185
242
  });
186
243
  });
244
+ onUploadSuccess === null || onUploadSuccess === void 0 || onUploadSuccess(_objectSpread(_objectSpread({}, localFile), {}, {
245
+ status: "success",
246
+ response: response
247
+ }));
187
248
  },
188
249
  onError: function onError(error) {
189
250
  setFiles(function (prev) {
190
251
  return prev.map(function (f) {
191
252
  return f.id === localFile.id ? _objectSpread(_objectSpread({}, f), {}, {
192
253
  status: "error",
193
- errorMessage: error.message || "上传失败"
254
+ errorMessage: error.message
194
255
  }) : f;
195
256
  });
196
257
  });
197
- message.error("".concat(localFile.name, " \u4E0A\u4F20\u5931\u8D25: ").concat(error.message || "未知错误"));
258
+ onUploadError === null || onUploadError === void 0 || onUploadError(localFile, error);
198
259
  }
199
260
  });
200
261
  case 5:
@@ -219,9 +280,9 @@ var XAdkSender = function XAdkSender(_ref) {
219
280
  }
220
281
  }, _loop, null, [[2, 7]]);
221
282
  });
222
- _iterator.s();
283
+ _iterator2.s();
223
284
  case 4:
224
- if ((_step = _iterator.n()).done) {
285
+ if ((_step2 = _iterator2.n()).done) {
225
286
  _context2.next = 8;
226
287
  break;
227
288
  }
@@ -235,10 +296,10 @@ var XAdkSender = function XAdkSender(_ref) {
235
296
  case 10:
236
297
  _context2.prev = 10;
237
298
  _context2.t1 = _context2["catch"](1);
238
- _iterator.e(_context2.t1);
299
+ _iterator2.e(_context2.t1);
239
300
  case 13:
240
301
  _context2.prev = 13;
241
- _iterator.f();
302
+ _iterator2.f();
242
303
  return _context2.finish(13);
243
304
  case 16:
244
305
  case "end":
@@ -247,70 +308,18 @@ var XAdkSender = function XAdkSender(_ref) {
247
308
  }, _callee, null, [[1, 10, 13, 16]]);
248
309
  }));
249
310
  return function uploadFiles(_x) {
250
- return _ref2.apply(this, arguments);
251
- };
252
- }();
253
-
254
- // 模拟上传过程
255
- var simulateUpload = /*#__PURE__*/function () {
256
- var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(uploadFilesList) {
257
- return _regeneratorRuntime().wrap(function _callee2$(_context3) {
258
- while (1) switch (_context3.prev = _context3.next) {
259
- case 0:
260
- uploadFilesList.forEach(function (localFile) {
261
- var progress = 0;
262
- var interval = setInterval(function () {
263
- progress += 10;
264
- setFiles(function (prev) {
265
- return prev.map(function (f) {
266
- return f.id === localFile.id ? _objectSpread(_objectSpread({}, f), {}, {
267
- progress: progress
268
- }) : f;
269
- });
270
- });
271
- if (progress >= 100) {
272
- clearInterval(interval);
273
- setTimeout(function () {
274
- // 模拟服务器响应
275
- var mockResponse = {
276
- code: 200,
277
- data: {
278
- fileId: Math.floor(Math.random() * 1000) + 1,
279
- tempUrl: "https://example.com/uploads/".concat(localFile.name),
280
- fileName: localFile.name,
281
- fileType: getFileExtension(localFile.name)
282
- }
283
- };
284
- setFiles(function (prev) {
285
- return prev.map(function (f) {
286
- return f.id === localFile.id ? _objectSpread(_objectSpread({}, f), {}, {
287
- status: "success",
288
- progress: 100,
289
- response: mockResponse
290
- }) : f;
291
- });
292
- });
293
- }, 300);
294
- }
295
- }, 100);
296
- });
297
- case 1:
298
- case "end":
299
- return _context3.stop();
300
- }
301
- }, _callee2);
302
- }));
303
- return function simulateUpload(_x2) {
304
- return _ref3.apply(this, arguments);
311
+ return _ref4.apply(this, arguments);
305
312
  };
306
313
  }();
307
314
 
308
315
  // 删除文件
309
316
  var handleRemoveFile = function handleRemoveFile(id) {
310
317
  setFiles(function (prev) {
311
- return prev.filter(function (file) {
318
+ var next = prev.filter(function (file) {
312
319
  return file.id !== id;
313
320
  });
321
+ onFilesChange === null || onFilesChange === void 0 || onFilesChange(next);
322
+ return next;
314
323
  });
315
324
  };
316
325
 
@@ -410,7 +419,7 @@ var XAdkSender = function XAdkSender(_ref) {
410
419
  fileName: file.name,
411
420
  fileId: responseData.fileId || responseData.id || 0,
412
421
  tempUrl: responseData.tempUrl || responseData.url || "",
413
- type: responseData.fileType || getFileExtension(file.name),
422
+ type: responseData.fileType || getExt(file),
414
423
  mimeType: file.type
415
424
  };
416
425
  });
@@ -1 +1 @@
1
- {"version":3,"names":["React","useState","useRef","useCallback","Popconfirm","message","Tooltip","Input","Modal","ClearOutlined","LoadingOutlined","ArrowUpOutlined","PaperClipOutlined","useStyles","FileGallery","jsx","_jsx","jsxs","_jsxs","XAdkSender","_ref","_ref$clearBtnShow","clearBtnShow","_ref$allowUpload","allowUpload","_ref$loading","loading","_ref$disabled","disabled","_ref$uploadRequest","uploadRequest","onClear","onChange","onSubmit","onStop","onFilesChange","_ref$maxFileSize","maxFileSize","_ref$allowedFileTypes","allowedFileTypes","_ref$maxFiles","maxFiles","suffix","header","prefix","footer","styles","_useState","_useState2","_slicedToArray","value","setValue","_useState3","_useState4","files","setFiles","_useState5","_useState6","isDragOver","setIsDragOver","containerRef","fileInputRef","uploadRef","generateId","Date","now","toString","Math","random","substr","checkFileType","file","length","some","type","includes","mainType","split","startsWith","checkFileSize","maxSize","size","validateFile","valid","concat","getFileExtension","filename","ext","pop","toLowerCase","handleFileSelect","selectedFiles","fileArray","Array","from","validFiles","forEach","validation","push","id","uid","name","progress","status","response","error","prev","_toConsumableArray","uploadFiles","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","fileList","_iterator","_step","_loop","wrap","_callee$","_context2","next","_createForOfIteratorHelper","localFile","_loop$","_context","map","f","_objectSpread","onProgress","e","percent","onSuccess","onError","errorMessage","t0","console","Error","stop","s","n","done","delegateYield","t1","finish","_x","apply","arguments","simulateUpload","_ref3","_callee2","uploadFilesList","_callee2$","_context3","interval","setInterval","clearInterval","setTimeout","mockResponse","code","data","fileId","floor","tempUrl","fileName","fileType","_x2","handleRemoveFile","filter","triggerFileSelect","current","click","handleDragOver","preventDefault","stopPropagation","handleDragLeave","handleDrop","dataTransfer","handleSubmit","trim","warning","successFiles","uploadingFiles","confirm","title","content","okText","cancelText","onOk","formattedFiles","formatFilesForServer","text","onCancel","info","_file$response","responseData","url","mimeType","handleInputChange","newValue","target","handleKeyDown","key","shiftKey","renderFileList","removable","onRemove","containerClass","container","uploading","isDisabled","SendButton","props","children","className","iconButton","sendButton","onClick","UploadButton","uploadButton","ClearButton","onConfirm","placement","clearButton","actionsComponents","renderSlot","slot","oriNode","undefined","result","components","defaultSuffix","buttonGroup","ref","onDragOver","onDragLeave","onDrop","multiple","accept","join","style","display","mainArea","senderWrap","inputAndButtons","textAreaWrapper","TextArea","textArea","onKeyDown","placeholder","autoSize","minRows","maxRows","border","boxShadow","outline","padding","tip"],"sources":["../../../../src/components/XAdkSender/index.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback } from \"react\";\nimport { Popconfirm, message, Progress, Tooltip, Input, Modal } from \"antd\";\nimport {\n ClearOutlined,\n LoadingOutlined,\n ArrowUpOutlined,\n PaperClipOutlined,\n CloseOutlined,\n} from \"@ant-design/icons\";\nimport {\n XAdkSenderProps,\n ServerFile,\n LocalFile,\n ActionsComponents,\n} from \"../../types/XAdkSender\";\nimport { useStyles } from \"./styles\";\nimport FileGallery from \"../FileGallery\";\n\nconst XAdkSender: React.FC<XAdkSenderProps> = ({\n clearBtnShow = true,\n allowUpload = false,\n loading = false,\n disabled = false,\n uploadRequest = () => {},\n onClear,\n onChange,\n onSubmit,\n onStop,\n onFilesChange,\n maxFileSize = 10,\n allowedFileTypes = [\n \"image/*\",\n \"audio/*\",\n \"video/*\",\n \"application/pdf\",\n \"text/plain\",\n \".doc\",\n \".docx\",\n \".xls\",\n \".xlsx\",\n \".ppt\",\n \".pptx\",\n ],\n maxFiles = 5,\n suffix,\n header,\n prefix,\n footer,\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 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(\n (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 },\n [files.length, maxFiles, maxFileSize, allowedFileTypes],\n );\n\n // 上传文件\n const uploadFiles = async (fileList: LocalFile[]) => {\n for (const localFile of fileList) {\n // 开始上传\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, status: \"uploading\" } : f,\n ),\n );\n\n try {\n await uploadRequest({\n file: localFile.file,\n onProgress: (e) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, progress: e.percent } : f,\n ),\n );\n },\n onSuccess: (response) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"success\",\n progress: 100,\n response,\n }\n : f,\n ),\n );\n },\n onError: (error) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage: error.message || \"上传失败\",\n }\n : f,\n ),\n );\n message.error(\n `${localFile.name} 上传失败: ${error.message || \"未知错误\"}`,\n );\n },\n });\n } catch (error) {\n console.error(\"上传处理错误:\", error);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage:\n error instanceof Error ? error.message : \"上传处理失败\",\n }\n : f,\n ),\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) =>\n prev.map((f) => (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) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"success\",\n progress: 100,\n response: mockResponse,\n }\n : f,\n ),\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(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(true);\n }\n },\n [allowUpload],\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(false);\n }\n },\n [allowUpload],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (\n allowUpload &&\n e.dataTransfer.files &&\n e.dataTransfer.files.length > 0\n ) {\n handleFileSelect(Array.from(e.dataTransfer.files));\n }\n },\n [allowUpload, handleFileSelect],\n );\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 // 渲染文件列表 - 使用新的 FileGallery 组件\n const renderFileList = () => {\n if (files.length === 0) return null;\n\n return <FileGallery files={files} removable onRemove={handleRemoveFile} />;\n };\n\n const containerClass = `${styles.container} ${isDragOver ? \"drag-over\" : \"\"}`;\n const uploading = files.some((f) => f.status === \"uploading\");\n const isDisabled = disabled || uploading || loading;\n\n // 定义按钮组件\n const SendButton = (props: any) => (\n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? \"stop\" : \"\"}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading || disabled}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n {...props}\n >\n {loading ? <LoadingOutlined /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n );\n\n const UploadButton = (props: any) => (\n <Tooltip title=\"上传文件\">\n <button\n className={`${styles.iconButton} ${styles.uploadButton}`}\n onClick={triggerFileSelect}\n disabled={isDisabled}\n aria-label=\"上传文件\"\n {...props}\n >\n <PaperClipOutlined />\n </button>\n </Tooltip>\n );\n\n const ClearButton = (props: any) => (\n <Popconfirm\n title=\"确定要清空聊天记录吗?\"\n onConfirm={onClear}\n placement=\"top\"\n okText=\"确定\"\n cancelText=\"取消\"\n disabled={isDisabled}\n >\n <button\n className={`${styles.iconButton} ${styles.clearButton}`}\n disabled={isDisabled}\n aria-label=\"清空聊天记录\"\n {...props}\n >\n <ClearOutlined />\n </button>\n </Popconfirm>\n );\n\n const actionsComponents: ActionsComponents = {\n SendButton,\n UploadButton,\n ClearButton,\n };\n\n // 渲染插槽内容\n const renderSlot = (\n slot:\n | React.ReactNode\n | false\n | ((\n oriNode: React.ReactNode,\n info: { components: ActionsComponents },\n ) => React.ReactNode | false)\n | undefined,\n oriNode: React.ReactNode,\n ): React.ReactNode | null => {\n if (slot === false) return null;\n if (slot === undefined) return oriNode;\n if (typeof slot === \"function\") {\n const result = slot(oriNode, { components: actionsComponents });\n return result === false ? null : result;\n }\n return slot;\n };\n\n // 默认的后缀内容(操作按钮组)\n const defaultSuffix = (\n <div className={styles.buttonGroup}>\n {allowUpload && <UploadButton />}\n <SendButton />\n </div>\n );\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 {/* 头部插槽 */}\n {renderSlot(header, false)}\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 {/* 清除按钮 */}\n {clearBtnShow && <ClearButton />}\n\n <div className={styles.inputAndButtons}>\n {/* 前缀插槽 */}\n {renderSlot(prefix, false)}\n\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={isDisabled}\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 {/* 后缀插槽(默认显示操作按钮) */}\n {renderSlot(suffix, defaultSuffix)}\n </div>\n </div>\n\n {/* 底部插槽(默认显示提示文字) */}\n {renderSlot(\n footer,\n <div className={styles.tip}>\n 内容由AI生成,无法确保真实准确,仅供参考\n </div>,\n )}\n </div>\n </div>\n );\n};\n\nexport default XAdkSender;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useState","useRef","useCallback","Popconfirm","message","Tooltip","Input","Modal","ClearOutlined","LoadingOutlined","ArrowUpOutlined","PaperClipOutlined","useStyles","FileGallery","getExt","jsx","_jsx","jsxs","_jsxs","XAdkSender","_ref","_ref$clearBtnShow","clearBtnShow","_ref$allowUpload","allowUpload","_ref$loading","loading","_ref$disabled","disabled","_ref$uploadRequest","uploadRequest","onClear","onChange","onSubmit","onStop","onFilesChange","onUploadSuccess","onUploadError","_ref$maxFileSize","maxFileSize","_ref$validators","validators","customValidators","_ref$allowedFileTypes","allowedFileTypes","_ref$maxFiles","maxFiles","suffix","header","prefix","footer","styles","_useState","_useState2","_slicedToArray","value","setValue","_useState3","_useState4","files","setFiles","_useState5","_useState6","isDragOver","setIsDragOver","containerRef","fileInputRef","generateId","Date","now","toString","Math","random","substr","checkFileType","file","length","ext","some","type","includes","endsWith","startsWith","split","slice","checkFileSize","maxSize","size","isDuplicateFile","f","name","builtInValidators","_file","_ref2","concat","_ref3","allValidators","_toConsumableArray","validateFile","_iterator","_createForOfIteratorHelper","_step","s","n","done","validator","error","valid","err","e","handleFileSelect","selectedFiles","fileArray","Array","from","validFiles","forEach","validation","push","id","uid","progress","status","response","prev","next","uploadFiles","_ref4","_asyncToGenerator","_regeneratorRuntime","mark","_callee","fileList","_iterator2","_step2","_loop","wrap","_callee$","_context2","localFile","_loop$","_context","map","_objectSpread","onProgress","percent","onSuccess","onError","errorMessage","t0","console","Error","stop","delegateYield","t1","finish","_x","apply","arguments","handleRemoveFile","filter","triggerFileSelect","current","click","handleDragOver","preventDefault","stopPropagation","handleDragLeave","handleDrop","dataTransfer","handleSubmit","trim","warning","successFiles","uploadingFiles","confirm","title","content","okText","cancelText","onOk","formattedFiles","formatFilesForServer","text","onCancel","info","_file$response","data","responseData","fileName","fileId","tempUrl","url","fileType","mimeType","handleInputChange","newValue","target","handleKeyDown","key","shiftKey","renderFileList","removable","onRemove","containerClass","container","uploading","isDisabled","SendButton","props","children","className","iconButton","sendButton","onClick","UploadButton","uploadButton","ClearButton","onConfirm","placement","clearButton","actionsComponents","renderSlot","slot","oriNode","undefined","result","components","defaultSuffix","buttonGroup","ref","onDragOver","onDragLeave","onDrop","multiple","accept","join","style","display","mainArea","senderWrap","inputAndButtons","textAreaWrapper","TextArea","textArea","onKeyDown","placeholder","autoSize","minRows","maxRows","border","boxShadow","outline","padding","tip"],"sources":["../../../../src/components/XAdkSender/index.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback } from \"react\";\nimport { Popconfirm, message, Tooltip, Input, Modal } from \"antd\";\nimport {\n ClearOutlined,\n LoadingOutlined,\n ArrowUpOutlined,\n PaperClipOutlined,\n} from \"@ant-design/icons\";\nimport {\n XAdkSenderProps,\n ServerFile,\n LocalFile,\n ActionsComponents,\n FileValidator,\n} from \"@/types\";\nimport { useStyles } from \"./styles\";\nimport FileGallery from \"../FileGallery\";\nimport { getExt } from \"@/utils/file\";\n\nconst XAdkSender: React.FC<XAdkSenderProps> = ({\n clearBtnShow = true,\n allowUpload = false,\n loading = false,\n disabled = false,\n uploadRequest = () => {},\n onClear,\n onChange,\n onSubmit,\n onStop,\n onFilesChange,\n onUploadSuccess,\n onUploadError,\n maxFileSize = 10,\n validators: customValidators = [],\n // allowedFileTypes = [\n // \"image/*\",\n // \"audio/*\",\n // \"video/*\",\n // \"application/pdf\",\n // \"text/plain\",\n // \".doc\",\n // \".docx\",\n // \".xls\",\n // \".xlsx\",\n // \".ppt\",\n // \".pptx\",\n // \"\",\n // ],\n allowedFileTypes = [],\n maxFiles = 5,\n suffix,\n header,\n prefix,\n footer,\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\n // 生成唯一ID\n const generateId = () => {\n return Date.now().toString(36) + Math.random().toString(36).substr(2);\n };\n\n // 检查文件类型\n const checkFileType = (file: File): boolean => {\n if (allowedFileTypes?.length > 0) {\n const ext = getExt(file);\n\n return allowedFileTypes.some((type) => {\n // 1️⃣ MIME 校验\n if (type.includes(\"/\")) {\n if (type.endsWith(\"/*\")) {\n return file.type.startsWith(type.split(\"/\")[0]);\n }\n return file.type === type;\n }\n\n if (type.startsWith(\".\")) {\n return ext === type.slice(1);\n }\n\n return false;\n });\n }\n return true;\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 isDuplicateFile = (file: File, files: LocalFile[]) => {\n return files.some((f) => f.name === file.name && f.size === file.size);\n };\n\n // 内置校验器集合\n const builtInValidators: FileValidator[] = [\n // 数量校验(修复批量 bug)\n (_file, { files }) => {\n if (files.length >= maxFiles) {\n return `最多只能上传 ${maxFiles} 个文件`;\n }\n return null;\n },\n\n // 大小校验\n (file) => {\n const maxSize = maxFileSize * 1024 * 1024;\n if (file.size > maxSize) {\n return `文件大小不能超过 ${maxFileSize}MB`;\n }\n return null;\n },\n\n // 类型校验\n (file) => {\n if (!checkFileType(file)) {\n return \"不支持的文件类型\";\n }\n return null;\n },\n\n // ⭐ 新增:去重校验\n (file, { files }) => {\n if (isDuplicateFile(file, files)) {\n return \"文件已存在\";\n }\n return null;\n },\n ];\n\n const allValidators = [...builtInValidators, ...customValidators];\n\n // 验证文件\n const validateFile = (file: File): { valid: boolean; message?: string } => {\n for (const validator of allValidators) {\n const error = validator(file, { files });\n if (error) {\n return { valid: false, message: error };\n }\n }\n return { valid: true };\n };\n\n // 处理文件选择\n const handleFileSelect = useCallback(\n (selectedFiles: File[]) => {\n const fileArray = Array.from(selectedFiles);\n\n if (files.length + fileArray.length > maxFiles) {\n message.error(`最多只能上传 ${maxFiles} 个文件`);\n return;\n }\n\n const validFiles: LocalFile[] = [];\n\n fileArray.forEach((file) => {\n const validation = validateFile(file);\n\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) => {\n const next = [...prev, ...validFiles];\n onFilesChange?.(next);\n return next;\n });\n uploadFiles(validFiles);\n }\n },\n [files, maxFiles, maxFileSize, allowedFileTypes],\n );\n\n // 上传文件\n const uploadFiles = async (fileList: LocalFile[]) => {\n for (const localFile of fileList) {\n // 开始上传\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, status: \"uploading\" } : f,\n ),\n );\n\n try {\n await uploadRequest({\n file: localFile.file,\n onProgress: (e) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, progress: e.percent } : f,\n ),\n );\n },\n onSuccess: (response) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"success\",\n progress: 100,\n response,\n }\n : f,\n ),\n );\n\n onUploadSuccess?.({\n ...localFile,\n status: \"success\",\n response,\n });\n },\n onError: (error) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage: error.message,\n }\n : f,\n ),\n );\n onUploadError?.(localFile, error);\n },\n });\n } catch (error) {\n console.error(\"上传处理错误:\", error);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage:\n error instanceof Error ? error.message : \"上传处理失败\",\n }\n : f,\n ),\n );\n message.error(`${localFile.name} 上传失败`);\n }\n }\n };\n\n // 删除文件\n const handleRemoveFile = (id: string) => {\n setFiles((prev) => {\n const next = prev.filter((file) => file.id !== id);\n\n onFilesChange?.(next);\n\n return next;\n });\n };\n\n // 触发文件选择\n const triggerFileSelect = () => {\n if (fileInputRef.current) {\n fileInputRef.current.click();\n }\n };\n\n // 处理拖拽事件\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(true);\n }\n },\n [allowUpload],\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(false);\n }\n },\n [allowUpload],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (\n allowUpload &&\n e.dataTransfer.files &&\n e.dataTransfer.files.length > 0\n ) {\n handleFileSelect(Array.from(e.dataTransfer.files));\n }\n },\n [allowUpload, handleFileSelect],\n );\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 || getExt(file),\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 // 渲染文件列表 - 使用新的 FileGallery 组件\n const renderFileList = () => {\n if (files.length === 0) return null;\n\n return <FileGallery files={files} removable onRemove={handleRemoveFile} />;\n };\n\n const containerClass = `${styles.container} ${isDragOver ? \"drag-over\" : \"\"}`;\n const uploading = files.some((f) => f.status === \"uploading\");\n const isDisabled = disabled || uploading || loading;\n\n // 定义按钮组件\n const SendButton = (props: any) => (\n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? \"stop\" : \"\"}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading || disabled}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n {...props}\n >\n {loading ? <LoadingOutlined /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n );\n\n const UploadButton = (props: any) => (\n <Tooltip title=\"上传文件\">\n <button\n className={`${styles.iconButton} ${styles.uploadButton}`}\n onClick={triggerFileSelect}\n disabled={isDisabled}\n aria-label=\"上传文件\"\n {...props}\n >\n <PaperClipOutlined />\n </button>\n </Tooltip>\n );\n\n const ClearButton = (props: any) => (\n <Popconfirm\n title=\"确定要清空聊天记录吗?\"\n onConfirm={onClear}\n placement=\"top\"\n okText=\"确定\"\n cancelText=\"取消\"\n disabled={isDisabled}\n >\n <button\n className={`${styles.iconButton} ${styles.clearButton}`}\n disabled={isDisabled}\n aria-label=\"清空聊天记录\"\n {...props}\n >\n <ClearOutlined />\n </button>\n </Popconfirm>\n );\n\n const actionsComponents: ActionsComponents = {\n SendButton,\n UploadButton,\n ClearButton,\n };\n\n // 渲染插槽内容\n const renderSlot = (\n slot:\n | React.ReactNode\n | false\n | ((\n oriNode: React.ReactNode,\n info: { components: ActionsComponents },\n ) => React.ReactNode | false)\n | undefined,\n oriNode: React.ReactNode,\n ): React.ReactNode | null => {\n if (slot === false) return null;\n if (slot === undefined) return oriNode;\n if (typeof slot === \"function\") {\n const result = slot(oriNode, { components: actionsComponents });\n return result === false ? null : result;\n }\n return slot;\n };\n\n // 默认的后缀内容(操作按钮组)\n const defaultSuffix = (\n <div className={styles.buttonGroup}>\n {allowUpload && <UploadButton />}\n <SendButton />\n </div>\n );\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 {/* 头部插槽 */}\n {renderSlot(header, false)}\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 {/* 清除按钮 */}\n {clearBtnShow && <ClearButton />}\n\n <div className={styles.inputAndButtons}>\n {/* 前缀插槽 */}\n {renderSlot(prefix, false)}\n\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={isDisabled}\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 {/* 后缀插槽(默认显示操作按钮) */}\n {renderSlot(suffix, defaultSuffix)}\n </div>\n </div>\n\n {/* 底部插槽(默认显示提示文字) */}\n {renderSlot(\n footer,\n <div className={styles.tip}>\n 内容由AI生成,无法确保真实准确,仅供参考\n </div>,\n )}\n </div>\n </div>\n );\n};\n\nexport default XAdkSender;\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React from "react";
2
2
  interface uploadRequestProps {
3
3
  (options: {
4
4
  file: File;
@@ -24,12 +24,15 @@ export interface LocalFile {
24
24
  size: number;
25
25
  type: string;
26
26
  progress: number;
27
- status: 'pending' | 'uploading' | 'success' | 'error';
27
+ status: "pending" | "uploading" | "success" | "error";
28
28
  fileId?: number;
29
29
  tempUrl?: string;
30
30
  response?: any;
31
31
  errorMessage?: string;
32
32
  }
33
+ export type FileValidator = (file: File, context: {
34
+ files: LocalFile[];
35
+ }) => string | null;
33
36
  export interface ActionsComponents {
34
37
  SendButton: React.ComponentType<any>;
35
38
  UploadButton: React.ComponentType<any>;
@@ -38,7 +41,17 @@ export interface ActionsComponents {
38
41
  export type SlotRenderFunction = (oriNode: React.ReactNode, info: {
39
42
  components: ActionsComponents;
40
43
  }) => React.ReactNode | false;
41
- export interface XAdkSenderProps {
44
+ export interface UploaderCoreProps {
45
+ uploadRequest?: uploadRequestProps;
46
+ maxFileSize?: number;
47
+ allowedFileTypes?: string[];
48
+ maxFiles?: number;
49
+ validators?: FileValidator[];
50
+ onFilesChange?: (files: LocalFile[]) => void;
51
+ onUploadSuccess?: (file: LocalFile) => void;
52
+ onUploadError?: (file: LocalFile, error: Error) => void;
53
+ }
54
+ export interface SenderUIProps {
42
55
  clearBtnShow?: boolean;
43
56
  allowUpload?: boolean;
44
57
  loading?: boolean;
@@ -50,11 +63,6 @@ export interface XAdkSenderProps {
50
63
  files: ServerFile[];
51
64
  }) => void;
52
65
  onStop?: () => void;
53
- uploadRequest?: uploadRequestProps;
54
- maxFileSize?: number;
55
- allowedFileTypes?: string[];
56
- maxFiles?: number;
57
- onFilesChange?: (files: ServerFile[]) => void;
58
66
  /** 后缀内容,默认展示操作按钮,设为 false 时不显示 */
59
67
  suffix?: React.ReactNode | false | SlotRenderFunction;
60
68
  /** 头部面板 */
@@ -64,4 +72,5 @@ export interface XAdkSenderProps {
64
72
  /** 底部内容 */
65
73
  footer?: React.ReactNode | false | SlotRenderFunction;
66
74
  }
75
+ export type XAdkSenderProps = SenderUIProps & UploaderCoreProps;
67
76
  export {};
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../src/types/XAdkSender.ts"],"sourcesContent":["// types/XAdkSender.ts\nimport React from 'react';\n\ninterface uploadRequestProps {\n (options: {\n file: File;\n onProgress?: (e: { percent: number }) => void;\n onSuccess?: (response: any) => void;\n onError?: (error: Error) => void;\n }): Promise<void> | void;\n}\n\nexport interface ServerFile {\n fileName: string;\n fileId: number;\n tempUrl: string;\n type: string;\n mimeType: string;\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?: number;\n tempUrl?: string;\n response?: any;\n errorMessage?: string; // 上传错误信息\n}\n\nexport interface ActionsComponents {\n SendButton: React.ComponentType<any>;\n UploadButton: 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\nexport interface XAdkSenderProps {\n clearBtnShow?: boolean;\n allowUpload?: boolean;\n loading?: boolean;\n disabled?: boolean; // 只读状态\n onClear?: () => void;\n onChange?: (value: string) => void;\n onSubmit?: (data: {\n text: string;\n files: ServerFile[];\n }) => void;\n onStop?: () => void;\n\n // 上传相关配置\n uploadRequest?: uploadRequestProps;\n maxFileSize?: number; // 最大文件大小(MB)\n allowedFileTypes?: string[]; // 允许的文件类型\n maxFiles?: number; // 最大文件数量\n\n // 文件状态回调\n onFilesChange?: (files: ServerFile[]) => void;\n\n // 插槽功能\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}"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["../../../src/types/XAdkSender.ts"],"sourcesContent":["// types/XAdkSender.ts\nimport React from \"react\";\n\ninterface uploadRequestProps {\n (options: {\n file: File;\n onProgress?: (e: { percent: number }) => void;\n onSuccess?: (response: any) => void;\n onError?: (error: Error) => void;\n }): Promise<void> | void;\n}\n\nexport interface ServerFile {\n fileName: string;\n fileId: number;\n tempUrl: string;\n type: string;\n mimeType: string;\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?: 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 UploadButton: 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 // 数据层回调(比 onFilesChange 更底层)\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 allowUpload?: boolean;\n loading?: boolean;\n disabled?: boolean; // 只读状态\n onClear?: () => void;\n onChange?: (value: string) => void;\n onSubmit?: (data: { text: string; files: ServerFile[] }) => void;\n onStop?: () => void;\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}\n\nexport type XAdkSenderProps = SenderUIProps & UploaderCoreProps;\n"],"mappings":""}
@@ -5,6 +5,7 @@ export * from "./XAiSender";
5
5
  export * from "./XAiConversations";
6
6
  export * from "./XAdkProvider";
7
7
  export * from "./XAdkChatbot";
8
+ export * from "./XAdkSender";
8
9
  export * from "./XAiThoughtChain";
9
10
  export * from "./FileGallery";
10
11
  export * from "./common";
@@ -5,6 +5,7 @@ export * from "./XAiSender";
5
5
  export * from "./XAiConversations";
6
6
  export * from "./XAdkProvider";
7
7
  export * from "./XAdkChatbot";
8
+ export * from "./XAdkSender";
8
9
  export * from "./XAiThoughtChain";
9
10
  export * from "./FileGallery";
10
11
  export * from "./common";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../src/types/index.ts"],"sourcesContent":["export * from \"./XAiChatbot\";\nexport * from \"./XAiMessage\";\nexport * from \"./XAiProvider\";\nexport * from \"./XAiSender\";\nexport * from \"./XAiConversations\";\nexport * from \"./XAdkProvider\";\nexport * from \"./XAdkChatbot\";\nexport * from \"./XAiThoughtChain\";\nexport * from \"./FileGallery\";\nexport * from \"./common\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"names":[],"sources":["../../../src/types/index.ts"],"sourcesContent":["export * from \"./XAiChatbot\";\nexport * from \"./XAiMessage\";\nexport * from \"./XAiProvider\";\nexport * from \"./XAiSender\";\nexport * from \"./XAiConversations\";\nexport * from \"./XAdkProvider\";\nexport * from \"./XAdkChatbot\";\nexport * from \"./XAdkSender\";\nexport * from \"./XAiThoughtChain\";\nexport * from \"./FileGallery\";\nexport * from \"./common\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -0,0 +1,2 @@
1
+ import { LocalFile } from "../types";
2
+ export declare const getExt: (file: File | LocalFile) => string;
@@ -0,0 +1,10 @@
1
+ // 获取文件后缀
2
+ export var getExt = function getExt(file) {
3
+ var _file$name$split$pop;
4
+ return ((_file$name$split$pop = file.name.split(".").pop()) === null || _file$name$split$pop === void 0 ? void 0 : _file$name$split$pop.toLowerCase()) || "";
5
+ };
6
+
7
+ // export const sanitizeFileName = (name: string) => {
8
+ // return name.replace(/[^a-zA-Z0-9.\-_]/g, "_");
9
+ // };
10
+ //# sourceMappingURL=file.js.map