205 lines
5.4 KiB
TypeScript
205 lines
5.4 KiB
TypeScript
import { FileStatus } from "@/components/file-upload/file-uploader";
|
||
import { MediaType } from "expo-image-picker";
|
||
import { ReactNode } from "react";
|
||
import { StyleProp, ViewStyle } from "react-native";
|
||
|
||
export interface MaterialFile {
|
||
id: string;
|
||
file_name: string;
|
||
url: string;
|
||
}
|
||
|
||
export interface OutputVideoFile {
|
||
id: string;
|
||
file_name: string;
|
||
url: string;
|
||
}
|
||
|
||
export interface ManualTask {
|
||
task_id: string;
|
||
user_id: string;
|
||
status: 'Created' | 'Processing' | 'Completed' | 'Failed';
|
||
created_at: string;
|
||
started_at: string;
|
||
completed_at: string;
|
||
failure_reason: string | null;
|
||
template_id: number;
|
||
source_files: MaterialFile[];
|
||
output_video_file?: OutputVideoFile;
|
||
}
|
||
|
||
export interface Size {
|
||
value: number;
|
||
unit: 'B' | 'KB' | 'MB' | 'GB' | 'TB';
|
||
}
|
||
|
||
export interface ContentType {
|
||
value: string;
|
||
}
|
||
|
||
export interface FilePath {
|
||
value: string;
|
||
}
|
||
|
||
export interface Metadata {
|
||
[key: string]: any;
|
||
}
|
||
|
||
export type UploadStatus = 'Pending' | 'Uploading' | 'Completed' | 'Failed';
|
||
export type DeletionStatus = 'Active' | 'PendingDeletion' | 'Deleted';
|
||
|
||
export interface ConfirmUpload {
|
||
file_id: string;
|
||
upload_url: string
|
||
name: string;
|
||
size: Size;
|
||
content_type: ContentType;
|
||
upload_time: string; // ISO date string
|
||
storage_medium: string;
|
||
file_path: FilePath;
|
||
uploader_id: number;
|
||
upload_status: UploadStatus;
|
||
deletion_status: DeletionStatus;
|
||
metadata: Metadata;
|
||
}
|
||
|
||
// 定义 EXIF 数据类型
|
||
export type ExifData = {
|
||
GPSLatitude?: number | undefined;
|
||
GPSLongitude?: number | undefined;
|
||
GPSAltitude?: number | undefined;
|
||
DateTimeOriginal?: string | undefined;
|
||
Make?: string | undefined;
|
||
Model?: string | undefined;
|
||
ExposureTime?: number | undefined;
|
||
FNumber?: number | undefined;
|
||
ISOSpeedRatings?: number | undefined;
|
||
FocalLength?: number | undefined;
|
||
[key: string]: any;
|
||
};
|
||
|
||
// 默认的 EXIF 数据结构
|
||
export const defaultExifData: ExifData = {
|
||
GPSLatitude: undefined,
|
||
GPSLongitude: undefined,
|
||
GPSAltitude: undefined,
|
||
DateTimeOriginal: undefined,
|
||
Make: undefined,
|
||
Model: undefined,
|
||
ExposureTime: undefined,
|
||
FNumber: undefined,
|
||
ISOSpeedRatings: undefined,
|
||
FocalLength: undefined,
|
||
};
|
||
|
||
// 压缩图片可配置参数
|
||
export interface ImagesuploaderProps {
|
||
children?: ReactNode;
|
||
style?: StyleProp<ViewStyle>;
|
||
onPickImage?: (file: File, exifData: ExifData) => void;
|
||
/** 压缩质量,0-1 之间的数字,默认为 0.8 */
|
||
compressQuality?: number;
|
||
/** 最大宽度,图片会被等比例缩放 */
|
||
maxWidth?: number;
|
||
/** 最大高度,图片会被等比例缩放 */
|
||
maxHeight?: number;
|
||
/** 是否保留 EXIF 数据,默认为 true */
|
||
preserveExif?: boolean;
|
||
/** 是否上传原图,默认为 false */
|
||
uploadOriginal?: boolean;
|
||
/** 上传完成回调 */
|
||
onUploadComplete?: UploadCompleteCallback;
|
||
/** 进度 */
|
||
onProgress?: (progress: FileStatus) => void;
|
||
/** 多选单选 默认单选*/
|
||
multipleChoice?: boolean;
|
||
/** 文件类型 默认图片*/
|
||
fileType?: MediaType[];
|
||
/** 是否展示预览 默认展示*/
|
||
showPreview?: boolean;
|
||
}
|
||
|
||
// 定义上传结果类型
|
||
export interface UploadResult {
|
||
originalUrl?: string;
|
||
compressedUrl: string;
|
||
file: File;
|
||
exifData: ExifData;
|
||
originalFile: ConfirmUpload;
|
||
compressedFile: ConfirmUpload;
|
||
thumbnail: string;
|
||
thumbnailFile: File;
|
||
}
|
||
|
||
// 定义上传完成回调类型
|
||
export type UploadCompleteCallback = (result: FileUploadItem[]) => void;
|
||
|
||
// 单张图片上传完成回调类型
|
||
export type UploadSingleCompleteCallback = (result: FileUploadItem) => void;
|
||
|
||
// 定义上传 URL 响应类型
|
||
export interface UploadUrlResponse {
|
||
expires_in: number;
|
||
file_id: string;
|
||
file_path: string;
|
||
upload_url: string;
|
||
}
|
||
interface FileSize {
|
||
value: number;
|
||
unit: string;
|
||
}
|
||
|
||
interface FileMetadata {
|
||
originalName: string;
|
||
type: string;
|
||
isCompressed: string;
|
||
fileType: string;
|
||
}
|
||
interface FileInfo {
|
||
file_id: number;
|
||
name: string;
|
||
size: FileSize;
|
||
content_type: ContentType;
|
||
upload_time: string;
|
||
storage_medium: string;
|
||
file_path: FilePath;
|
||
uploader_id: number;
|
||
upload_status: string;
|
||
deletion_status: string;
|
||
metadata: FileMetadata;
|
||
}
|
||
export interface FileUploadItem {
|
||
id: string;
|
||
uri: string;
|
||
name: string;
|
||
progress: number;
|
||
status: 'pending' | 'uploading' | 'success' | 'error';
|
||
error?: string;
|
||
previewUrl: string;
|
||
file?: File;
|
||
type: 'image' | 'video';
|
||
thumbnail?: string; // 缩略图URL
|
||
thumbnailFile?: File; // 缩略图文件对象
|
||
originalFile?: FileInfo
|
||
}
|
||
|
||
// 压缩图片可配置参数
|
||
export interface ImagesPickerProps {
|
||
children?: ReactNode;
|
||
style?: StyleProp<ViewStyle>;
|
||
onPickImage?: (file: File, exifData: ExifData) => void;
|
||
/** 压缩质量,0-1 之间的数字,默认为 0.8 */
|
||
compressQuality?: number;
|
||
/** 最大宽度,图片会被等比例缩放 */
|
||
maxWidth?: number;
|
||
/** 最大高度,图片会被等比例缩放 */
|
||
maxHeight?: number;
|
||
/** 是否保留 EXIF 数据,默认为 true */
|
||
preserveExif?: boolean;
|
||
/** 是否上传原图,默认为 false */
|
||
uploadOriginal?: boolean;
|
||
/** 上传完成回调 */
|
||
onUploadComplete?: UploadSingleCompleteCallback;
|
||
/** 进度 */
|
||
onProgress?: (progress: FileStatus) => void;
|
||
} |