@ai-group/chat-sdk 3.0.3 → 3.0.5

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.
Files changed (42) hide show
  1. package/dist/cjs/components/FileGallery/FileGallery.stories.d.ts +6 -0
  2. package/dist/cjs/components/FileGallery/FileGallery.stories.js +143 -0
  3. package/dist/cjs/components/FileGallery/FileGallery.stories.js.map +7 -0
  4. package/dist/cjs/components/FileGallery/index.d.ts +13 -12
  5. package/dist/cjs/components/FileGallery/index.js +165 -159
  6. package/dist/cjs/components/FileGallery/index.js.map +2 -2
  7. package/dist/cjs/components/FileGallery/styles.js +5 -0
  8. package/dist/cjs/components/FileGallery/styles.js.map +2 -2
  9. package/dist/cjs/components/XAdkChatbot/XAdkChatbot.stories.js +18 -9
  10. package/dist/cjs/components/XAdkChatbot/XAdkChatbot.stories.js.map +2 -2
  11. package/dist/cjs/components/XAdkChatbot/index.js +11 -3
  12. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  13. package/dist/cjs/components/XAdkChatbot/styles.d.ts +1 -0
  14. package/dist/cjs/components/XAdkChatbot/styles.js +7 -0
  15. package/dist/cjs/components/XAdkChatbot/styles.js.map +2 -2
  16. package/dist/cjs/components/XAdkSender/index.js +24 -13
  17. package/dist/cjs/components/XAdkSender/index.js.map +2 -2
  18. package/dist/cjs/types/FileGallery.d.ts +1 -21
  19. package/dist/cjs/types/FileGallery.js.map +1 -1
  20. package/dist/cjs/types/XAdkSender.js.map +1 -1
  21. package/dist/esm/components/FileGallery/FileGallery.stories.d.ts +6 -0
  22. package/dist/esm/components/FileGallery/FileGallery.stories.js +48 -0
  23. package/dist/esm/components/FileGallery/FileGallery.stories.js.map +1 -0
  24. package/dist/esm/components/FileGallery/index.d.ts +13 -12
  25. package/dist/esm/components/FileGallery/index.js +48 -69
  26. package/dist/esm/components/FileGallery/index.js.map +1 -1
  27. package/dist/esm/components/FileGallery/styles.js +1 -1
  28. package/dist/esm/components/FileGallery/styles.js.map +1 -1
  29. package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.js +17 -13
  30. package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.js.map +1 -1
  31. package/dist/esm/components/XAdkChatbot/index.js +23 -6
  32. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  33. package/dist/esm/components/XAdkChatbot/styles.d.ts +1 -0
  34. package/dist/esm/components/XAdkChatbot/styles.js +21 -20
  35. package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
  36. package/dist/esm/components/XAdkSender/index.js +30 -17
  37. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  38. package/dist/esm/types/FileGallery.d.ts +1 -21
  39. package/dist/esm/types/FileGallery.js.map +1 -1
  40. package/dist/esm/types/XAdkSender.js.map +1 -1
  41. package/dist/umd/chat-sdk.min.js +1 -1
  42. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"names":["React","useState","useEffect","Image","Tooltip","Progress","FileOutlined","FilePdfOutlined","FileWordOutlined","FileExcelOutlined","FilePptOutlined","FileImageOutlined","CloseOutlined","AudioOutlined","VideoCameraOutlined","useStyles","jsx","_jsx","jsxs","_jsxs","getFileName","file","displayName","name","getFileSize","size","getMimeType","mimeType","type","getFileUrl","_file$response","_file$response2","fileUri","response","fileUrl","tempUrl","getFileId","id","uid","isImageFile","startsWith","fileName","match","url","isAudioFile","isVideoFile","getFileExtension","filename","ext","split","pop","toLowerCase","getFileIcon","icon","color","includes","formatFileSize","bytes","toFixed","styles","FileItemComponent","_ref","removable","onRemove","_useState","_useState2","_slicedToArray","objectUrl","setObjectUrl","URL","createObjectURL","revokeObjectURL","isImage","isAudio","isVideo","fileSize","fileId","className","fileCard","children","imageThumbnail","src","alt","fallback","preview","status","imageOverlay","percent","progress","strokeColor","fileInfo","title","length","concat","substring","fileRemoveBtn","onClick","disabled","fileIcon","style","controls","mediaWrapper","width","height","_getFileIcon","isExternalUrl","href","target","rel","fileLink","showInfo","errorMessage","fontSize","marginTop","FileGallery","_ref2","files","_ref2$align","align","_ref2$removable","_ref2$onRemove","container","fileList","PreviewGroup","map","index"],"sources":["../../../../src/components/FileGallery/index.tsx"],"sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport { Image, Tooltip, Progress } from \"antd\";\nimport {\n FileOutlined,\n FilePdfOutlined,\n FileWordOutlined,\n FileExcelOutlined,\n FilePptOutlined,\n FileImageOutlined,\n CloseOutlined,\n AudioOutlined,\n VideoCameraOutlined,\n} from \"@ant-design/icons\";\nimport { FileItem, FileGalleryProps, FileItemComponentProps } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\n// ==================== 工具函数 ====================\n\n/**\n * 获取文件名\n */\nconst getFileName = (file: FileItem): string => {\n return file.displayName || file.name || \"\";\n};\n\n/**\n * 获取文件大小\n */\nconst getFileSize = (file: FileItem): number => {\n return file.size || 0;\n};\n\n/**\n * 获取文件 MIME 类型\n */\nconst getMimeType = (file: FileItem): string => {\n return file.mimeType || file.type || \"\";\n};\n\n/**\n * 获取文件 URL\n */\nconst getFileUrl = (file: FileItem): string => {\n return (\n file.fileUri ||\n file.response?.fileUrl ||\n file.response?.tempUrl ||\n file.tempUrl ||\n \"\"\n );\n};\n\n/**\n * 获取文件唯一标识\n */\nconst getFileId = (file: FileItem): string => {\n return file.id || file.uid || \"\";\n};\n\n/**\n * 判断是否是图片文件\n */\nconst isImageFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"image/\")) return true;\n\n const fileName = getFileName(file);\n if (fileName && fileName.match(/\\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i))\n return true;\n\n const url = getFileUrl(file);\n if (url && url.match(/\\.(jpg|jpeg|png|gif|webp|bmp|svg)(\\?.*)?$/i))\n return true;\n\n return false;\n};\n\n/**\n * 判断是否是音频文件\n */\nconst isAudioFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"audio/\")) return true;\n\n const fileName = getFileName(file);\n return !!fileName?.match(/\\.(mp3|wav|m4a|aac|ogg|flac)$/i);\n};\n\n/**\n * 判断是否是视频文件\n */\nconst isVideoFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"video/\")) return true;\n\n const fileName = getFileName(file);\n return !!fileName?.match(/\\.(mp4|mov|webm|mkv|avi)$/i);\n};\n\n/**\n * 获取文件扩展名\n */\nconst getFileExtension = (filename: string): string => {\n const ext = filename.split(\".\").pop();\n return ext ? ext.toLowerCase() : \"\";\n};\n\n/**\n * 获取文件图标和颜色\n */\nconst getFileIcon = (\n file: FileItem,\n): { icon: React.ReactNode; color: string } => {\n const ext = getFileExtension(getFileName(file));\n\n // PDF\n if (ext === \"pdf\") {\n return { icon: <FilePdfOutlined />, color: \"#ff4d4f\" };\n }\n\n // Word\n if ([\"doc\", \"docx\"].includes(ext)) {\n return { icon: <FileWordOutlined />, color: \"#1677ff\" };\n }\n\n // Excel\n if ([\"xls\", \"xlsx\", \"csv\"].includes(ext)) {\n return { icon: <FileExcelOutlined />, color: \"#22b35e\" };\n }\n\n // PPT\n if ([\"ppt\", \"pptx\"].includes(ext)) {\n return { icon: <FilePptOutlined />, color: \"#ff6e31\" };\n }\n\n // Audio\n if ([\"mp3\", \"wav\", \"m4a\", \"aac\", \"ogg\", \"flac\"].includes(ext)) {\n return { icon: <AudioOutlined />, color: \"#722ed1\" };\n }\n\n // Video\n if ([\"mp4\", \"mov\", \"webm\", \"mkv\", \"avi\"].includes(ext)) {\n return { icon: <VideoCameraOutlined />, color: \"#fa8c16\" };\n }\n\n // 图片\n if (isImageFile(file)) {\n return { icon: <FileImageOutlined />, color: \"#8c8c8c\" };\n }\n\n // 默认\n return { icon: <FileOutlined />, color: \"#8c8c8c\" };\n};\n\n/**\n * 格式化文件大小\n */\nconst formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return bytes + \" B\";\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + \" KB\";\n return (bytes / (1024 * 1024)).toFixed(1) + \" MB\";\n};\n\nconst styles = useStyles();\n\n// ==================== 子组件 ====================\n\nconst FileItemComponent: React.FC<FileItemComponentProps> = ({\n file,\n removable,\n onRemove,\n}) => {\n const [objectUrl, setObjectUrl] = useState(\"\");\n\n useEffect(() => {\n if (!file.file) return;\n\n const url = URL.createObjectURL(file.file);\n setObjectUrl(url);\n\n return () => URL.revokeObjectURL(url);\n }, [file.file]);\n\n const isImage = isImageFile(file);\n const isAudio = isAudioFile(file);\n const isVideo = isVideoFile(file);\n const fileName = getFileName(file);\n const fileSize = getFileSize(file);\n const fileId = getFileId(file);\n const url = getFileUrl(file) || objectUrl;\n\n // 图片文件\n if (isImage) {\n return (\n <div className={styles.fileCard}>\n {/* 图片缩略图 */}\n <div className={styles.imageThumbnail}>\n <Image\n src={url}\n alt={fileName}\n fallback=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mN8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==\"\n preview={{\n src: url,\n }}\n />\n\n {/* 上传进度遮罩 */}\n {file.status === \"uploading\" && (\n <div className={styles.imageOverlay}>\n <Progress\n type=\"circle\"\n percent={file.progress}\n size={30}\n strokeColor=\"#1677ff\"\n />\n </div>\n )}\n </div>\n\n {/* 文件信息 */}\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n <div className={styles.fileSize}>{formatFileSize(fileSize)}</div>\n </div>\n\n {/* 删除按钮 */}\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 音频文件\n if (isAudio) {\n return (\n <div className={styles.fileCard}>\n <div className={styles.fileIcon} style={{ color: \"#722ed1\" }}>\n <AudioOutlined />\n </div>\n\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>{fileName}</div>\n </Tooltip>\n\n <audio\n src={url}\n controls\n className={styles.mediaWrapper}\n style={{ width: \"100%\", height: 28 }}\n />\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 视频文件\n if (isVideo) {\n return (\n <div className={styles.fileCard}>\n <div className={styles.fileIcon} style={{ color: \"#fa8c16\" }}>\n <VideoCameraOutlined />\n </div>\n\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>{fileName}</div>\n </Tooltip>\n\n <video\n src={url}\n controls\n className={styles.mediaWrapper}\n style={{ width: \"100%\", height: 40 }}\n />\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 其他文件\n const { icon, color } = getFileIcon(file);\n const isExternalUrl = url && url.startsWith(\"http\");\n\n return (\n <div className={styles.fileCard}>\n <div className={styles.fileIcon} style={{ color }}>\n {icon}\n </div>\n\n <div className={styles.fileInfo}>\n {isExternalUrl ? (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.fileLink}\n >\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n </a>\n ) : (\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n )}\n\n {file.status === \"uploading\" ? (\n <Progress\n percent={file.progress}\n size=\"small\"\n showInfo={false}\n strokeColor=\"#1677ff\"\n className={styles.progress}\n />\n ) : (\n fileSize > 0 && (\n <div className={styles.fileSize}>{formatFileSize(fileSize)}</div>\n )\n )}\n\n {file.status === \"error\" && file.errorMessage && (\n <div\n style={{\n fontSize: \"11px\",\n color: \"#ff4d4f\",\n marginTop: \"2px\",\n }}\n >\n {file.errorMessage}\n </div>\n )}\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n};\n\n// ==================== 主组件 ====================\n\n/**\n * FileGallery - 通用文件展示组件\n *\n * 功能特性:\n * - 📁 支持多种文件类型展示 (图片、音频、视频、文档等)\n * - 🖼️ 图片支持预览和缩略图\n * - 🎵 音频文件支持内联播放\n * - 🎬 视频文件支持内联播放\n * - 📊 显示文件大小、类型图标\n * - 🗑️ 支持删除操作\n * - 📤 支持上传进度显示\n * - 🎨 支持左右对齐\n *\n * @example\n * // XAdkSender 场景 - 可删除的本地文件\n * <FileGallery\n * files={localFiles}\n * removable\n * onRemove={handleRemove}\n * align=\"left\"\n * />\n *\n * @example\n * // XadkChatbot 场景 - 只读的远程文件\n * <FileGallery\n * files={remoteFiles}\n * align=\"right\"\n * />\n */\nconst FileGallery: React.FC<FileGalleryProps> = ({\n files,\n align = \"left\",\n removable = false,\n onRemove = () => {},\n className,\n style,\n}) => {\n if (!files || files.length === 0) return null;\n\n return (\n <div\n className={`${styles.container} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n <div className={styles.fileList}>\n <Image.PreviewGroup>\n {files.map((file, index) => (\n <FileItemComponent\n key={getFileId(file) || index}\n file={file}\n removable={removable}\n onRemove={onRemove}\n />\n ))}\n </Image.PreviewGroup>\n </div>\n </div>\n );\n};\n\nexport default FileGallery;\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,QAAQ,EAAEC,SAAS,QAAQ,OAAO;AAClD,SAASC,KAAK,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,MAAM;AAC/C,SACEC,YAAY,EACZC,eAAe,EACfC,gBAAgB,EAChBC,iBAAiB,EACjBC,eAAe,EACfC,iBAAiB,EACjBC,aAAa,EACbC,aAAa,EACbC,mBAAmB,QACd,mBAAmB;AAE1B,SAASC,SAAS;;AAElB;;AAEA;AACA;AACA;AAFA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAGA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIC,IAAc,EAAa;EAC9C,OAAOA,IAAI,CAACC,WAAW,IAAID,IAAI,CAACE,IAAI,IAAI,EAAE;AAC5C,CAAC;;AAED;AACA;AACA;AACA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIH,IAAc,EAAa;EAC9C,OAAOA,IAAI,CAACI,IAAI,IAAI,CAAC;AACvB,CAAC;;AAED;AACA;AACA;AACA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIL,IAAc,EAAa;EAC9C,OAAOA,IAAI,CAACM,QAAQ,IAAIN,IAAI,CAACO,IAAI,IAAI,EAAE;AACzC,CAAC;;AAED;AACA;AACA;AACA,IAAMC,UAAU,GAAG,SAAbA,UAAUA,CAAIR,IAAc,EAAa;EAAA,IAAAS,cAAA,EAAAC,eAAA;EAC7C,OACEV,IAAI,CAACW,OAAO,MAAAF,cAAA,GACZT,IAAI,CAACY,QAAQ,cAAAH,cAAA,uBAAbA,cAAA,CAAeI,OAAO,OAAAH,eAAA,GACtBV,IAAI,CAACY,QAAQ,cAAAF,eAAA,uBAAbA,eAAA,CAAeI,OAAO,KACtBd,IAAI,CAACc,OAAO,IACZ,EAAE;AAEN,CAAC;;AAED;AACA;AACA;AACA,IAAMC,SAAS,GAAG,SAAZA,SAASA,CAAIf,IAAc,EAAa;EAC5C,OAAOA,IAAI,CAACgB,EAAE,IAAIhB,IAAI,CAACiB,GAAG,IAAI,EAAE;AAClC,CAAC;;AAED;AACA;AACA;AACA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIlB,IAAc,EAAc;EAC/C,IAAMM,QAAQ,GAAGD,WAAW,CAACL,IAAI,CAAC;EAClC,IAAIM,QAAQ,IAAIA,QAAQ,CAACa,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,IAAI;EAE1D,IAAMC,QAAQ,GAAGrB,WAAW,CAACC,IAAI,CAAC;EAClC,IAAIoB,QAAQ,IAAIA,QAAQ,CAACC,KAAK,CAAC,qCAAqC,CAAC,EACnE,OAAO,IAAI;EAEb,IAAMC,GAAG,GAAGd,UAAU,CAACR,IAAI,CAAC;EAC5B,IAAIsB,GAAG,IAAIA,GAAG,CAACD,KAAK,CAAC,4CAA4C,CAAC,EAChE,OAAO,IAAI;EAEb,OAAO,KAAK;AACd,CAAC;;AAED;AACA;AACA;AACA,IAAME,WAAW,GAAG,SAAdA,WAAWA,CAAIvB,IAAc,EAAc;EAC/C,IAAMM,QAAQ,GAAGD,WAAW,CAACL,IAAI,CAAC;EAClC,IAAIM,QAAQ,IAAIA,QAAQ,CAACa,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,IAAI;EAE1D,IAAMC,QAAQ,GAAGrB,WAAW,CAACC,IAAI,CAAC;EAClC,OAAO,CAAC,EAACoB,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAEC,KAAK,CAAC,gCAAgC,CAAC;AAC5D,CAAC;;AAED;AACA;AACA;AACA,IAAMG,WAAW,GAAG,SAAdA,WAAWA,CAAIxB,IAAc,EAAc;EAC/C,IAAMM,QAAQ,GAAGD,WAAW,CAACL,IAAI,CAAC;EAClC,IAAIM,QAAQ,IAAIA,QAAQ,CAACa,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,IAAI;EAE1D,IAAMC,QAAQ,GAAGrB,WAAW,CAACC,IAAI,CAAC;EAClC,OAAO,CAAC,EAACoB,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAEC,KAAK,CAAC,4BAA4B,CAAC;AACxD,CAAC;;AAED;AACA;AACA;AACA,IAAMI,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAIC,QAAgB,EAAa;EACrD,IAAMC,GAAG,GAAGD,QAAQ,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;EACrC,OAAOF,GAAG,GAAGA,GAAG,CAACG,WAAW,CAAC,CAAC,GAAG,EAAE;AACrC,CAAC;;AAED;AACA;AACA;AACA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CACf/B,IAAc,EAC+B;EAC7C,IAAM2B,GAAG,GAAGF,gBAAgB,CAAC1B,WAAW,CAACC,IAAI,CAAC,CAAC;;EAE/C;EACA,IAAI2B,GAAG,KAAK,KAAK,EAAE;IACjB,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACV,eAAe,IAAE,CAAC;MAAE+C,KAAK,EAAE;IAAU,CAAC;EACxD;;EAEA;EACA,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE;IACjC,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACT,gBAAgB,IAAE,CAAC;MAAE8C,KAAK,EAAE;IAAU,CAAC;EACzD;;EAEA;EACA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE;IACxC,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACR,iBAAiB,IAAE,CAAC;MAAE6C,KAAK,EAAE;IAAU,CAAC;EAC1D;;EAEA;EACA,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE;IACjC,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACP,eAAe,IAAE,CAAC;MAAE4C,KAAK,EAAE;IAAU,CAAC;EACxD;;EAEA;EACA,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE;IAC7D,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACJ,aAAa,IAAE,CAAC;MAAEyC,KAAK,EAAE;IAAU,CAAC;EACtD;;EAEA;EACA,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE;IACtD,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACH,mBAAmB,IAAE,CAAC;MAAEwC,KAAK,EAAE;IAAU,CAAC;EAC5D;;EAEA;EACA,IAAIf,WAAW,CAAClB,IAAI,CAAC,EAAE;IACrB,OAAO;MAAEgC,IAAI,eAAEpC,IAAA,CAACN,iBAAiB,IAAE,CAAC;MAAE2C,KAAK,EAAE;IAAU,CAAC;EAC1D;;EAEA;EACA,OAAO;IAAED,IAAI,eAAEpC,IAAA,CAACX,YAAY,IAAE,CAAC;IAAEgD,KAAK,EAAE;EAAU,CAAC;AACrD,CAAC;;AAED;AACA;AACA;AACA,IAAME,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,KAAa,EAAa;EAChD,IAAIA,KAAK,GAAG,IAAI,EAAE,OAAOA,KAAK,GAAG,IAAI;EACrC,IAAIA,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,CAACA,KAAK,GAAG,IAAI,EAAEC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;EACjE,OAAO,CAACD,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAEC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;AACnD,CAAC;AAED,IAAMC,MAAM,GAAG5C,SAAS,CAAC,CAAC;;AAE1B;;AAEA,IAAM6C,iBAAmD,GAAG,SAAtDA,iBAAmDA,CAAAC,IAAA,EAInD;EAAA,IAHJxC,IAAI,GAAAwC,IAAA,CAAJxC,IAAI;IACJyC,SAAS,GAAAD,IAAA,CAATC,SAAS;IACTC,QAAQ,GAAAF,IAAA,CAARE,QAAQ;EAER,IAAAC,SAAA,GAAkC/D,QAAQ,CAAC,EAAE,CAAC;IAAAgE,UAAA,GAAAC,cAAA,CAAAF,SAAA;IAAvCG,SAAS,GAAAF,UAAA;IAAEG,YAAY,GAAAH,UAAA;EAE9B/D,SAAS,CAAC,YAAM;IACd,IAAI,CAACmB,IAAI,CAACA,IAAI,EAAE;IAEhB,IAAMsB,GAAG,GAAG0B,GAAG,CAACC,eAAe,CAACjD,IAAI,CAACA,IAAI,CAAC;IAC1C+C,YAAY,CAACzB,GAAG,CAAC;IAEjB,OAAO;MAAA,OAAM0B,GAAG,CAACE,eAAe,CAAC5B,GAAG,CAAC;IAAA;EACvC,CAAC,EAAE,CAACtB,IAAI,CAACA,IAAI,CAAC,CAAC;EAEf,IAAMmD,OAAO,GAAGjC,WAAW,CAAClB,IAAI,CAAC;EACjC,IAAMoD,OAAO,GAAG7B,WAAW,CAACvB,IAAI,CAAC;EACjC,IAAMqD,OAAO,GAAG7B,WAAW,CAACxB,IAAI,CAAC;EACjC,IAAMoB,QAAQ,GAAGrB,WAAW,CAACC,IAAI,CAAC;EAClC,IAAMsD,QAAQ,GAAGnD,WAAW,CAACH,IAAI,CAAC;EAClC,IAAMuD,MAAM,GAAGxC,SAAS,CAACf,IAAI,CAAC;EAC9B,IAAMsB,GAAG,GAAGd,UAAU,CAACR,IAAI,CAAC,IAAI8C,SAAS;;EAEzC;EACA,IAAIK,OAAO,EAAE;IACX,oBACErD,KAAA;MAAK0D,SAAS,EAAElB,MAAM,CAACmB,QAAS;MAAAC,QAAA,gBAE9B5D,KAAA;QAAK0D,SAAS,EAAElB,MAAM,CAACqB,cAAe;QAAAD,QAAA,gBACpC9D,IAAA,CAACd,KAAK;UACJ8E,GAAG,EAAEtC,GAAI;UACTuC,GAAG,EAAEzC,QAAS;UACd0C,QAAQ,EAAC,wHAAwH;UACjIC,OAAO,EAAE;YACPH,GAAG,EAAEtC;UACP;QAAE,CACH,CAAC,EAGDtB,IAAI,CAACgE,MAAM,KAAK,WAAW,iBAC1BpE,IAAA;UAAK4D,SAAS,EAAElB,MAAM,CAAC2B,YAAa;UAAAP,QAAA,eAClC9D,IAAA,CAACZ,QAAQ;YACPuB,IAAI,EAAC,QAAQ;YACb2D,OAAO,EAAElE,IAAI,CAACmE,QAAS;YACvB/D,IAAI,EAAE,EAAG;YACTgE,WAAW,EAAC;UAAS,CACtB;QAAC,CACC,CACN;MAAA,CACE,CAAC,eAGNtE,KAAA;QAAK0D,SAAS,EAAElB,MAAM,CAAC+B,QAAS;QAAAX,QAAA,gBAC9B9D,IAAA,CAACb,OAAO;UAACuF,KAAK,EAAElD,QAAS;UAAAsC,QAAA,eACvB9D,IAAA;YAAK4D,SAAS,EAAElB,MAAM,CAAClB,QAAS;YAAAsC,QAAA,EAC7BtC,QAAQ,CAACmD,MAAM,GAAG,EAAE,MAAAC,MAAA,CACdpD,QAAQ,CAACqD,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,WAC5BrD;UAAQ,CACT;QAAC,CACC,CAAC,eACVxB,IAAA;UAAK4D,SAAS,EAAElB,MAAM,CAACgB,QAAS;UAAAI,QAAA,EAAEvB,cAAc,CAACmB,QAAQ;QAAC,CAAM,CAAC;MAAA,CAC9D,CAAC,EAGLb,SAAS,iBACR7C,IAAA;QACE4D,SAAS,EAAElB,MAAM,CAACoC,aAAc;QAChCC,OAAO,EAAE,SAAAA,QAAA;UAAA,OAAMjC,QAAQ,CAACa,MAAM,CAAC;QAAA,CAAC;QAChCqB,QAAQ,EAAE5E,IAAI,CAACgE,MAAM,KAAK,WAAY;QACtC,cAAW,0BAAM;QAAAN,QAAA,eAEjB9D,IAAA,CAACL,aAAa,IAAE;MAAC,CACX,CACT;IAAA,CACE,CAAC;EAEV;;EAEA;EACA,IAAI6D,OAAO,EAAE;IACX,oBACEtD,KAAA;MAAK0D,SAAS,EAAElB,MAAM,CAACmB,QAAS;MAAAC,QAAA,gBAC9B9D,IAAA;QAAK4D,SAAS,EAAElB,MAAM,CAACuC,QAAS;QAACC,KAAK,EAAE;UAAE7C,KAAK,EAAE;QAAU,CAAE;QAAAyB,QAAA,eAC3D9D,IAAA,CAACJ,aAAa,IAAE;MAAC,CACd,CAAC,eAENM,KAAA;QAAK0D,SAAS,EAAElB,MAAM,CAAC+B,QAAS;QAAAX,QAAA,gBAC9B9D,IAAA,CAACb,OAAO;UAACuF,KAAK,EAAElD,QAAS;UAAAsC,QAAA,eACvB9D,IAAA;YAAK4D,SAAS,EAAElB,MAAM,CAAClB,QAAS;YAAAsC,QAAA,EAAEtC;UAAQ,CAAM;QAAC,CAC1C,CAAC,eAEVxB,IAAA;UACEgE,GAAG,EAAEtC,GAAI;UACTyD,QAAQ;UACRvB,SAAS,EAAElB,MAAM,CAAC0C,YAAa;UAC/BF,KAAK,EAAE;YAAEG,KAAK,EAAE,MAAM;YAAEC,MAAM,EAAE;UAAG;QAAE,CACtC,CAAC;MAAA,CACC,CAAC,EAELzC,SAAS,iBACR7C,IAAA;QACE4D,SAAS,EAAElB,MAAM,CAACoC,aAAc;QAChCC,OAAO,EAAE,SAAAA,QAAA;UAAA,OAAMjC,QAAQ,CAACa,MAAM,CAAC;QAAA,CAAC;QAChCqB,QAAQ,EAAE5E,IAAI,CAACgE,MAAM,KAAK,WAAY;QACtC,cAAW,0BAAM;QAAAN,QAAA,eAEjB9D,IAAA,CAACL,aAAa,IAAE;MAAC,CACX,CACT;IAAA,CACE,CAAC;EAEV;;EAEA;EACA,IAAI8D,OAAO,EAAE;IACX,oBACEvD,KAAA;MAAK0D,SAAS,EAAElB,MAAM,CAACmB,QAAS;MAAAC,QAAA,gBAC9B9D,IAAA;QAAK4D,SAAS,EAAElB,MAAM,CAACuC,QAAS;QAACC,KAAK,EAAE;UAAE7C,KAAK,EAAE;QAAU,CAAE;QAAAyB,QAAA,eAC3D9D,IAAA,CAACH,mBAAmB,IAAE;MAAC,CACpB,CAAC,eAENK,KAAA;QAAK0D,SAAS,EAAElB,MAAM,CAAC+B,QAAS;QAAAX,QAAA,gBAC9B9D,IAAA,CAACb,OAAO;UAACuF,KAAK,EAAElD,QAAS;UAAAsC,QAAA,eACvB9D,IAAA;YAAK4D,SAAS,EAAElB,MAAM,CAAClB,QAAS;YAAAsC,QAAA,EAAEtC;UAAQ,CAAM;QAAC,CAC1C,CAAC,eAEVxB,IAAA;UACEgE,GAAG,EAAEtC,GAAI;UACTyD,QAAQ;UACRvB,SAAS,EAAElB,MAAM,CAAC0C,YAAa;UAC/BF,KAAK,EAAE;YAAEG,KAAK,EAAE,MAAM;YAAEC,MAAM,EAAE;UAAG;QAAE,CACtC,CAAC;MAAA,CACC,CAAC,EAELzC,SAAS,iBACR7C,IAAA;QACE4D,SAAS,EAAElB,MAAM,CAACoC,aAAc;QAChCC,OAAO,EAAE,SAAAA,QAAA;UAAA,OAAMjC,QAAQ,CAACa,MAAM,CAAC;QAAA,CAAC;QAChCqB,QAAQ,EAAE5E,IAAI,CAACgE,MAAM,KAAK,WAAY;QACtC,cAAW,0BAAM;QAAAN,QAAA,eAEjB9D,IAAA,CAACL,aAAa,IAAE;MAAC,CACX,CACT;IAAA,CACE,CAAC;EAEV;;EAEA;EACA,IAAA4F,YAAA,GAAwBpD,WAAW,CAAC/B,IAAI,CAAC;IAAjCgC,IAAI,GAAAmD,YAAA,CAAJnD,IAAI;IAAEC,KAAK,GAAAkD,YAAA,CAALlD,KAAK;EACnB,IAAMmD,aAAa,GAAG9D,GAAG,IAAIA,GAAG,CAACH,UAAU,CAAC,MAAM,CAAC;EAEnD,oBACErB,KAAA;IAAK0D,SAAS,EAAElB,MAAM,CAACmB,QAAS;IAAAC,QAAA,gBAC9B9D,IAAA;MAAK4D,SAAS,EAAElB,MAAM,CAACuC,QAAS;MAACC,KAAK,EAAE;QAAE7C,KAAK,EAALA;MAAM,CAAE;MAAAyB,QAAA,EAC/C1B;IAAI,CACF,CAAC,eAENlC,KAAA;MAAK0D,SAAS,EAAElB,MAAM,CAAC+B,QAAS;MAAAX,QAAA,GAC7B0B,aAAa,gBACZxF,IAAA;QACEyF,IAAI,EAAE/D,GAAI;QACVgE,MAAM,EAAC,QAAQ;QACfC,GAAG,EAAC,qBAAqB;QACzB/B,SAAS,EAAElB,MAAM,CAACkD,QAAS;QAAA9B,QAAA,eAE3B9D,IAAA,CAACb,OAAO;UAACuF,KAAK,EAAElD,QAAS;UAAAsC,QAAA,eACvB9D,IAAA;YAAK4D,SAAS,EAAElB,MAAM,CAAClB,QAAS;YAAAsC,QAAA,EAC7BtC,QAAQ,CAACmD,MAAM,GAAG,EAAE,MAAAC,MAAA,CACdpD,QAAQ,CAACqD,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,WAC5BrD;UAAQ,CACT;QAAC,CACC;MAAC,CACT,CAAC,gBAEJxB,IAAA,CAACb,OAAO;QAACuF,KAAK,EAAElD,QAAS;QAAAsC,QAAA,eACvB9D,IAAA;UAAK4D,SAAS,EAAElB,MAAM,CAAClB,QAAS;UAAAsC,QAAA,EAC7BtC,QAAQ,CAACmD,MAAM,GAAG,EAAE,MAAAC,MAAA,CACdpD,QAAQ,CAACqD,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,WAC5BrD;QAAQ,CACT;MAAC,CACC,CACV,EAEApB,IAAI,CAACgE,MAAM,KAAK,WAAW,gBAC1BpE,IAAA,CAACZ,QAAQ;QACPkF,OAAO,EAAElE,IAAI,CAACmE,QAAS;QACvB/D,IAAI,EAAC,OAAO;QACZqF,QAAQ,EAAE,KAAM;QAChBrB,WAAW,EAAC,SAAS;QACrBZ,SAAS,EAAElB,MAAM,CAAC6B;MAAS,CAC5B,CAAC,GAEFb,QAAQ,GAAG,CAAC,iBACV1D,IAAA;QAAK4D,SAAS,EAAElB,MAAM,CAACgB,QAAS;QAAAI,QAAA,EAAEvB,cAAc,CAACmB,QAAQ;MAAC,CAAM,CAEnE,EAEAtD,IAAI,CAACgE,MAAM,KAAK,OAAO,IAAIhE,IAAI,CAAC0F,YAAY,iBAC3C9F,IAAA;QACEkF,KAAK,EAAE;UACLa,QAAQ,EAAE,MAAM;UAChB1D,KAAK,EAAE,SAAS;UAChB2D,SAAS,EAAE;QACb,CAAE;QAAAlC,QAAA,EAED1D,IAAI,CAAC0F;MAAY,CACf,CACN;IAAA,CACE,CAAC,EAELjD,SAAS,iBACR7C,IAAA;MACE4D,SAAS,EAAElB,MAAM,CAACoC,aAAc;MAChCC,OAAO,EAAE,SAAAA,QAAA;QAAA,OAAMjC,QAAQ,CAACa,MAAM,CAAC;MAAA,CAAC;MAChCqB,QAAQ,EAAE5E,IAAI,CAACgE,MAAM,KAAK,WAAY;MACtC,cAAW,0BAAM;MAAAN,QAAA,eAEjB9D,IAAA,CAACL,aAAa,IAAE;IAAC,CACX,CACT;EAAA,CACE,CAAC;AAEV,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMsG,WAAuC,GAAG,SAA1CA,WAAuCA,CAAAC,KAAA,EAOvC;EAAA,IANJC,KAAK,GAAAD,KAAA,CAALC,KAAK;IAAAC,WAAA,GAAAF,KAAA,CACLG,KAAK;IAALA,KAAK,GAAAD,WAAA,cAAG,MAAM,GAAAA,WAAA;IAAAE,eAAA,GAAAJ,KAAA,CACdrD,SAAS;IAATA,SAAS,GAAAyD,eAAA,cAAG,KAAK,GAAAA,eAAA;IAAAC,cAAA,GAAAL,KAAA,CACjBpD,QAAQ;IAARA,QAAQ,GAAAyD,cAAA,cAAG,YAAM,CAAC,CAAC,GAAAA,cAAA;IACnB3C,SAAS,GAAAsC,KAAA,CAATtC,SAAS;IACTsB,KAAK,GAAAgB,KAAA,CAALhB,KAAK;EAEL,IAAI,CAACiB,KAAK,IAAIA,KAAK,CAACxB,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;EAE7C,oBACE3E,IAAA;IACE4D,SAAS,KAAAgB,MAAA,CAAKlC,MAAM,CAAC8D,SAAS,OAAA5B,MAAA,CAAIyB,KAAK,KAAK,OAAO,GAAG,aAAa,GAAG,EAAE,OAAAzB,MAAA,CAAIhB,SAAS,IAAI,EAAE,CAAG;IAC9FsB,KAAK,EAAEA,KAAM;IAAApB,QAAA,eAEb9D,IAAA;MAAK4D,SAAS,EAAElB,MAAM,CAAC+D,QAAS;MAAA3C,QAAA,eAC9B9D,IAAA,CAACd,KAAK,CAACwH,YAAY;QAAA5C,QAAA,EAChBqC,KAAK,CAACQ,GAAG,CAAC,UAACvG,IAAI,EAAEwG,KAAK;UAAA,oBACrB5G,IAAA,CAAC2C,iBAAiB;YAEhBvC,IAAI,EAAEA,IAAK;YACXyC,SAAS,EAAEA,SAAU;YACrBC,QAAQ,EAAEA;UAAS,GAHd3B,SAAS,CAACf,IAAI,CAAC,IAAIwG,KAIzB,CAAC;QAAA,CACH;MAAC,CACgB;IAAC,CAClB;EAAC,CACH,CAAC;AAEV,CAAC;AAED,eAAeX,WAAW"}
1
+ {"version":3,"names":["React","useState","useEffect","Image","Tooltip","Progress","FileOutlined","FilePdfOutlined","FileWordOutlined","FileExcelOutlined","FilePptOutlined","FileImageOutlined","CloseOutlined","AudioOutlined","VideoCameraOutlined","useStyles","jsx","_jsx","jsxs","_jsxs","getFileName","file","displayName","name","getFileSize","size","getMimeType","mimeType","type","getFileUrl","_file$response","_file$response2","fileUri","response","fileUrl","tempUrl","getFileId","id","uid","isImageFile","startsWith","fileName","match","url","isAudioFile","isVideoFile","getFileExtension","filename","ext","split","pop","toLowerCase","getFileIcon","icon","color","includes","formatFileSize","bytes","toFixed","styles","FileGallery","_ref","_ref$align","align","_ref$removable","removable","_ref$onRemove","onRemove","className","style","_useState","_useState2","_slicedToArray","objectUrl","setObjectUrl","URL","createObjectURL","revokeObjectURL","isImage","isAudio","isVideo","fileSize","fileId","concat","fileCard","children","imageThumbnail","src","alt","fallback","preview","status","imageOverlay","percent","progress","strokeColor","fileInfo","title","length","substring","fileRemoveBtn","onClick","disabled","fileIcon","controls","mediaWrapper","width","height","_getFileIcon","isExternalUrl","href","target","rel","fileLink","showInfo","errorMessage","fontSize","marginTop"],"sources":["../../../../src/components/FileGallery/index.tsx"],"sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport { Image, Tooltip, Progress } from \"antd\";\nimport {\n FileOutlined,\n FilePdfOutlined,\n FileWordOutlined,\n FileExcelOutlined,\n FilePptOutlined,\n FileImageOutlined,\n CloseOutlined,\n AudioOutlined,\n VideoCameraOutlined,\n} from \"@ant-design/icons\";\nimport { FileItem, FileGalleryProps, FileItemComponentProps } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\n// ==================== 工具函数 ====================\n\n/**\n * 获取文件名\n */\nconst getFileName = (file: FileItem): string => {\n return file.displayName || file.name || \"\";\n};\n\n/**\n * 获取文件大小\n */\nconst getFileSize = (file: FileItem): number => {\n return file.size || 0;\n};\n\n/**\n * 获取文件 MIME 类型\n */\nconst getMimeType = (file: FileItem): string => {\n return file.mimeType || file.type || \"\";\n};\n\n/**\n * 获取文件 URL\n */\nconst getFileUrl = (file: FileItem): string => {\n return (\n file.fileUri ||\n file.response?.fileUrl ||\n file.response?.tempUrl ||\n file.tempUrl ||\n \"\"\n );\n};\n\n/**\n * 获取文件唯一标识\n */\nconst getFileId = (file: FileItem): string => {\n return file.id || file.uid || \"\";\n};\n\n/**\n * 判断是否是图片文件\n */\nconst isImageFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"image/\")) return true;\n\n const fileName = getFileName(file);\n if (fileName && fileName.match(/\\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i))\n return true;\n\n const url = getFileUrl(file);\n if (url && url.match(/\\.(jpg|jpeg|png|gif|webp|bmp|svg)(\\?.*)?$/i))\n return true;\n\n return false;\n};\n\n/**\n * 判断是否是音频文件\n */\nconst isAudioFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"audio/\")) return true;\n\n const fileName = getFileName(file);\n return !!fileName?.match(/\\.(mp3|wav|m4a|aac|ogg|flac)$/i);\n};\n\n/**\n * 判断是否是视频文件\n */\nconst isVideoFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"video/\")) return true;\n\n const fileName = getFileName(file);\n return !!fileName?.match(/\\.(mp4|mov|webm|mkv|avi)$/i);\n};\n\n/**\n * 获取文件扩展名\n */\nconst getFileExtension = (filename: string): string => {\n const ext = filename.split(\".\").pop();\n return ext ? ext.toLowerCase() : \"\";\n};\n\n/**\n * 获取文件图标和颜色\n */\nconst getFileIcon = (\n file: FileItem,\n): { icon: React.ReactNode; color: string } => {\n const ext = getFileExtension(getFileName(file));\n\n // PDF\n if (ext === \"pdf\") {\n return { icon: <FilePdfOutlined />, color: \"#ff4d4f\" };\n }\n\n // Word\n if ([\"doc\", \"docx\"].includes(ext)) {\n return { icon: <FileWordOutlined />, color: \"#1677ff\" };\n }\n\n // Excel\n if ([\"xls\", \"xlsx\", \"csv\"].includes(ext)) {\n return { icon: <FileExcelOutlined />, color: \"#22b35e\" };\n }\n\n // PPT\n if ([\"ppt\", \"pptx\"].includes(ext)) {\n return { icon: <FilePptOutlined />, color: \"#ff6e31\" };\n }\n\n // Audio\n if ([\"mp3\", \"wav\", \"m4a\", \"aac\", \"ogg\", \"flac\"].includes(ext)) {\n return { icon: <AudioOutlined />, color: \"#722ed1\" };\n }\n\n // Video\n if ([\"mp4\", \"mov\", \"webm\", \"mkv\", \"avi\"].includes(ext)) {\n return { icon: <VideoCameraOutlined />, color: \"#fa8c16\" };\n }\n\n // 图片\n if (isImageFile(file)) {\n return { icon: <FileImageOutlined />, color: \"#8c8c8c\" };\n }\n\n // 默认\n return { icon: <FileOutlined />, color: \"#8c8c8c\" };\n};\n\n/**\n * 格式化文件大小\n */\nconst formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return bytes + \" B\";\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + \" KB\";\n return (bytes / (1024 * 1024)).toFixed(1) + \" MB\";\n};\n\nconst styles = useStyles();\n\n/**\n * FileGallery - 单文件展示组件\n *\n * 功能特性:\n * - 📁 支持多种文件类型展示 (图片、音频、视频、文档等)\n * - 🖼️ 图片支持预览和缩略图\n * - 🎵 音频文件支持内联播放\n * - 🎬 视频文件支持内联播放\n * - 📊 显示文件大小、类型图标\n * - 🗑️ 支持删除操作\n * - 📤 支持上传进度显示\n * - 🎨 支持卡片内部布局控制(align:图标和信息的排列方式)\n *\n * @example\n * // XAdkSender 场景 - 可删除的本地文件\n * {files.map(file => (\n * <FileGallery\n * key={file.id}\n * file={file}\n * removable\n * onRemove={handleRemove}\n * />\n * ))}\n *\n * @example\n * // XadkChatbot 场景 - 只读的远程文件\n * {files.map(file => (\n * <FileGallery key={file.id} file={file} />\n * ))}\n */\nconst FileGallery: React.FC<FileGalleryProps> = ({\n file,\n align = \"left\",\n removable = false,\n onRemove = () => {},\n className,\n style,\n}) => {\n const [objectUrl, setObjectUrl] = useState(\"\");\n\n useEffect(() => {\n if (!file.file) return;\n\n const url = URL.createObjectURL(file.file);\n setObjectUrl(url);\n\n return () => URL.revokeObjectURL(url);\n }, [file.file]);\n\n if (!file) return null;\n\n const isImage = isImageFile(file);\n const isAudio = isAudioFile(file);\n const isVideo = isVideoFile(file);\n const fileName = getFileName(file);\n const fileSize = getFileSize(file);\n const fileId = getFileId(file);\n const url = getFileUrl(file) || objectUrl;\n\n // 图片文件\n if (isImage) {\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n {/* 图片缩略图 */}\n <div className={styles.imageThumbnail}>\n <Image\n src={url}\n alt={fileName}\n fallback=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mN8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==\"\n preview={{\n src: url,\n }}\n />\n\n {/* 上传进度遮罩 */}\n {file.status === \"uploading\" && (\n <div className={styles.imageOverlay}>\n <Progress\n type=\"circle\"\n percent={file.progress}\n size={30}\n strokeColor=\"#1677ff\"\n />\n </div>\n )}\n </div>\n\n {/* 文件信息 */}\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n <div className={styles.fileSize}>{formatFileSize(fileSize)}</div>\n </div>\n\n {/* 删除按钮 */}\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 音频文件\n if (isAudio) {\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n <div className={styles.fileIcon} style={{ color: \"#722ed1\" }}>\n <AudioOutlined />\n </div>\n\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>{fileName}</div>\n </Tooltip>\n\n <audio\n src={url}\n controls\n className={styles.mediaWrapper}\n style={{ width: \"100%\", height: 28 }}\n />\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 视频文件\n if (isVideo) {\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n <div className={styles.fileIcon} style={{ color: \"#fa8c16\" }}>\n <VideoCameraOutlined />\n </div>\n\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>{fileName}</div>\n </Tooltip>\n\n <video\n src={url}\n controls\n className={styles.mediaWrapper}\n style={{ width: \"100%\", height: 40 }}\n />\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 其他文件\n const { icon, color } = getFileIcon(file);\n const isExternalUrl = url && url.startsWith(\"http\");\n\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n <div className={styles.fileIcon} style={{ color }}>\n {icon}\n </div>\n\n <div className={styles.fileInfo}>\n {isExternalUrl ? (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.fileLink}\n >\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n </a>\n ) : (\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n )}\n\n {file.status === \"uploading\" ? (\n <Progress\n percent={file.progress}\n size=\"small\"\n showInfo={false}\n strokeColor=\"#1677ff\"\n className={styles.progress}\n />\n ) : (\n fileSize > 0 && (\n <div className={styles.fileSize}>{formatFileSize(fileSize)}</div>\n )\n )}\n\n {file.status === \"error\" && file.errorMessage && (\n <div\n style={{\n fontSize: \"11px\",\n color: \"#ff4d4f\",\n marginTop: \"2px\",\n }}\n >\n {file.errorMessage}\n </div>\n )}\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n};\n\nexport default FileGallery;\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ export var useStyles = withBasicStyles(function () {
6
6
  return {
7
7
  container: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &.align-right {\n align-items: flex-end;\n }\n "]))),
8
8
  fileList: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n "]))),
9
- fileCard: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n min-width: 260px;\n max-width: 280px;\n min-height: 64px;\n transition: all 0.2s ease;\n\n &:hover {\n background: #f5f5f5;\n border-color: #e0e0e0;\n }\n "]))),
9
+ fileCard: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n min-width: 260px;\n max-width: 280px;\n min-height: 64px;\n transition: all 0.2s ease;\n\n &:hover {\n background: #f5f5f5;\n border-color: #e0e0e0;\n }\n\n /* align=right \u65F6\u56FE\u6807\u5728\u53F3\u4FA7 */\n &.align-right {\n flex-direction: row-reverse;\n }\n "]))),
10
10
  imageThumbnail: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n position: relative;\n width: 44px;\n height: 44px;\n flex-shrink: 0;\n border-radius: 4px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n\n .ant-image {\n width: 100% !important;\n height: 100% !important;\n display: flex !important;\n justify-content: center;\n align-items: center;\n }\n\n img {\n width: 100% !important;\n height: 100% !important;\n object-fit: cover !important;\n display: block !important;\n }\n "]))),
11
11
  imageOverlay: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.05);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n "]))),
12
12
  fileIcon: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n font-size: 24px;\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n "]))),
@@ -1 +1 @@
1
- {"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","fileList","_templateObject2","fileCard","_templateObject3","imageThumbnail","_templateObject4","imageOverlay","_templateObject5","fileIcon","_templateObject6","fileInfo","_templateObject7","fileName","_templateObject8","fileSize","_templateObject9","progress","_templateObject10","fileRemoveBtn","_templateObject11","fileLink","_templateObject12","mediaWrapper","_templateObject13"],"sources":["../../../../src/components/FileGallery/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &.align-right {\n align-items: flex-end;\n }\n `,\n\n fileList: css`\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n `,\n\n fileCard: css`\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n min-width: 260px;\n max-width: 280px;\n min-height: 64px;\n transition: all 0.2s ease;\n\n &:hover {\n background: #f5f5f5;\n border-color: #e0e0e0;\n }\n `,\n\n imageThumbnail: css`\n position: relative;\n width: 44px;\n height: 44px;\n flex-shrink: 0;\n border-radius: 4px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n\n .ant-image {\n width: 100% !important;\n height: 100% !important;\n display: flex !important;\n justify-content: center;\n align-items: center;\n }\n\n img {\n width: 100% !important;\n height: 100% !important;\n object-fit: cover !important;\n display: block !important;\n }\n `,\n\n imageOverlay: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.05);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n `,\n\n fileIcon: css`\n font-size: 24px;\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n\n fileInfo: css`\n flex: 1;\n min-width: 0;\n overflow: hidden;\n `,\n\n fileName: css`\n font-size: 13px;\n font-weight: 500;\n color: #262626;\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n\n fileSize: css`\n font-size: 11px;\n color: #8c8c8c;\n `,\n\n progress: css`\n margin-top: 4px;\n\n .ant-progress-inner {\n height: 4px !important;\n }\n\n .ant-progress-bg {\n height: 4px !important;\n }\n `,\n\n fileRemoveBtn: css`\n position: absolute;\n top: -6px;\n right: -6px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.75);\n color: #fff;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1;\n padding: 0;\n font-size: 10px;\n transition: all 0.2s ease;\n\n &:hover {\n background: rgba(0, 0, 0, 0.9);\n transform: scale(1.1);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n\n fileLink: css`\n display: flex;\n align-items: center;\n gap: 8px;\n color: rgba(0, 0, 0, 0.85);\n text-decoration: none;\n font-size: 13px;\n\n &:hover {\n color: #1677ff;\n }\n `,\n\n mediaWrapper: css`\n margin-top: 6px;\n `,\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,+JASb;IAEDC,QAAQ,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,qEAIZ;IAEDG,QAAQ,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,qYAkBZ;IAEDK,cAAc,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,4iBAwBlB;IAEDO,YAAY,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,mOAWhB;IAEDS,QAAQ,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,wKAQZ;IAEDW,QAAQ,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,oEAIZ;IAEDa,QAAQ,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,sLAQZ;IAEDe,QAAQ,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,uDAGZ;IAEDiB,QAAQ,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,qKAUZ;IAEDmB,aAAa,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,mjBA4BjB;IAEDqB,QAAQ,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,2MAWZ;IAEDuB,YAAY,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA;EAGnB,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
1
+ {"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","fileList","_templateObject2","fileCard","_templateObject3","imageThumbnail","_templateObject4","imageOverlay","_templateObject5","fileIcon","_templateObject6","fileInfo","_templateObject7","fileName","_templateObject8","fileSize","_templateObject9","progress","_templateObject10","fileRemoveBtn","_templateObject11","fileLink","_templateObject12","mediaWrapper","_templateObject13"],"sources":["../../../../src/components/FileGallery/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &.align-right {\n align-items: flex-end;\n }\n `,\n\n fileList: css`\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n `,\n\n fileCard: css`\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n min-width: 260px;\n max-width: 280px;\n min-height: 64px;\n transition: all 0.2s ease;\n\n &:hover {\n background: #f5f5f5;\n border-color: #e0e0e0;\n }\n\n /* align=right 时图标在右侧 */\n &.align-right {\n flex-direction: row-reverse;\n }\n `,\n\n imageThumbnail: css`\n position: relative;\n width: 44px;\n height: 44px;\n flex-shrink: 0;\n border-radius: 4px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n\n .ant-image {\n width: 100% !important;\n height: 100% !important;\n display: flex !important;\n justify-content: center;\n align-items: center;\n }\n\n img {\n width: 100% !important;\n height: 100% !important;\n object-fit: cover !important;\n display: block !important;\n }\n `,\n\n imageOverlay: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.05);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n `,\n\n fileIcon: css`\n font-size: 24px;\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n\n fileInfo: css`\n flex: 1;\n min-width: 0;\n overflow: hidden;\n `,\n\n fileName: css`\n font-size: 13px;\n font-weight: 500;\n color: #262626;\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n\n fileSize: css`\n font-size: 11px;\n color: #8c8c8c;\n `,\n\n progress: css`\n margin-top: 4px;\n\n .ant-progress-inner {\n height: 4px !important;\n }\n\n .ant-progress-bg {\n height: 4px !important;\n }\n `,\n\n fileRemoveBtn: css`\n position: absolute;\n top: -6px;\n right: -6px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.75);\n color: #fff;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1;\n padding: 0;\n font-size: 10px;\n transition: all 0.2s ease;\n\n &:hover {\n background: rgba(0, 0, 0, 0.9);\n transform: scale(1.1);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n\n fileLink: css`\n display: flex;\n align-items: center;\n gap: 8px;\n color: rgba(0, 0, 0, 0.85);\n text-decoration: none;\n font-size: 13px;\n\n &:hover {\n color: #1677ff;\n }\n `,\n\n mediaWrapper: css`\n margin-top: 6px;\n `,\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,+JASb;IAEDC,QAAQ,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,qEAIZ;IAEDG,QAAQ,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,mgBAuBZ;IAEDK,cAAc,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,4iBAwBlB;IAEDO,YAAY,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,mOAWhB;IAEDS,QAAQ,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,wKAQZ;IAEDW,QAAQ,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,oEAIZ;IAEDa,QAAQ,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,sLAQZ;IAEDe,QAAQ,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,uDAGZ;IAEDiB,QAAQ,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,qKAUZ;IAEDmB,aAAa,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,mjBA4BjB;IAEDqB,QAAQ,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,2MAWZ;IAEDuB,YAAY,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA;EAGnB,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
@@ -1,7 +1,7 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
3
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
4
- import React, { useState } from "react";
4
+ import React, { useEffect, useState } from "react";
5
5
  import { Button, Space } from "antd";
6
6
  import XAdkChatbot from "./index";
7
7
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -64,13 +64,20 @@ export var 基础用法 = {
64
64
  _useState4 = _slicedToArray(_useState3, 2),
65
65
  loading = _useState4[0],
66
66
  setLoading = _useState4[1];
67
- var handleSubmit = function handleSubmit(_ref) {
68
- var text = _ref.text;
69
- if (!(text !== null && text !== void 0 && text.trim())) return;
67
+ useEffect(function () {
70
68
  var userMsg = {
71
69
  id: Date.now().toString(),
72
70
  role: "user",
73
- text: text
71
+ text: "你好",
72
+ fileData: [{
73
+ displayName: "06f26c566fe4a3b5eaad678d0d270c97_origin.jpg",
74
+ fileUri: "https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285",
75
+ mimeType: "image/jpeg"
76
+ }, {
77
+ displayName: "06f26c566fe4a3b5eaad678d0d270c98_origin.jpg",
78
+ fileUri: "https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285",
79
+ mimeType: "image/jpeg"
80
+ }]
74
81
  };
75
82
  setMessages(function (prev) {
76
83
  return [].concat(_toConsumableArray(prev), [userMsg]);
@@ -80,7 +87,7 @@ export var 基础用法 = {
80
87
  var botMsg = {
81
88
  id: (Date.now() + 1).toString(),
82
89
  role: "bot",
83
- text: "\u8FD9\u662F\u5BF9 \"".concat(text, "\" \u7684\u6A21\u62DF\u56DE\u590D\u3002"),
90
+ text: "\u8FD9\u662F\u5BF9 \"\u7528\u6237\" \u7684\u6A21\u62DF\u56DE\u590D\u3002",
84
91
  invocationId: "inv-".concat(Date.now())
85
92
  };
86
93
  setMessages(function (prev) {
@@ -88,11 +95,12 @@ export var 基础用法 = {
88
95
  });
89
96
  setLoading(false);
90
97
  }, 1000);
91
- };
98
+ }, []);
92
99
  return /*#__PURE__*/_jsx("div", {
93
100
  style: {
94
101
  width: 700,
95
102
  height: "600px",
103
+ padding: "20px",
96
104
  border: "1px solid #f0f0f0",
97
105
  borderRadius: "8px",
98
106
  overflow: "hidden"
@@ -101,12 +109,8 @@ export var 基础用法 = {
101
109
  messages: messages,
102
110
  loading: loading,
103
111
  initialized: true,
104
- onSubmit: handleSubmit,
105
- onStop: function onStop() {
106
- return setLoading(false);
107
- },
108
- onClear: function onClear() {
109
- return setMessages([]);
112
+ style: {
113
+ width: "670px"
110
114
  }
111
115
  })
112
116
  });
@@ -1 +1 @@
1
- {"version":3,"names":["React","useState","Button","Space","XAdkChatbot","jsx","_jsx","jsxs","_jsxs","meta","title","component","parameters","layout","docs","description","tags","argTypes","loading","control","showFnCallDetail","mockMessages","id","role","text","invocationId","基础用法","render","_useState","_useState2","_slicedToArray","messages","setMessages","_useState3","_useState4","setLoading","handleSubmit","_ref","trim","userMsg","Date","now","toString","prev","concat","_toConsumableArray","setTimeout","botMsg","style","width","height","border","borderRadius","overflow","children","initialized","onSubmit","onStop","onClear","开场白和建议","_useState5","_useState6","_useState7","_useState8","suggestions","setSuggestions","prologue","handleSuggest","onSuggest","流式输出","_useState9","_useState10","_useState11","_useState12","handleStart","fullText","currentText","index","interval","setInterval","length","newMessages","_objectSpread","clearInterval","marginBottom","type","onClick","disabled","自定义Footer","_useState13","_useState14","_useState15","Set","_useState16","likedMessages","setLikedMessages","handleLike","messageId","newSet","has","delete","add","customFooter","data","message","isLastBotMsg","isLiked","padding","size","actions","函数调用","messagesWithFunctionCall","functionCall","name","args","city","date","思维链","messagesWithThought","thought","代码高亮","messagesWithCode","多轮对话","multiRoundMessages"],"sources":["../../../../src/components/XAdkChatbot/XAdkChatbot.stories.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\nimport { Button, Space } from \"antd\";\nimport XAdkChatbot from \"./index\";\nimport type { IMessage } from \"@/types\";\n\nconst meta: Meta<typeof XAdkChatbot> = {\n title: \"AI组件/XAdkChatbot 聊天消息组件\",\n component: XAdkChatbot,\n parameters: {\n layout: \"padded\",\n docs: {\n description: {\n component: `\n\n独立的聊天消息显示组件,用于渲染消息列表和建议问题。\n\n## 核心功能\n\n- 📝 **消息渲染**: 支持文本、Markdown、代码块、函数调用等\n- 💭 **思维链**: 支持显示 AI 推理过程\n- 🎯 **建议问题**: 显示和点击建议问题\n- 📌 **开场白**: 支持显示欢迎消息\n- 🔄 **加载状态**: 实时显示 AI 生成状态\n- 🎨 **自定义渲染**: 支持自定义消息底部内容\n\n## Props\n\n| 属性 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| messages | IMessage[] | [] | 消息列表 |\n| loading | boolean | false | 是否正在加载 |\n| prologue | string | - | 开场白 |\n| suggestions | string[] | [] | 建议问题 |\n| showFnCallDetail | boolean | false | 显示函数调用详情 |\n| footer | (msg) => ReactNode | - | 自定义消息底部 |\n| onSubmit | (content) => void | - | 发送消息回调 |\n| onStop | () => void | - | 停止生成回调 |\n| onClear | () => void | - | 清空消息回调 |\n| onSuggest | (text) => void | - | 点击建议回调 |\n| onConfirm | (fnCall, confirmed) => void | - | 确认函数调用 |\n `,\n },\n },\n },\n tags: [\"autodocs\"],\n argTypes: {\n loading: {\n description: \"是否正在加载(AI 生成中)\",\n control: \"boolean\",\n },\n showFnCallDetail: {\n description: \"是否显示函数调用详情\",\n control: \"boolean\",\n },\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// Mock 消息数据\nconst mockMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"你好\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"你好!我是 AI 助手,很高兴为你服务。有什么我可以帮助你的吗?\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"介绍一下 React Hooks\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: `React Hooks 是 React 16.8 引入的新特性,它让你在不编写 class 的情况下使用 state 和其他 React 特性。\n\n## 常用的 Hooks\n\n### 1. useState\n用于在函数组件中添加状态:\n\n\\`\\`\\`jsx\nconst [count, setCount] = useState(0);\n\\`\\`\\`\n\n### 2. useEffect\n用于处理副作用:\n\n\\`\\`\\`jsx\nuseEffect(() => {\n document.title = \\`Count: \\${count}\\`;\n}, [count]);\n\\`\\`\\`\n\n### 3. useContext\n用于访问 Context:\n\n\\`\\`\\`jsx\nconst theme = useContext(ThemeContext);\n\\`\\`\\`\n\n## 优势\n\n- ✅ 代码更简洁\n- ✅ 逻辑复用更容易\n- ✅ 避免 this 相关问题\n- ✅ 更好的代码组织`,\n invocationId: \"inv-2\",\n },\n];\n\n// ============================================\n// 示例 1: 基础用法\n// ============================================\nexport const 基础用法: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>(mockMessages);\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = ({ text }: any) => {\n if (!text?.trim()) return;\n\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text,\n };\n setMessages((prev) => [...prev, userMsg]);\n\n setLoading(true);\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"${text}\" 的模拟回复。`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n setLoading(false);\n }, 1000);\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n onSubmit={handleSubmit}\n onStop={() => setLoading(false)}\n onClear={() => setMessages([])}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 2: 开场白和建议问题\n// ============================================\nexport const 开场白和建议: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([]);\n const [suggestions, setSuggestions] = useState([\n \"什么是 React Hooks?\",\n \"如何使用 useState?\",\n \"useEffect 的作用是什么?\",\n ]);\n\n const prologue = \"你好!我是 AI 助手,专注于 React 开发相关的问题。\";\n\n const handleSuggest = (text: string) => {\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text,\n };\n setMessages([userMsg]);\n setSuggestions([]);\n\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"${text}\" 的回答...`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n }, 1000);\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n prologue={prologue}\n suggestions={suggestions}\n onSuggest={handleSuggest}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 3: 流式输出\n// ============================================\nexport const 流式输出: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([\n {\n id: \"1\",\n role: \"user\",\n text: \"给我讲一个故事\",\n },\n ]);\n const [loading, setLoading] = useState(false);\n\n const handleStart = () => {\n setLoading(true);\n\n const fullText =\n \"从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事。讲什么呢?从前有座山,山里有座庙...\";\n let currentText = \"\";\n let index = 0;\n\n const botMsg: IMessage = {\n id: \"2\",\n role: \"bot\",\n text: \"\",\n invocationId: \"inv-1\",\n };\n\n setMessages((prev) => [...prev, botMsg]);\n\n const interval = setInterval(() => {\n if (index < fullText.length) {\n currentText += fullText[index];\n setMessages((prev) => {\n const newMessages = [...prev];\n newMessages[newMessages.length - 1] = {\n ...botMsg,\n text: currentText,\n };\n return newMessages;\n });\n index++;\n } else {\n clearInterval(interval);\n setLoading(false);\n }\n }, 50);\n };\n\n return (\n <div style={{ width: 700 }}>\n <div style={{ marginBottom: \"16px\" }}>\n <Button type=\"primary\" onClick={handleStart} disabled={loading}>\n 开始流式输出演示\n </Button>\n </div>\n <div\n style={{\n height: \"550px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n onStop={() => setLoading(false)}\n />\n </div>\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 4: 自定义消息 Footer\n// ============================================\nexport const 自定义Footer: Story = {\n render: () => {\n const [messages] = useState<IMessage[]>(mockMessages);\n const [likedMessages, setLikedMessages] = useState<Set<string>>(new Set());\n\n const handleLike = (messageId: string) => {\n setLikedMessages((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(messageId)) {\n newSet.delete(messageId);\n } else {\n newSet.add(messageId);\n }\n return newSet;\n });\n };\n\n const customFooter = (data: any) => {\n const { message, isLastBotMsg } = data;\n\n if (!isLastBotMsg) return null;\n\n const isLiked = likedMessages.has(message.id);\n\n return (\n <div style={{ padding: \"8px 0\" }}>\n <Space size=\"small\">\n <Button\n size=\"small\"\n type={isLiked ? \"primary\" : \"text\"}\n onClick={() => handleLike(message.id)}\n >\n {isLiked ? \"👍 已赞\" : \"👍 赞\"}\n </Button>\n <Button size=\"small\" type=\"text\">\n 👎 踩\n </Button>\n <Button size=\"small\" type=\"text\">\n 📋 复制\n </Button>\n <Button size=\"small\" type=\"text\">\n 🔄 重新生成\n </Button>\n </Space>\n </div>\n );\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n actions={customFooter}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 5: 函数调用\n// ============================================\nexport const 函数调用: Story = {\n render: () => {\n const messagesWithFunctionCall: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"今天北京的天气怎么样?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n functionCall: {\n id: \"call-1\",\n name: \"get_weather\",\n args: {\n city: \"北京\",\n date: \"2024-03-05\",\n },\n },\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"根据天气查询,今天北京的天气是晴天,温度 15-25°C,空气质量良好,适合户外活动。\",\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithFunctionCall}\n loading={false}\n initialized={true}\n showFnCallDetail={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 6: 思维链\n// ============================================\nexport const 思维链: Story = {\n render: () => {\n const messagesWithThought: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"帮我分析一下这个问题\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"让我分析一下这个问题...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"首先,我需要理解问题的核心...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"根据分析,我的结论是...(这是最终回答)\",\n thought: false,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithThought}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 7: 代码高亮\n// ============================================\nexport const 代码高亮: Story = {\n render: () => {\n const messagesWithCode: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"写一个 React 组件\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: `这是一个简单的 React 计数器组件:\n\n\\`\\`\\`jsx\nimport React, { useState } from 'react';\n\nfunction Counter() {\n const [count, setCount] = useState(0);\n\n return (\n <div>\n <h1>Count: {count}</h1>\n <button onClick={() => setCount(count + 1)}>\n +1\n </button>\n <button onClick={() => setCount(count - 1)}>\n -1\n </button>\n </div>\n );\n}\n\nexport default Counter;\n\\`\\`\\`\n\n这个组件使用了 \\`useState\\` Hook 来管理计数器状态。`,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithCode}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 8: 多轮对话\n// ============================================\nexport const 多轮对话: Story = {\n render: () => {\n const multiRoundMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"React 是什么?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"React 是一个用于构建用户界面的 JavaScript 库。\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"它有什么特点?\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"React 的主要特点包括:\\n1. 组件化\\n2. 虚拟 DOM\\n3. 单向数据流\\n4. JSX 语法\",\n invocationId: \"inv-2\",\n },\n {\n id: \"5\",\n role: \"user\",\n text: \"什么是虚拟 DOM?\",\n },\n {\n id: \"6\",\n role: \"bot\",\n text: \"虚拟 DOM 是真实 DOM 的 JavaScript 对象表示,React 通过对比虚拟 DOM 的变化来高效更新真实 DOM。\",\n invocationId: \"inv-3\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={multiRoundMessages}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useEffect","useState","Button","Space","XAdkChatbot","jsx","_jsx","jsxs","_jsxs","meta","title","component","parameters","layout","docs","description","tags","argTypes","loading","control","showFnCallDetail","mockMessages","id","role","text","invocationId","基础用法","render","_useState","_useState2","_slicedToArray","messages","setMessages","_useState3","_useState4","setLoading","userMsg","Date","now","toString","fileData","displayName","fileUri","mimeType","prev","concat","_toConsumableArray","setTimeout","botMsg","style","width","height","padding","border","borderRadius","overflow","children","initialized","开场白和建议","_useState5","_useState6","_useState7","_useState8","suggestions","setSuggestions","prologue","handleSuggest","onSuggest","流式输出","_useState9","_useState10","_useState11","_useState12","handleStart","fullText","currentText","index","interval","setInterval","length","newMessages","_objectSpread","clearInterval","marginBottom","type","onClick","disabled","onStop","自定义Footer","_useState13","_useState14","_useState15","Set","_useState16","likedMessages","setLikedMessages","handleLike","messageId","newSet","has","delete","add","customFooter","data","message","isLastBotMsg","isLiked","size","actions","函数调用","messagesWithFunctionCall","functionCall","name","args","city","date","思维链","messagesWithThought","thought","代码高亮","messagesWithCode","多轮对话","multiRoundMessages"],"sources":["../../../../src/components/XAdkChatbot/XAdkChatbot.stories.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\nimport { Button, Space } from \"antd\";\nimport XAdkChatbot from \"./index\";\nimport type { IMessage } from \"@/types\";\n\nconst meta: Meta<typeof XAdkChatbot> = {\n title: \"AI组件/XAdkChatbot 聊天消息组件\",\n component: XAdkChatbot,\n parameters: {\n layout: \"padded\",\n docs: {\n description: {\n component: `\n\n独立的聊天消息显示组件,用于渲染消息列表和建议问题。\n\n## 核心功能\n\n- 📝 **消息渲染**: 支持文本、Markdown、代码块、函数调用等\n- 💭 **思维链**: 支持显示 AI 推理过程\n- 🎯 **建议问题**: 显示和点击建议问题\n- 📌 **开场白**: 支持显示欢迎消息\n- 🔄 **加载状态**: 实时显示 AI 生成状态\n- 🎨 **自定义渲染**: 支持自定义消息底部内容\n\n## Props\n\n| 属性 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| messages | IMessage[] | [] | 消息列表 |\n| loading | boolean | false | 是否正在加载 |\n| prologue | string | - | 开场白 |\n| suggestions | string[] | [] | 建议问题 |\n| showFnCallDetail | boolean | false | 显示函数调用详情 |\n| footer | (msg) => ReactNode | - | 自定义消息底部 |\n| onSubmit | (content) => void | - | 发送消息回调 |\n| onStop | () => void | - | 停止生成回调 |\n| onClear | () => void | - | 清空消息回调 |\n| onSuggest | (text) => void | - | 点击建议回调 |\n| onConfirm | (fnCall, confirmed) => void | - | 确认函数调用 |\n `,\n },\n },\n },\n tags: [\"autodocs\"],\n argTypes: {\n loading: {\n description: \"是否正在加载(AI 生成中)\",\n control: \"boolean\",\n },\n showFnCallDetail: {\n description: \"是否显示函数调用详情\",\n control: \"boolean\",\n },\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// Mock 消息数据\nconst mockMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"你好\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"你好!我是 AI 助手,很高兴为你服务。有什么我可以帮助你的吗?\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"介绍一下 React Hooks\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: `React Hooks 是 React 16.8 引入的新特性,它让你在不编写 class 的情况下使用 state 和其他 React 特性。\n\n## 常用的 Hooks\n\n### 1. useState\n用于在函数组件中添加状态:\n\n\\`\\`\\`jsx\nconst [count, setCount] = useState(0);\n\\`\\`\\`\n\n### 2. useEffect\n用于处理副作用:\n\n\\`\\`\\`jsx\nuseEffect(() => {\n document.title = \\`Count: \\${count}\\`;\n}, [count]);\n\\`\\`\\`\n\n### 3. useContext\n用于访问 Context:\n\n\\`\\`\\`jsx\nconst theme = useContext(ThemeContext);\n\\`\\`\\`\n\n## 优势\n\n- ✅ 代码更简洁\n- ✅ 逻辑复用更容易\n- ✅ 避免 this 相关问题\n- ✅ 更好的代码组织`,\n invocationId: \"inv-2\",\n },\n];\n\n// ============================================\n// 示例 1: 基础用法\n// ============================================\nexport const 基础用法: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>(mockMessages);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text: \"你好\",\n fileData: [\n {\n displayName: \"06f26c566fe4a3b5eaad678d0d270c97_origin.jpg\",\n fileUri:\n \"https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285\",\n mimeType: \"image/jpeg\",\n },\n {\n displayName: \"06f26c566fe4a3b5eaad678d0d270c98_origin.jpg\",\n fileUri:\n \"https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285\",\n mimeType: \"image/jpeg\",\n },\n ],\n };\n setMessages((prev) => [...prev, userMsg]);\n\n setLoading(true);\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"用户\" 的模拟回复。`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n setLoading(false);\n }, 1000);\n }, []);\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n padding: \"20px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n style={{ width: \"670px\" }}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 2: 开场白和建议问题\n// ============================================\nexport const 开场白和建议: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([]);\n const [suggestions, setSuggestions] = useState([\n \"什么是 React Hooks?\",\n \"如何使用 useState?\",\n \"useEffect 的作用是什么?\",\n ]);\n\n const prologue = \"你好!我是 AI 助手,专注于 React 开发相关的问题。\";\n\n const handleSuggest = (text: string) => {\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text,\n };\n setMessages([userMsg]);\n setSuggestions([]);\n\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"${text}\" 的回答...`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n }, 1000);\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n prologue={prologue}\n suggestions={suggestions}\n onSuggest={handleSuggest}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 3: 流式输出\n// ============================================\nexport const 流式输出: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([\n {\n id: \"1\",\n role: \"user\",\n text: \"给我讲一个故事\",\n },\n ]);\n const [loading, setLoading] = useState(false);\n\n const handleStart = () => {\n setLoading(true);\n\n const fullText =\n \"从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事。讲什么呢?从前有座山,山里有座庙...\";\n let currentText = \"\";\n let index = 0;\n\n const botMsg: IMessage = {\n id: \"2\",\n role: \"bot\",\n text: \"\",\n invocationId: \"inv-1\",\n };\n\n setMessages((prev) => [...prev, botMsg]);\n\n const interval = setInterval(() => {\n if (index < fullText.length) {\n currentText += fullText[index];\n setMessages((prev) => {\n const newMessages = [...prev];\n newMessages[newMessages.length - 1] = {\n ...botMsg,\n text: currentText,\n };\n return newMessages;\n });\n index++;\n } else {\n clearInterval(interval);\n setLoading(false);\n }\n }, 50);\n };\n\n return (\n <div style={{ width: 700 }}>\n <div style={{ marginBottom: \"16px\" }}>\n <Button type=\"primary\" onClick={handleStart} disabled={loading}>\n 开始流式输出演示\n </Button>\n </div>\n <div\n style={{\n height: \"550px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n onStop={() => setLoading(false)}\n />\n </div>\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 4: 自定义消息 Footer\n// ============================================\nexport const 自定义Footer: Story = {\n render: () => {\n const [messages] = useState<IMessage[]>(mockMessages);\n const [likedMessages, setLikedMessages] = useState<Set<string>>(new Set());\n\n const handleLike = (messageId: string) => {\n setLikedMessages((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(messageId)) {\n newSet.delete(messageId);\n } else {\n newSet.add(messageId);\n }\n return newSet;\n });\n };\n\n const customFooter = (data: any) => {\n const { message, isLastBotMsg } = data;\n\n if (!isLastBotMsg) return null;\n\n const isLiked = likedMessages.has(message.id);\n\n return (\n <div style={{ padding: \"8px 0\" }}>\n <Space size=\"small\">\n <Button\n size=\"small\"\n type={isLiked ? \"primary\" : \"text\"}\n onClick={() => handleLike(message.id)}\n >\n {isLiked ? \"👍 已赞\" : \"👍 赞\"}\n </Button>\n <Button size=\"small\" type=\"text\">\n 👎 踩\n </Button>\n <Button size=\"small\" type=\"text\">\n 📋 复制\n </Button>\n <Button size=\"small\" type=\"text\">\n 🔄 重新生成\n </Button>\n </Space>\n </div>\n );\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n actions={customFooter}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 5: 函数调用\n// ============================================\nexport const 函数调用: Story = {\n render: () => {\n const messagesWithFunctionCall: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"今天北京的天气怎么样?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n functionCall: {\n id: \"call-1\",\n name: \"get_weather\",\n args: {\n city: \"北京\",\n date: \"2024-03-05\",\n },\n },\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"根据天气查询,今天北京的天气是晴天,温度 15-25°C,空气质量良好,适合户外活动。\",\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithFunctionCall}\n loading={false}\n initialized={true}\n showFnCallDetail={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 6: 思维链\n// ============================================\nexport const 思维链: Story = {\n render: () => {\n const messagesWithThought: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"帮我分析一下这个问题\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"让我分析一下这个问题...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"首先,我需要理解问题的核心...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"根据分析,我的结论是...(这是最终回答)\",\n thought: false,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithThought}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 7: 代码高亮\n// ============================================\nexport const 代码高亮: Story = {\n render: () => {\n const messagesWithCode: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"写一个 React 组件\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: `这是一个简单的 React 计数器组件:\n\n\\`\\`\\`jsx\nimport React, { useState } from 'react';\n\nfunction Counter() {\n const [count, setCount] = useState(0);\n\n return (\n <div>\n <h1>Count: {count}</h1>\n <button onClick={() => setCount(count + 1)}>\n +1\n </button>\n <button onClick={() => setCount(count - 1)}>\n -1\n </button>\n </div>\n );\n}\n\nexport default Counter;\n\\`\\`\\`\n\n这个组件使用了 \\`useState\\` Hook 来管理计数器状态。`,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithCode}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 8: 多轮对话\n// ============================================\nexport const 多轮对话: Story = {\n render: () => {\n const multiRoundMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"React 是什么?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"React 是一个用于构建用户界面的 JavaScript 库。\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"它有什么特点?\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"React 的主要特点包括:\\n1. 组件化\\n2. 虚拟 DOM\\n3. 单向数据流\\n4. JSX 语法\",\n invocationId: \"inv-2\",\n },\n {\n id: \"5\",\n role: \"user\",\n text: \"什么是虚拟 DOM?\",\n },\n {\n id: \"6\",\n role: \"bot\",\n text: \"虚拟 DOM 是真实 DOM 的 JavaScript 对象表示,React 通过对比虚拟 DOM 的变化来高效更新真实 DOM。\",\n invocationId: \"inv-3\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={multiRoundMessages}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n"],"mappings":"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"}
@@ -13,6 +13,7 @@ import XAiThoughtChain from "../XAiThoughtChain";
13
13
  import { parseAgentMessage } from "../../utils";
14
14
  import { jsx as _jsx } from "react/jsx-runtime";
15
15
  import { jsxs as _jsxs } from "react/jsx-runtime";
16
+ import { Fragment as _Fragment } from "react/jsx-runtime";
16
17
  var scrollThreshold = 10;
17
18
 
18
19
  /**
@@ -319,9 +320,17 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
319
320
  children: /*#__PURE__*/_jsxs("span", {
320
321
  children: ["\u751F\u6210\u6587\u4EF6 (", allFiles.length, ")"]
321
322
  })
322
- }), /*#__PURE__*/_jsx(FileGallery, {
323
- files: allFiles,
324
- align: "left"
323
+ }), /*#__PURE__*/_jsx("div", {
324
+ style: {
325
+ display: "flex",
326
+ flexWrap: "wrap",
327
+ gap: "8px"
328
+ },
329
+ children: allFiles.map(function (file, index) {
330
+ return /*#__PURE__*/_jsx(FileGallery, {
331
+ file: file
332
+ }, index);
333
+ })
325
334
  })]
326
335
  }), !isGroupLoading && (actions ? actions({
327
336
  message: group,
@@ -364,9 +373,17 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
364
373
  className: styles.userMsg,
365
374
  children: group.msgs.map(function (m, i) {
366
375
  return /*#__PURE__*/_jsxs("div", {
367
- children: [m.fileData && m.fileData.length > 0 && /*#__PURE__*/_jsx(FileGallery, {
368
- files: m.fileData,
369
- align: "right"
376
+ className: styles.userContainer,
377
+ children: [m.fileData && m.fileData.length > 0 && /*#__PURE__*/_jsx(_Fragment, {
378
+ children: m.fileData.map(function (file, index) {
379
+ return /*#__PURE__*/_jsx(FileGallery, {
380
+ file: file,
381
+ align: "left",
382
+ style: {
383
+ marginBottom: "16px"
384
+ }
385
+ }, index);
386
+ })
370
387
  }), m.text && /*#__PURE__*/_jsx("div", {
371
388
  className: styles.card,
372
389
  children: m.text