feat: 自动上传组件 Co-authored-by: Junhui Chen <chenjunhui@fairclip.cn> Co-committed-by: Junhui Chen <chenjunhui@fairclip.cn>
82 lines
3.0 KiB
TypeScript
82 lines
3.0 KiB
TypeScript
import pLimit from 'p-limit';
|
|
import { Alert } from 'react-native';
|
|
import { getUploadTaskStatus, insertUploadTask } from '../db';
|
|
import { getMediaByDateRange } from './media';
|
|
import { ExtendedAsset } from './types';
|
|
import { processAndUploadMedia } from './uploader';
|
|
|
|
// 设置最大并发数
|
|
const CONCURRENCY_LIMIT = 1; // 同时最多上传10个文件
|
|
const limit = pLimit(CONCURRENCY_LIMIT);
|
|
|
|
// 手动触发上传
|
|
export const triggerManualUpload = async (
|
|
startDate: Date,
|
|
endDate: Date,
|
|
onProgress?: (progress: {
|
|
totalCount: number;
|
|
uploadedCount: number;
|
|
totalBytes: number; // Overall total size
|
|
uploadedBytes: number; // Overall uploaded size
|
|
currentAsset: ExtendedAsset; // To show a thumbnail
|
|
}) => void
|
|
) => {
|
|
try {
|
|
const media = await getMediaByDateRange(startDate, endDate);
|
|
if (media.length === 0) {
|
|
Alert.alert('提示', '在指定时间范围内未找到媒体文件');
|
|
return [];
|
|
}
|
|
|
|
const progressMap = new Map<string, { loaded: number; total: number }>();
|
|
|
|
const results = [];
|
|
let uploadedCount = 0;
|
|
|
|
for (const asset of media) {
|
|
const existingTask = await getUploadTaskStatus(asset.uri);
|
|
if (!existingTask) {
|
|
await insertUploadTask({ uri: asset.uri, filename: asset.filename, status: 'pending', progress: 0 });
|
|
} else if (existingTask.status === 'success' || existingTask.status === 'skipped') {
|
|
console.log(`File ${asset.uri} already ${existingTask.status}, skipping processing.`);
|
|
uploadedCount++; // Also count skipped files as 'processed'
|
|
continue;
|
|
}
|
|
|
|
const result = await limit(() => processAndUploadMedia(asset, (fileProgress) => {
|
|
progressMap.set(asset.uri, fileProgress);
|
|
const uploadedBytes = Array.from(progressMap.values()).reduce((sum, p) => sum + p.loaded, 0);
|
|
const totalBytes = Array.from(progressMap.values()).reduce((sum, p) => sum + p.total, 0);
|
|
onProgress?.({
|
|
totalCount: media.length,
|
|
uploadedCount,
|
|
totalBytes,
|
|
uploadedBytes,
|
|
currentAsset: asset,
|
|
});
|
|
}));
|
|
|
|
if (result) {
|
|
results.push(result);
|
|
if (result.originalSuccess) {
|
|
uploadedCount++;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 过滤掉因为已上传而返回 null 的结果
|
|
const finalResults = results.filter(result => result !== null);
|
|
|
|
console.log('Manual upload completed.', {
|
|
total: media.length,
|
|
uploaded: finalResults.length,
|
|
skipped: media.length - finalResults.length
|
|
});
|
|
|
|
return finalResults;
|
|
} catch (error) {
|
|
console.error('手动上传过程中出现错误:', error);
|
|
Alert.alert('错误', '上传过程中出现错误');
|
|
throw error;
|
|
}
|
|
}; |