@ai-group/chat-sdk 3.0.2 → 3.0.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.
@@ -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,13 +65,19 @@ var XAdkSender = function XAdkSender(_ref) {
61
65
 
62
66
  // 检查文件类型
63
67
  var checkFileType = function checkFileType(file) {
64
- if (!allowedFileTypes.length) return true;
68
+ var ext = getExt(file);
65
69
  return allowedFileTypes.some(function (type) {
66
- if (type.includes("/*")) {
67
- var mainType = type.split("/")[0];
68
- return file.type.startsWith(mainType);
70
+ // 1️⃣ MIME 校验
71
+ if (type.includes("/")) {
72
+ if (type.endsWith("/*")) {
73
+ return file.type.startsWith(type.split("/")[0]);
74
+ }
75
+ return file.type === type;
69
76
  }
70
- return file.type === type;
77
+ if (type.startsWith(".")) {
78
+ return ext === type.slice(1);
79
+ }
80
+ return false;
71
81
  });
72
82
  };
73
83
 
@@ -77,40 +87,82 @@ var XAdkSender = function XAdkSender(_ref) {
77
87
  return file.size <= maxSize;
78
88
  };
79
89
 
80
- // 验证文件
81
- var validateFile = function validateFile(file) {
90
+ // 重复文件检测
91
+ var isDuplicateFile = function isDuplicateFile(file, files) {
92
+ return files.some(function (f) {
93
+ return f.name === file.name && f.size === file.size;
94
+ });
95
+ };
96
+
97
+ // 内置校验器集合
98
+ var builtInValidators = [
99
+ // 数量校验(修复批量 bug)
100
+ function (_file, _ref2) {
101
+ var files = _ref2.files;
82
102
  if (files.length >= maxFiles) {
83
- return {
84
- valid: false,
85
- message: "\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ".concat(maxFiles, " \u4E2A\u6587\u4EF6")
86
- };
103
+ return "\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ".concat(maxFiles, " \u4E2A\u6587\u4EF6");
87
104
  }
88
- if (!checkFileSize(file)) {
89
- return {
90
- valid: false,
91
- message: "\u6587\u4EF6\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC7 ".concat(maxFileSize, "MB")
92
- };
105
+ return null;
106
+ },
107
+ // 大小校验
108
+ function (file) {
109
+ var maxSize = maxFileSize * 1024 * 1024;
110
+ if (file.size > maxSize) {
111
+ return "\u6587\u4EF6\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC7 ".concat(maxFileSize, "MB");
93
112
  }
113
+ return null;
114
+ },
115
+ // 类型校验
116
+ function (file) {
94
117
  if (!checkFileType(file)) {
95
- return {
96
- valid: false,
97
- message: "不支持的文件类型"
98
- };
118
+ return "不支持的文件类型";
119
+ }
120
+ return null;
121
+ },
122
+ // ⭐ 新增:去重校验
123
+ function (file, _ref3) {
124
+ var files = _ref3.files;
125
+ if (isDuplicateFile(file, files)) {
126
+ return "文件已存在";
127
+ }
128
+ return null;
129
+ }];
130
+ var allValidators = [].concat(builtInValidators, _toConsumableArray(customValidators));
131
+
132
+ // 验证文件
133
+ var validateFile = function validateFile(file) {
134
+ var _iterator = _createForOfIteratorHelper(allValidators),
135
+ _step;
136
+ try {
137
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
138
+ var validator = _step.value;
139
+ var error = validator(file, {
140
+ files: files
141
+ });
142
+ if (error) {
143
+ return {
144
+ valid: false,
145
+ message: error
146
+ };
147
+ }
148
+ }
149
+ } catch (err) {
150
+ _iterator.e(err);
151
+ } finally {
152
+ _iterator.f();
99
153
  }
100
154
  return {
101
155
  valid: true
102
156
  };
103
157
  };
104
158
 
105
- // 获取文件扩展名
106
- var getFileExtension = function getFileExtension(filename) {
107
- var ext = filename.split(".").pop();
108
- return ext ? ext.toLowerCase() : "";
109
- };
110
-
111
159
  // 处理文件选择
112
160
  var handleFileSelect = useCallback(function (selectedFiles) {
113
161
  var fileArray = Array.from(selectedFiles);
162
+ if (files.length + fileArray.length > maxFiles) {
163
+ message.error("\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ".concat(maxFiles, " \u4E2A\u6587\u4EF6"));
164
+ return;
165
+ }
114
166
  var validFiles = [];
115
167
  fileArray.forEach(function (file) {
116
168
  var validation = validateFile(file);
@@ -132,27 +184,29 @@ var XAdkSender = function XAdkSender(_ref) {
132
184
  });
133
185
  if (validFiles.length > 0) {
134
186
  setFiles(function (prev) {
135
- return [].concat(_toConsumableArray(prev), validFiles);
187
+ var next = [].concat(_toConsumableArray(prev), validFiles);
188
+ onFilesChange === null || onFilesChange === void 0 || onFilesChange(next);
189
+ return next;
136
190
  });
137
191
  uploadFiles(validFiles);
138
192
  }
139
- }, [files.length, maxFiles, maxFileSize, allowedFileTypes]);
193
+ }, [files, maxFiles, maxFileSize, allowedFileTypes]);
140
194
 
141
195
  // 上传文件
142
196
  var uploadFiles = /*#__PURE__*/function () {
143
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(fileList) {
144
- var _iterator, _step, _loop;
197
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(fileList) {
198
+ var _iterator2, _step2, _loop;
145
199
  return _regeneratorRuntime().wrap(function _callee$(_context2) {
146
200
  while (1) switch (_context2.prev = _context2.next) {
147
201
  case 0:
148
- _iterator = _createForOfIteratorHelper(fileList);
202
+ _iterator2 = _createForOfIteratorHelper(fileList);
149
203
  _context2.prev = 1;
150
204
  _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop() {
151
205
  var localFile;
152
206
  return _regeneratorRuntime().wrap(function _loop$(_context) {
153
207
  while (1) switch (_context.prev = _context.next) {
154
208
  case 0:
155
- localFile = _step.value;
209
+ localFile = _step2.value;
156
210
  // 开始上传
157
211
  setFiles(function (prev) {
158
212
  return prev.map(function (f) {
@@ -184,17 +238,21 @@ var XAdkSender = function XAdkSender(_ref) {
184
238
  }) : f;
185
239
  });
186
240
  });
241
+ onUploadSuccess === null || onUploadSuccess === void 0 || onUploadSuccess(_objectSpread(_objectSpread({}, localFile), {}, {
242
+ status: "success",
243
+ response: response
244
+ }));
187
245
  },
188
246
  onError: function onError(error) {
189
247
  setFiles(function (prev) {
190
248
  return prev.map(function (f) {
191
249
  return f.id === localFile.id ? _objectSpread(_objectSpread({}, f), {}, {
192
250
  status: "error",
193
- errorMessage: error.message || "上传失败"
251
+ errorMessage: error.message
194
252
  }) : f;
195
253
  });
196
254
  });
197
- message.error("".concat(localFile.name, " \u4E0A\u4F20\u5931\u8D25: ").concat(error.message || "未知错误"));
255
+ onUploadError === null || onUploadError === void 0 || onUploadError(localFile, error);
198
256
  }
199
257
  });
200
258
  case 5:
@@ -219,9 +277,9 @@ var XAdkSender = function XAdkSender(_ref) {
219
277
  }
220
278
  }, _loop, null, [[2, 7]]);
221
279
  });
222
- _iterator.s();
280
+ _iterator2.s();
223
281
  case 4:
224
- if ((_step = _iterator.n()).done) {
282
+ if ((_step2 = _iterator2.n()).done) {
225
283
  _context2.next = 8;
226
284
  break;
227
285
  }
@@ -235,10 +293,10 @@ var XAdkSender = function XAdkSender(_ref) {
235
293
  case 10:
236
294
  _context2.prev = 10;
237
295
  _context2.t1 = _context2["catch"](1);
238
- _iterator.e(_context2.t1);
296
+ _iterator2.e(_context2.t1);
239
297
  case 13:
240
298
  _context2.prev = 13;
241
- _iterator.f();
299
+ _iterator2.f();
242
300
  return _context2.finish(13);
243
301
  case 16:
244
302
  case "end":
@@ -247,70 +305,18 @@ var XAdkSender = function XAdkSender(_ref) {
247
305
  }, _callee, null, [[1, 10, 13, 16]]);
248
306
  }));
249
307
  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);
308
+ return _ref4.apply(this, arguments);
305
309
  };
306
310
  }();
307
311
 
308
312
  // 删除文件
309
313
  var handleRemoveFile = function handleRemoveFile(id) {
310
314
  setFiles(function (prev) {
311
- return prev.filter(function (file) {
315
+ var next = prev.filter(function (file) {
312
316
  return file.id !== id;
313
317
  });
318
+ onFilesChange === null || onFilesChange === void 0 || onFilesChange(next);
319
+ return next;
314
320
  });
315
321
  };
316
322
 
@@ -410,7 +416,7 @@ var XAdkSender = function XAdkSender(_ref) {
410
416
  fileName: file.name,
411
417
  fileId: responseData.fileId || responseData.id || 0,
412
418
  tempUrl: responseData.tempUrl || responseData.url || "",
413
- type: responseData.fileType || getFileExtension(file.name),
419
+ type: responseData.fileType || getExt(file),
414
420
  mimeType: file.type
415
421
  };
416
422
  });
@@ -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","ext","some","type","includes","endsWith","startsWith","split","slice","checkFileSize","maxSize","size","isDuplicateFile","f","name","builtInValidators","_file","_ref2","length","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 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\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
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getExt","file","_file$name$split$pop","name","split","pop","toLowerCase"],"sources":["../../../src/utils/file.ts"],"sourcesContent":["import { LocalFile } from \"@/types\";\n\n// 获取文件后缀\nexport const getExt = (file: File | LocalFile) => {\n return file.name.split(\".\").pop()?.toLowerCase() || \"\";\n};\n\n// export const sanitizeFileName = (name: string) => {\n// return name.replace(/[^a-zA-Z0-9.\\-_]/g, \"_\");\n// };\n"],"mappings":"AAEA;AACA,OAAO,IAAMA,MAAM,GAAG,SAATA,MAAMA,CAAIC,IAAsB,EAAK;EAAA,IAAAC,oBAAA;EAChD,OAAO,EAAAA,oBAAA,GAAAD,IAAI,CAACE,IAAI,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC,cAAAH,oBAAA,uBAA1BA,oBAAA,CAA4BI,WAAW,CAAC,CAAC,KAAI,EAAE;AACxD,CAAC;;AAED;AACA;AACA"}