/// /** * 统一的文件数据接口 * 兼容 LocalFile (XAdkSender) 和 FileData (XadkChatbot) */ export interface FileItem { id?: string; uid?: string; name?: string; displayName?: string; size?: number; type?: string; mimeType?: string; file?: File; status?: "pending" | "uploading" | "success" | "error"; progress?: number; errorMessage?: string; fileUri?: string; tempUrl?: string; response?: any; } /** 文件图标类型 */ export type FileIconType = "pdf" | "word" | "excel" | "ppt" | "audio" | "video" | "zip" | "markdown" | "image" | "default"; /** 图片展示模式 */ export type ImageDisplayMode = "thumbnail" | "preview" | "full"; /** 音视频展示模式 */ export type MediaDisplayMode = "inline" | "card"; /** 文件卡片类型:不传则自动推断(图片/音频/视频用原生渲染),传 'file' 强制附件卡片展示 */ export type FileCardType = "file" | "image" | "audio" | "video"; /** 文件卡片尺寸:default 适合消息区,small 适合输入框上下文区 */ export type FileGallerySize = "default" | "small"; export interface FileGalleryProps { file: FileItem; align?: "left" | "right"; size?: FileGallerySize; removable?: boolean; onRemove?: (id: string) => void; className?: string; style?: React.CSSProperties; /** 点击文件卡片回调(非图片、非音视频文件) */ onClick?: (file: FileItem) => void; /** * 文件卡片类型 * - 不传:自动根据文件扩展名/MIME推断,图片/音频/视频使用原生渲染 * - 'file':强制以附件卡片展示(音视频不可播放) * - 'image' / 'audio' / 'video':强制指定类型 */ type?: FileCardType; /** 图片展示模式: thumbnail(缩略图) | preview(中等预览) | full(全宽) */ imageDisplayMode?: ImageDisplayMode; /** 图片自定义宽度 */ imageWidth?: number | string; /** 图片自定义高度 */ imageHeight?: number | string; /** 图片加载策略 */ imageLoading?: "lazy" | "eager"; /** 图片 alt 文本 */ imageAlt?: string; /** 自动播放(仅音频) */ mediaAutoPlay?: boolean; /** 循环播放 */ mediaLoop?: boolean; /** 静音 */ mediaMuted?: boolean; /** 视频封面图 URL */ mediaPoster?: string; /** 透传给原生 video 标签的属性 */ videoProps?: Partial; /** 透传给原生 audio 标签的属性 */ audioProps?: Partial; /** 按文件类型自定义图标映射 */ iconMap?: Partial>; /** 完全自定义图标(优先级最高,覆盖所有类型) */ customIcon?: React.ReactNode; } export interface FileItemComponentProps { file: FileItem; removable: boolean; onRemove: (id: string) => void; }