///
/**
* 统一的文件数据接口
* 兼容 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;
}