@ai-group/chat-sdk 3.3.0 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cjs/components/XAdkSender/index.js +2 -1
- package/dist/cjs/components/XAdkSender/index.js.map +2 -2
- package/dist/cjs/presets/xGroupAdk.js +2 -1
- package/dist/cjs/presets/xGroupAdk.js.map +2 -2
- package/dist/cjs/types/XAdkSender.d.ts +2 -2
- package/dist/cjs/types/XAdkSender.js.map +1 -1
- package/dist/esm/components/XAdkSender/index.js +3 -2
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/presets/xGroupAdk.js +8 -7
- package/dist/esm/presets/xGroupAdk.js.map +1 -1
- package/dist/esm/types/XAdkSender.d.ts +2 -2
- package/dist/esm/types/XAdkSender.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -157,7 +157,7 @@ const chatbot = new XAiWebSDK(container, {
|
|
|
157
157
|
|
|
158
158
|
- `options.file`: 要上传的 File 对象
|
|
159
159
|
- `options.onProgress`: 进度回调,参数 `{ percent: number }`
|
|
160
|
-
- `options.onSuccess`:
|
|
160
|
+
- `options.onSuccess`: 上传成功回调,参数类型为 `UploadFileResult | UploadFileResult[] | { data: UploadFileResult | UploadFileResult[] }`
|
|
161
161
|
- `options.onError`: 上传失败回调,参数为 Error 对象
|
|
162
162
|
|
|
163
163
|
**示例:**
|
|
@@ -86,7 +86,8 @@ var XAdkSender = ({
|
|
|
86
86
|
return Date.now().toString(36) + Math.random().toString(36).substr(2);
|
|
87
87
|
};
|
|
88
88
|
const normalizeUploadResponse = (response) => {
|
|
89
|
-
|
|
89
|
+
const data = (response == null ? void 0 : response.data) ?? response;
|
|
90
|
+
return (Array.isArray(data) ? data[0] : data) ?? {};
|
|
90
91
|
};
|
|
91
92
|
const checkFileType = (file) => {
|
|
92
93
|
if ((allowedFileTypes == null ? void 0 : allowedFileTypes.length) > 0) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAdkSender/index.tsx"],
|
|
4
|
-
"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 UploadFileResult,\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 = Infinity,\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 const normalizeUploadResponse = (response: any): UploadFileResult => {\n return response?.data ?? response ?? {};\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 const responseData = normalizeUploadResponse(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 fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n }\n : f,\n ),\n );\n\n onUploadSuccess?.({\n ...localFile,\n status: \"success\",\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl || responseData.fileUrl || responseData.url,\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)\n .map((file) => {\n const responseData = normalizeUploadResponse(file.response);\n\n return {\n fileName: responseData.fileName || file.name,\n fileId: responseData.fileId || responseData.id || \"\",\n tempUrl:\n responseData.tempUrl || responseData.fileUrl || responseData.url || \"\",\n type: responseData.fileType || responseData.type || getExt(file),\n size: responseData.fileSize || responseData.size || file.size,\n mimeType: responseData.mimeType || file.type,\n raw: {\n ...responseData,\n },\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 (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n padding: \"12px 0\",\n }}\n >\n {files.map((file) => (\n <FileGallery\n key={file.id}\n file={file}\n removable\n onRemove={handleRemoveFile}\n />\n ))}\n </div>\n );\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"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAqD;AACrD,kBAA2D;AAC3D,mBAKO;AASP,oBAA0B;AAC1B,yBAAwB;AACxB,kBAAuB;
|
|
4
|
+
"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 UploadFileResult,\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 = Infinity,\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 const normalizeUploadResponse = (response: any): UploadFileResult => {\n const data = response?.data ?? response;\n return (Array.isArray(data) ? data[0] : data) ?? {};\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 const responseData = normalizeUploadResponse(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 fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n }\n : f,\n ),\n );\n\n onUploadSuccess?.({\n ...localFile,\n status: \"success\",\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl || responseData.fileUrl || responseData.url,\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)\n .map((file) => {\n const responseData = normalizeUploadResponse(file.response);\n\n return {\n fileName: responseData.fileName || file.name,\n fileId: responseData.fileId || responseData.id || \"\",\n tempUrl:\n responseData.tempUrl || responseData.fileUrl || responseData.url || \"\",\n type: responseData.fileType || responseData.type || getExt(file),\n size: responseData.fileSize || responseData.size || file.size,\n mimeType: responseData.mimeType || file.type,\n raw: {\n ...responseData,\n },\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 (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n padding: \"12px 0\",\n }}\n >\n {files.map((file) => (\n <FileGallery\n key={file.id}\n file={file}\n removable\n onRemove={handleRemoveFile}\n />\n ))}\n </div>\n );\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["files", "FileGallery"]
|
|
7
7
|
}
|
|
@@ -79,8 +79,9 @@ var createXGroupUploadRequest = ({
|
|
|
79
79
|
if (!response.ok) {
|
|
80
80
|
throw new Error((result == null ? void 0 : result.message) || `文件上传失败 (${response.status})`);
|
|
81
81
|
}
|
|
82
|
+
const uploadedFile = Array.isArray(result == null ? void 0 : result.data) ? result.data[0] : (result == null ? void 0 : result.data) ?? result;
|
|
82
83
|
onProgress == null ? void 0 : onProgress({ percent: 100 });
|
|
83
|
-
onSuccess == null ? void 0 : onSuccess(
|
|
84
|
+
onSuccess == null ? void 0 : onSuccess(uploadedFile);
|
|
84
85
|
} catch (error) {
|
|
85
86
|
onError == null ? void 0 : onError(error instanceof Error ? error : new Error("文件上传失败"));
|
|
86
87
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/presets/xGroupAdk.ts"],
|
|
4
|
-
"sourcesContent": ["import { parseAgentMessage } from \"@/utils\";\nimport type {\n ChatPreset,\n ChatPresetInput,\n ChatStrategies,\n FunctionCall,\n FunctionResponse,\n ToolRenderKind,\n UploadRequestFn,\n} from \"@/types\";\n\nexport const baseToolKindResolver = (): ToolRenderKind => \"default\";\n\nexport const xGroupToolKindResolver = ({\n name,\n}: {\n name?: string;\n}): ToolRenderKind => {\n if (name === \"adk_request_confirmation\") return \"approval\";\n if (name === \"transferToAgent\") return \"handoff\";\n return \"default\";\n};\n\nexport const baseChatStrategies: Required<\n Pick<ChatStrategies, \"resolveToolKind\" | \"createFunctionResponse\" | \"parseProcessMessage\">\n> = {\n resolveToolKind: () => \"default\",\n createFunctionResponse: (\n fnCall: FunctionCall,\n confirmed: boolean,\n ): FunctionResponse => ({\n id: fnCall.id,\n name: fnCall.name,\n response: { confirmed },\n }),\n parseProcessMessage: parseAgentMessage,\n};\n\nexport const createXGroupUploadRequest = ({\n url,\n token,\n appNo,\n}: {\n url: string;\n token?: string;\n appNo?: string;\n}): UploadRequestFn | undefined => {\n if (!appNo || !token) return undefined;\n\n return async ({ file, onProgress, onSuccess, onError }) => {\n try {\n onProgress?.({ percent: 0 });\n\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetch(\n `${url}/api/gateway-web/openApi/v1/aizt/app/${appNo}/uploadMultiFile`,\n {\n method: \"POST\",\n body: formData,\n credentials: \"include\",\n headers: {\n Accept: \"application/json, text/plain, */*\",\n Authorization: `Bearer ${token}`,\n \"Cache-Control\": \"no-cache\",\n },\n },\n );\n\n const result = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n throw new Error(result?.message || `文件上传失败 (${response.status})`);\n }\n\n onProgress?.({ percent: 100 });\n onSuccess?.(
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkC;AAW3B,IAAM,uBAAuB,MAAsB;AAEnD,IAAM,yBAAyB,CAAC;AAAA,EACrC;AACF,MAEsB;AACpB,MAAI,SAAS;AAA4B,WAAO;AAChD,MAAI,SAAS;AAAmB,WAAO;AACvC,SAAO;AACT;AAEO,IAAM,qBAET;AAAA,EACF,iBAAiB,MAAM;AAAA,EACvB,wBAAwB,CACtB,QACA,eACsB;AAAA,IACtB,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,IACb,UAAU,EAAE,UAAU;AAAA,EACxB;AAAA,EACA,qBAAqB;AACvB;AAEO,IAAM,4BAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF,MAImC;AACjC,MAAI,CAAC,SAAS,CAAC;AAAO,WAAO;AAE7B,SAAO,OAAO,EAAE,MAAM,YAAY,WAAW,QAAQ,MAAM;AACzD,QAAI;AACF,+CAAa,EAAE,SAAS,EAAE;AAE1B,YAAM,WAAW,IAAI,SAAS;AAC9B,eAAS,OAAO,QAAQ,IAAI;AAE5B,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,2CAA2C;AAAA,QAC9C;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,YACP,QAAQ;AAAA,YACR,eAAe,UAAU;AAAA,YACzB,iBAAiB;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAErD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,OAAM,iCAAQ,YAAW,WAAW,SAAS,SAAS;AAAA,MAClE;AAEA,+CAAa,EAAE,SAAS,IAAI;AAC5B,
|
|
4
|
+
"sourcesContent": ["import { parseAgentMessage } from \"@/utils\";\nimport type {\n ChatPreset,\n ChatPresetInput,\n ChatStrategies,\n FunctionCall,\n FunctionResponse,\n ToolRenderKind,\n UploadRequestFn,\n} from \"@/types\";\n\nexport const baseToolKindResolver = (): ToolRenderKind => \"default\";\n\nexport const xGroupToolKindResolver = ({\n name,\n}: {\n name?: string;\n}): ToolRenderKind => {\n if (name === \"adk_request_confirmation\") return \"approval\";\n if (name === \"transferToAgent\") return \"handoff\";\n return \"default\";\n};\n\nexport const baseChatStrategies: Required<\n Pick<ChatStrategies, \"resolveToolKind\" | \"createFunctionResponse\" | \"parseProcessMessage\">\n> = {\n resolveToolKind: () => \"default\",\n createFunctionResponse: (\n fnCall: FunctionCall,\n confirmed: boolean,\n ): FunctionResponse => ({\n id: fnCall.id,\n name: fnCall.name,\n response: { confirmed },\n }),\n parseProcessMessage: parseAgentMessage,\n};\n\nexport const createXGroupUploadRequest = ({\n url,\n token,\n appNo,\n}: {\n url: string;\n token?: string;\n appNo?: string;\n}): UploadRequestFn | undefined => {\n if (!appNo || !token) return undefined;\n\n return async ({ file, onProgress, onSuccess, onError }) => {\n try {\n onProgress?.({ percent: 0 });\n\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetch(\n `${url}/api/gateway-web/openApi/v1/aizt/app/${appNo}/uploadMultiFile`,\n {\n method: \"POST\",\n body: formData,\n credentials: \"include\",\n headers: {\n Accept: \"application/json, text/plain, */*\",\n Authorization: `Bearer ${token}`,\n \"Cache-Control\": \"no-cache\",\n },\n },\n );\n\n const result = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n throw new Error(result?.message || `文件上传失败 (${response.status})`);\n }\n\n const uploadedFile = Array.isArray(result?.data)\n ? result.data[0]\n : result?.data ?? result;\n\n onProgress?.({ percent: 100 });\n onSuccess?.(uploadedFile);\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(\"文件上传失败\"));\n }\n };\n};\n\nexport const xGroupAdkPreset: ChatPreset = {\n name: \"xgroup-adk\",\n strategies: {\n resolveToolKind: xGroupToolKindResolver,\n createFunctionResponse: baseChatStrategies.createFunctionResponse,\n parseProcessMessage: (text, options) =>\n parseAgentMessage(text, { mode: \"comment\", ...options }),\n },\n createUploadRequest: createXGroupUploadRequest,\n};\n\nexport const basePreset: ChatPreset = {\n name: \"base\",\n strategies: baseChatStrategies,\n};\n\nexport const resolveChatPreset = (\n preset: ChatPresetInput | undefined,\n): ChatPreset => {\n if (!preset || preset === \"xgroup-adk\") return xGroupAdkPreset;\n if (preset === \"base\") return basePreset;\n return preset;\n};\n\nexport const mergeChatStrategies = (\n preset: ChatPresetInput | undefined,\n overrides?: ChatStrategies,\n): ChatStrategies => ({\n ...baseChatStrategies,\n ...resolveChatPreset(preset).strategies,\n ...overrides,\n});\n\nexport const resolvePresetUploadRequest = (\n preset: ChatPresetInput | undefined,\n context: {\n url: string;\n token?: string;\n appNo?: string;\n },\n): UploadRequestFn | undefined => {\n return resolveChatPreset(preset).createUploadRequest?.(context);\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkC;AAW3B,IAAM,uBAAuB,MAAsB;AAEnD,IAAM,yBAAyB,CAAC;AAAA,EACrC;AACF,MAEsB;AACpB,MAAI,SAAS;AAA4B,WAAO;AAChD,MAAI,SAAS;AAAmB,WAAO;AACvC,SAAO;AACT;AAEO,IAAM,qBAET;AAAA,EACF,iBAAiB,MAAM;AAAA,EACvB,wBAAwB,CACtB,QACA,eACsB;AAAA,IACtB,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,IACb,UAAU,EAAE,UAAU;AAAA,EACxB;AAAA,EACA,qBAAqB;AACvB;AAEO,IAAM,4BAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF,MAImC;AACjC,MAAI,CAAC,SAAS,CAAC;AAAO,WAAO;AAE7B,SAAO,OAAO,EAAE,MAAM,YAAY,WAAW,QAAQ,MAAM;AACzD,QAAI;AACF,+CAAa,EAAE,SAAS,EAAE;AAE1B,YAAM,WAAW,IAAI,SAAS;AAC9B,eAAS,OAAO,QAAQ,IAAI;AAE5B,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,2CAA2C;AAAA,QAC9C;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,YACP,QAAQ;AAAA,YACR,eAAe,UAAU;AAAA,YACzB,iBAAiB;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAErD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,OAAM,iCAAQ,YAAW,WAAW,SAAS,SAAS;AAAA,MAClE;AAEA,YAAM,eAAe,MAAM,QAAQ,iCAAQ,IAAI,IAC3C,OAAO,KAAK,CAAC,KACb,iCAAQ,SAAQ;AAEpB,+CAAa,EAAE,SAAS,IAAI;AAC5B,6CAAY;AAAA,IACd,SAAS,OAAP;AACA,yCAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,QAAQ;AAAA,IAC/D;AAAA,EACF;AACF;AAEO,IAAM,kBAA8B;AAAA,EACzC,MAAM;AAAA,EACN,YAAY;AAAA,IACV,iBAAiB;AAAA,IACjB,wBAAwB,mBAAmB;AAAA,IAC3C,qBAAqB,CAAC,MAAM,gBAC1B,gCAAkB,MAAM,EAAE,MAAM,WAAW,GAAG,QAAQ,CAAC;AAAA,EAC3D;AAAA,EACA,qBAAqB;AACvB;AAEO,IAAM,aAAyB;AAAA,EACpC,MAAM;AAAA,EACN,YAAY;AACd;AAEO,IAAM,oBAAoB,CAC/B,WACe;AACf,MAAI,CAAC,UAAU,WAAW;AAAc,WAAO;AAC/C,MAAI,WAAW;AAAQ,WAAO;AAC9B,SAAO;AACT;AAEO,IAAM,sBAAsB,CACjC,QACA,eACoB;AAAA,EACpB,GAAG;AAAA,EACH,GAAG,kBAAkB,MAAM,EAAE;AAAA,EAC7B,GAAG;AACL;AAEO,IAAM,6BAA6B,CACxC,QACA,YAKgC;AAhIlC;AAiIE,UAAO,6BAAkB,MAAM,GAAE,wBAA1B,4BAAgD;AACzD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -11,7 +11,7 @@ export interface UploadFileResult {
|
|
|
11
11
|
[key: string]: any;
|
|
12
12
|
}
|
|
13
13
|
export interface UploadSuccessResponse {
|
|
14
|
-
data?: UploadFileResult;
|
|
14
|
+
data?: UploadFileResult | UploadFileResult[];
|
|
15
15
|
[key: string]: any;
|
|
16
16
|
}
|
|
17
17
|
interface uploadRequestProps {
|
|
@@ -20,7 +20,7 @@ interface uploadRequestProps {
|
|
|
20
20
|
onProgress?: (e: {
|
|
21
21
|
percent: number;
|
|
22
22
|
}) => void;
|
|
23
|
-
onSuccess?: (response: UploadFileResult | UploadSuccessResponse) => void;
|
|
23
|
+
onSuccess?: (response: UploadFileResult | UploadFileResult[] | UploadSuccessResponse) => void;
|
|
24
24
|
onError?: (error: Error) => void;
|
|
25
25
|
}): Promise<void> | void;
|
|
26
26
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/types/XAdkSender.ts"],
|
|
4
|
-
"sourcesContent": ["// types/XAdkSender.ts\nimport React from \"react\";\n\nexport interface UploadFileResult {\n fileName?: string;\n fileId?: string | number;\n tempUrl?: string;\n url?: string;\n fileUrl?: string;\n fileType?: string;\n fileSize?: number;\n mimeType?: string;\n [key: string]: any;\n}\n\nexport interface UploadSuccessResponse {\n data?: UploadFileResult;\n [key: string]: any;\n}\n\ninterface uploadRequestProps {\n (options: {\n file: File;\n onProgress?: (e: { percent: number }) => void;\n onSuccess?: (response: UploadFileResult | UploadSuccessResponse) => void;\n onError?: (error: Error) => void;\n }): Promise<void> | void;\n}\n\nexport type UploadRequestFn = uploadRequestProps;\n\nexport interface ServerFile {\n fileName: string;\n fileId: string | number;\n tempUrl: string;\n type: string;\n size?: number;\n mimeType: string;\n raw?: UploadFileResult;\n}\n\nexport interface LocalFile {\n id: string;\n uid: string;\n name: string;\n file: File;\n size: number;\n type: string;\n progress: number;\n status: \"pending\" | \"uploading\" | \"success\" | \"error\";\n // 服务器返回字段\n fileId?: string | number;\n tempUrl?: string;\n response?: any;\n errorMessage?: string; // 上传错误信息\n}\n\nexport type FileValidator = (\n file: File,\n context: { files: LocalFile[] },\n) => string | null;\n\nexport interface ActionsComponents {\n SendButton: React.ComponentType<any>;\n 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 // 数据层回调\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"],
|
|
4
|
+
"sourcesContent": ["// types/XAdkSender.ts\nimport React from \"react\";\n\nexport interface UploadFileResult {\n fileName?: string;\n fileId?: string | number;\n tempUrl?: string;\n url?: string;\n fileUrl?: string;\n fileType?: string;\n fileSize?: number;\n mimeType?: string;\n [key: string]: any;\n}\n\nexport interface UploadSuccessResponse {\n data?: UploadFileResult | UploadFileResult[];\n [key: string]: any;\n}\n\ninterface uploadRequestProps {\n (options: {\n file: File;\n onProgress?: (e: { percent: number }) => void;\n onSuccess?: (\n response: UploadFileResult | UploadFileResult[] | UploadSuccessResponse,\n ) => void;\n onError?: (error: Error) => void;\n }): Promise<void> | void;\n}\n\nexport type UploadRequestFn = uploadRequestProps;\n\nexport interface ServerFile {\n fileName: string;\n fileId: string | number;\n tempUrl: string;\n type: string;\n size?: number;\n mimeType: string;\n raw?: UploadFileResult;\n}\n\nexport interface LocalFile {\n id: string;\n uid: string;\n name: string;\n file: File;\n size: number;\n type: string;\n progress: number;\n status: \"pending\" | \"uploading\" | \"success\" | \"error\";\n // 服务器返回字段\n fileId?: string | number;\n tempUrl?: string;\n response?: any;\n errorMessage?: string; // 上传错误信息\n}\n\nexport type FileValidator = (\n file: File,\n context: { files: LocalFile[] },\n) => string | null;\n\nexport interface ActionsComponents {\n SendButton: React.ComponentType<any>;\n 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 // 数据层回调\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"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -63,8 +63,9 @@ var XAdkSender = function XAdkSender(_ref) {
|
|
|
63
63
|
return Date.now().toString(36) + Math.random().toString(36).substr(2);
|
|
64
64
|
};
|
|
65
65
|
var normalizeUploadResponse = function normalizeUploadResponse(response) {
|
|
66
|
-
var
|
|
67
|
-
|
|
66
|
+
var _response$data, _ref2;
|
|
67
|
+
var data = (_response$data = response === null || response === void 0 ? void 0 : response.data) !== null && _response$data !== void 0 ? _response$data : response;
|
|
68
|
+
return (_ref2 = Array.isArray(data) ? data[0] : data) !== null && _ref2 !== void 0 ? _ref2 : {};
|
|
68
69
|
};
|
|
69
70
|
|
|
70
71
|
// 检查文件类型
|
|
@@ -1 +1 @@
|
|
|
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","Infinity","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","normalizeUploadResponse","response","_ref2","_response$data","data","checkFileType","file","length","ext","some","type","includes","endsWith","startsWith","split","slice","checkFileSize","maxSize","size","isDuplicateFile","f","name","builtInValidators","_file","_ref3","concat","_ref4","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","prev","next","uploadFiles","_ref5","_asyncToGenerator","_regeneratorRuntime","mark","_callee","fileList","_iterator2","_step2","_loop","wrap","_callee$","_context2","localFile","_loop$","_context","map","_objectSpread","onProgress","percent","onSuccess","responseData","fileId","tempUrl","fileUrl","url","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","fileName","fileType","fileSize","mimeType","raw","handleInputChange","newValue","target","handleKeyDown","key","shiftKey","renderFileList","style","display","flexWrap","gap","padding","children","removable","onRemove","containerClass","container","uploading","isDisabled","SendButton","props","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","mainArea","senderWrap","inputAndButtons","textAreaWrapper","TextArea","textArea","onKeyDown","placeholder","autoSize","minRows","maxRows","border","boxShadow","outline","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 UploadFileResult,\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 = Infinity,\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 const normalizeUploadResponse = (response: any): UploadFileResult => {\n return response?.data ?? response ?? {};\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 const responseData = normalizeUploadResponse(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 fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n }\n : f,\n ),\n );\n\n onUploadSuccess?.({\n ...localFile,\n status: \"success\",\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl || responseData.fileUrl || responseData.url,\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)\n .map((file) => {\n const responseData = normalizeUploadResponse(file.response);\n\n return {\n fileName: responseData.fileName || file.name,\n fileId: responseData.fileId || responseData.id || \"\",\n tempUrl:\n responseData.tempUrl || responseData.fileUrl || responseData.url || \"\",\n type: responseData.fileType || responseData.type || getExt(file),\n size: responseData.fileSize || responseData.size || file.size,\n mimeType: responseData.mimeType || file.type,\n raw: {\n ...responseData,\n },\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 (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n padding: \"12px 0\",\n }}\n >\n {files.map((file) => (\n <FileGallery\n key={file.id}\n file={file}\n removable\n onRemove={handleRemoveFile}\n />\n ))}\n </div>\n );\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","Infinity","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","normalizeUploadResponse","response","_response$data","_ref2","data","Array","isArray","checkFileType","file","length","ext","some","type","includes","endsWith","startsWith","split","slice","checkFileSize","maxSize","size","isDuplicateFile","f","name","builtInValidators","_file","_ref3","concat","_ref4","allValidators","_toConsumableArray","validateFile","_iterator","_createForOfIteratorHelper","_step","s","n","done","validator","error","valid","err","e","handleFileSelect","selectedFiles","fileArray","from","validFiles","forEach","validation","push","id","uid","progress","status","prev","next","uploadFiles","_ref5","_asyncToGenerator","_regeneratorRuntime","mark","_callee","fileList","_iterator2","_step2","_loop","wrap","_callee$","_context2","localFile","_loop$","_context","map","_objectSpread","onProgress","percent","onSuccess","responseData","fileId","tempUrl","fileUrl","url","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","fileName","fileType","fileSize","mimeType","raw","handleInputChange","newValue","target","handleKeyDown","key","shiftKey","renderFileList","style","display","flexWrap","gap","padding","children","removable","onRemove","containerClass","container","uploading","isDisabled","SendButton","props","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","mainArea","senderWrap","inputAndButtons","textAreaWrapper","TextArea","textArea","onKeyDown","placeholder","autoSize","minRows","maxRows","border","boxShadow","outline","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 UploadFileResult,\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 = Infinity,\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 const normalizeUploadResponse = (response: any): UploadFileResult => {\n const data = response?.data ?? response;\n return (Array.isArray(data) ? data[0] : data) ?? {};\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 const responseData = normalizeUploadResponse(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 fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n }\n : f,\n ),\n );\n\n onUploadSuccess?.({\n ...localFile,\n status: \"success\",\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl || responseData.fileUrl || responseData.url,\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)\n .map((file) => {\n const responseData = normalizeUploadResponse(file.response);\n\n return {\n fileName: responseData.fileName || file.name,\n fileId: responseData.fileId || responseData.id || \"\",\n tempUrl:\n responseData.tempUrl || responseData.fileUrl || responseData.url || \"\",\n type: responseData.fileType || responseData.type || getExt(file),\n size: responseData.fileSize || responseData.size || file.size,\n mimeType: responseData.mimeType || file.type,\n raw: {\n ...responseData,\n },\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 (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n padding: \"12px 0\",\n }}\n >\n {files.map((file) => (\n <FileGallery\n key={file.id}\n file={file}\n removable\n onRemove={handleRemoveFile}\n />\n ))}\n </div>\n );\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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"}
|
|
@@ -33,7 +33,7 @@ export var createXGroupUploadRequest = function createXGroupUploadRequest(_ref2)
|
|
|
33
33
|
if (!appNo || !token) return undefined;
|
|
34
34
|
return /*#__PURE__*/function () {
|
|
35
35
|
var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref3) {
|
|
36
|
-
var file, onProgress, onSuccess, onError, _result$data, formData, response, result;
|
|
36
|
+
var file, onProgress, onSuccess, onError, _result$data, formData, response, result, uploadedFile;
|
|
37
37
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
38
38
|
while (1) switch (_context.prev = _context.next) {
|
|
39
39
|
case 0:
|
|
@@ -69,21 +69,22 @@ export var createXGroupUploadRequest = function createXGroupUploadRequest(_ref2)
|
|
|
69
69
|
}
|
|
70
70
|
throw new Error((result === null || result === void 0 ? void 0 : result.message) || "\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25 (".concat(response.status, ")"));
|
|
71
71
|
case 13:
|
|
72
|
+
uploadedFile = Array.isArray(result === null || result === void 0 ? void 0 : result.data) ? result.data[0] : (_result$data = result === null || result === void 0 ? void 0 : result.data) !== null && _result$data !== void 0 ? _result$data : result;
|
|
72
73
|
onProgress === null || onProgress === void 0 || onProgress({
|
|
73
74
|
percent: 100
|
|
74
75
|
});
|
|
75
|
-
onSuccess === null || onSuccess === void 0 || onSuccess(
|
|
76
|
-
_context.next =
|
|
76
|
+
onSuccess === null || onSuccess === void 0 || onSuccess(uploadedFile);
|
|
77
|
+
_context.next = 21;
|
|
77
78
|
break;
|
|
78
|
-
case
|
|
79
|
-
_context.prev =
|
|
79
|
+
case 18:
|
|
80
|
+
_context.prev = 18;
|
|
80
81
|
_context.t0 = _context["catch"](1);
|
|
81
82
|
onError === null || onError === void 0 || onError(_context.t0 instanceof Error ? _context.t0 : new Error("文件上传失败"));
|
|
82
|
-
case
|
|
83
|
+
case 21:
|
|
83
84
|
case "end":
|
|
84
85
|
return _context.stop();
|
|
85
86
|
}
|
|
86
|
-
}, _callee, null, [[1,
|
|
87
|
+
}, _callee, null, [[1, 18]]);
|
|
87
88
|
}));
|
|
88
89
|
return function (_x) {
|
|
89
90
|
return _ref4.apply(this, arguments);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["parseAgentMessage","baseToolKindResolver","xGroupToolKindResolver","_ref","name","baseChatStrategies","resolveToolKind","createFunctionResponse","fnCall","confirmed","id","response","parseProcessMessage","createXGroupUploadRequest","_ref2","url","token","appNo","undefined","_ref4","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_ref3","file","onProgress","onSuccess","onError","_result$data","formData","result","wrap","_callee$","_context","prev","next","percent","FormData","append","fetch","concat","method","body","credentials","headers","Accept","Authorization","sent","json","catch","ok","Error","message","status","data","t0","stop","_x","apply","arguments","xGroupAdkPreset","strategies","text","options","_objectSpread","mode","createUploadRequest","basePreset","resolveChatPreset","preset","mergeChatStrategies","overrides","resolvePresetUploadRequest","context","_resolveChatPreset$cr","_resolveChatPreset","call"],"sources":["../../../src/presets/xGroupAdk.ts"],"sourcesContent":["import { parseAgentMessage } from \"@/utils\";\nimport type {\n ChatPreset,\n ChatPresetInput,\n ChatStrategies,\n FunctionCall,\n FunctionResponse,\n ToolRenderKind,\n UploadRequestFn,\n} from \"@/types\";\n\nexport const baseToolKindResolver = (): ToolRenderKind => \"default\";\n\nexport const xGroupToolKindResolver = ({\n name,\n}: {\n name?: string;\n}): ToolRenderKind => {\n if (name === \"adk_request_confirmation\") return \"approval\";\n if (name === \"transferToAgent\") return \"handoff\";\n return \"default\";\n};\n\nexport const baseChatStrategies: Required<\n Pick<ChatStrategies, \"resolveToolKind\" | \"createFunctionResponse\" | \"parseProcessMessage\">\n> = {\n resolveToolKind: () => \"default\",\n createFunctionResponse: (\n fnCall: FunctionCall,\n confirmed: boolean,\n ): FunctionResponse => ({\n id: fnCall.id,\n name: fnCall.name,\n response: { confirmed },\n }),\n parseProcessMessage: parseAgentMessage,\n};\n\nexport const createXGroupUploadRequest = ({\n url,\n token,\n appNo,\n}: {\n url: string;\n token?: string;\n appNo?: string;\n}): UploadRequestFn | undefined => {\n if (!appNo || !token) return undefined;\n\n return async ({ file, onProgress, onSuccess, onError }) => {\n try {\n onProgress?.({ percent: 0 });\n\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetch(\n `${url}/api/gateway-web/openApi/v1/aizt/app/${appNo}/uploadMultiFile`,\n {\n method: \"POST\",\n body: formData,\n credentials: \"include\",\n headers: {\n Accept: \"application/json, text/plain, */*\",\n Authorization: `Bearer ${token}`,\n \"Cache-Control\": \"no-cache\",\n },\n },\n );\n\n const result = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n throw new Error(result?.message || `文件上传失败 (${response.status})`);\n }\n\n onProgress?.({ percent: 100 });\n onSuccess?.(
|
|
1
|
+
{"version":3,"names":["parseAgentMessage","baseToolKindResolver","xGroupToolKindResolver","_ref","name","baseChatStrategies","resolveToolKind","createFunctionResponse","fnCall","confirmed","id","response","parseProcessMessage","createXGroupUploadRequest","_ref2","url","token","appNo","undefined","_ref4","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_ref3","file","onProgress","onSuccess","onError","_result$data","formData","result","uploadedFile","wrap","_callee$","_context","prev","next","percent","FormData","append","fetch","concat","method","body","credentials","headers","Accept","Authorization","sent","json","catch","ok","Error","message","status","Array","isArray","data","t0","stop","_x","apply","arguments","xGroupAdkPreset","strategies","text","options","_objectSpread","mode","createUploadRequest","basePreset","resolveChatPreset","preset","mergeChatStrategies","overrides","resolvePresetUploadRequest","context","_resolveChatPreset$cr","_resolveChatPreset","call"],"sources":["../../../src/presets/xGroupAdk.ts"],"sourcesContent":["import { parseAgentMessage } from \"@/utils\";\nimport type {\n ChatPreset,\n ChatPresetInput,\n ChatStrategies,\n FunctionCall,\n FunctionResponse,\n ToolRenderKind,\n UploadRequestFn,\n} from \"@/types\";\n\nexport const baseToolKindResolver = (): ToolRenderKind => \"default\";\n\nexport const xGroupToolKindResolver = ({\n name,\n}: {\n name?: string;\n}): ToolRenderKind => {\n if (name === \"adk_request_confirmation\") return \"approval\";\n if (name === \"transferToAgent\") return \"handoff\";\n return \"default\";\n};\n\nexport const baseChatStrategies: Required<\n Pick<ChatStrategies, \"resolveToolKind\" | \"createFunctionResponse\" | \"parseProcessMessage\">\n> = {\n resolveToolKind: () => \"default\",\n createFunctionResponse: (\n fnCall: FunctionCall,\n confirmed: boolean,\n ): FunctionResponse => ({\n id: fnCall.id,\n name: fnCall.name,\n response: { confirmed },\n }),\n parseProcessMessage: parseAgentMessage,\n};\n\nexport const createXGroupUploadRequest = ({\n url,\n token,\n appNo,\n}: {\n url: string;\n token?: string;\n appNo?: string;\n}): UploadRequestFn | undefined => {\n if (!appNo || !token) return undefined;\n\n return async ({ file, onProgress, onSuccess, onError }) => {\n try {\n onProgress?.({ percent: 0 });\n\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetch(\n `${url}/api/gateway-web/openApi/v1/aizt/app/${appNo}/uploadMultiFile`,\n {\n method: \"POST\",\n body: formData,\n credentials: \"include\",\n headers: {\n Accept: \"application/json, text/plain, */*\",\n Authorization: `Bearer ${token}`,\n \"Cache-Control\": \"no-cache\",\n },\n },\n );\n\n const result = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n throw new Error(result?.message || `文件上传失败 (${response.status})`);\n }\n\n const uploadedFile = Array.isArray(result?.data)\n ? result.data[0]\n : result?.data ?? result;\n\n onProgress?.({ percent: 100 });\n onSuccess?.(uploadedFile);\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(\"文件上传失败\"));\n }\n };\n};\n\nexport const xGroupAdkPreset: ChatPreset = {\n name: \"xgroup-adk\",\n strategies: {\n resolveToolKind: xGroupToolKindResolver,\n createFunctionResponse: baseChatStrategies.createFunctionResponse,\n parseProcessMessage: (text, options) =>\n parseAgentMessage(text, { mode: \"comment\", ...options }),\n },\n createUploadRequest: createXGroupUploadRequest,\n};\n\nexport const basePreset: ChatPreset = {\n name: \"base\",\n strategies: baseChatStrategies,\n};\n\nexport const resolveChatPreset = (\n preset: ChatPresetInput | undefined,\n): ChatPreset => {\n if (!preset || preset === \"xgroup-adk\") return xGroupAdkPreset;\n if (preset === \"base\") return basePreset;\n return preset;\n};\n\nexport const mergeChatStrategies = (\n preset: ChatPresetInput | undefined,\n overrides?: ChatStrategies,\n): ChatStrategies => ({\n ...baseChatStrategies,\n ...resolveChatPreset(preset).strategies,\n ...overrides,\n});\n\nexport const resolvePresetUploadRequest = (\n preset: ChatPresetInput | undefined,\n context: {\n url: string;\n token?: string;\n appNo?: string;\n },\n): UploadRequestFn | undefined => {\n return resolveChatPreset(preset).createUploadRequest?.(context);\n};\n"],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ export interface UploadFileResult {
|
|
|
11
11
|
[key: string]: any;
|
|
12
12
|
}
|
|
13
13
|
export interface UploadSuccessResponse {
|
|
14
|
-
data?: UploadFileResult;
|
|
14
|
+
data?: UploadFileResult | UploadFileResult[];
|
|
15
15
|
[key: string]: any;
|
|
16
16
|
}
|
|
17
17
|
interface uploadRequestProps {
|
|
@@ -20,7 +20,7 @@ interface uploadRequestProps {
|
|
|
20
20
|
onProgress?: (e: {
|
|
21
21
|
percent: number;
|
|
22
22
|
}) => void;
|
|
23
|
-
onSuccess?: (response: UploadFileResult | UploadSuccessResponse) => void;
|
|
23
|
+
onSuccess?: (response: UploadFileResult | UploadFileResult[] | UploadSuccessResponse) => void;
|
|
24
24
|
onError?: (error: Error) => void;
|
|
25
25
|
}): Promise<void> | void;
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../src/types/XAdkSender.ts"],"sourcesContent":["// types/XAdkSender.ts\nimport React from \"react\";\n\nexport interface UploadFileResult {\n fileName?: string;\n fileId?: string | number;\n tempUrl?: string;\n url?: string;\n fileUrl?: string;\n fileType?: string;\n fileSize?: number;\n mimeType?: string;\n [key: string]: any;\n}\n\nexport interface UploadSuccessResponse {\n data?: UploadFileResult;\n [key: string]: any;\n}\n\ninterface uploadRequestProps {\n (options: {\n file: File;\n onProgress?: (e: { percent: number }) => void;\n onSuccess?: (response: UploadFileResult | UploadSuccessResponse) => void;\n onError?: (error: Error) => void;\n }): Promise<void> | void;\n}\n\nexport type UploadRequestFn = uploadRequestProps;\n\nexport interface ServerFile {\n fileName: string;\n fileId: string | number;\n tempUrl: string;\n type: string;\n size?: number;\n mimeType: string;\n raw?: UploadFileResult;\n}\n\nexport interface LocalFile {\n id: string;\n uid: string;\n name: string;\n file: File;\n size: number;\n type: string;\n progress: number;\n status: \"pending\" | \"uploading\" | \"success\" | \"error\";\n // 服务器返回字段\n fileId?: string | number;\n tempUrl?: string;\n response?: any;\n errorMessage?: string; // 上传错误信息\n}\n\nexport type FileValidator = (\n file: File,\n context: { files: LocalFile[] },\n) => string | null;\n\nexport interface ActionsComponents {\n SendButton: React.ComponentType<any>;\n 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 // 数据层回调\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":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../src/types/XAdkSender.ts"],"sourcesContent":["// types/XAdkSender.ts\nimport React from \"react\";\n\nexport interface UploadFileResult {\n fileName?: string;\n fileId?: string | number;\n tempUrl?: string;\n url?: string;\n fileUrl?: string;\n fileType?: string;\n fileSize?: number;\n mimeType?: string;\n [key: string]: any;\n}\n\nexport interface UploadSuccessResponse {\n data?: UploadFileResult | UploadFileResult[];\n [key: string]: any;\n}\n\ninterface uploadRequestProps {\n (options: {\n file: File;\n onProgress?: (e: { percent: number }) => void;\n onSuccess?: (\n response: UploadFileResult | UploadFileResult[] | UploadSuccessResponse,\n ) => void;\n onError?: (error: Error) => void;\n }): Promise<void> | void;\n}\n\nexport type UploadRequestFn = uploadRequestProps;\n\nexport interface ServerFile {\n fileName: string;\n fileId: string | number;\n tempUrl: string;\n type: string;\n size?: number;\n mimeType: string;\n raw?: UploadFileResult;\n}\n\nexport interface LocalFile {\n id: string;\n uid: string;\n name: string;\n file: File;\n size: number;\n type: string;\n progress: number;\n status: \"pending\" | \"uploading\" | \"success\" | \"error\";\n // 服务器返回字段\n fileId?: string | number;\n tempUrl?: string;\n response?: any;\n errorMessage?: string; // 上传错误信息\n}\n\nexport type FileValidator = (\n file: File,\n context: { files: LocalFile[] },\n) => string | null;\n\nexport interface ActionsComponents {\n SendButton: React.ComponentType<any>;\n 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 // 数据层回调\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":""}
|