import React, { useEffect, useState } from 'react'; import { X, CheckCircle, Clock, AlertCircle, Pause, Square } from 'lucide-react'; import { invoke } from '@tauri-apps/api/core'; interface BatchImportProgressModalProps { onClose: () => void; onComplete?: () => void; } interface BatchProgress { total_items: number; completed_items: number; failed_items: number; current_item?: string; overall_progress: number; is_running: boolean; } export const BatchImportProgressModal: React.FC = ({ onClose, onComplete, }) => { const [progress, setProgress] = useState(null); const [isCompleted, setIsCompleted] = useState(false); const [queueStatus, setQueueStatus] = useState<[number, number, number, number] | null>(null); useEffect(() => { const fetchProgress = async () => { try { const progressData = await invoke('get_batch_import_progress'); setProgress(progressData); const status = await invoke<[number, number, number, number]>('get_queue_status'); setQueueStatus(status); if (progressData && !progressData.is_running && progressData.completed_items + progressData.failed_items >= progressData.total_items) { setIsCompleted(true); if (onComplete) { setTimeout(() => { onComplete(); }, 3000); // 3秒后自动关闭 } } } catch (error) { console.error('获取批量导入进度失败:', error); } }; // 立即获取一次进度 fetchProgress(); // 定期轮询进度 const interval = setInterval(() => { if (!isCompleted) { fetchProgress(); } }, 1000); return () => clearInterval(interval); }, [isCompleted, onComplete]); const handleStopImport = async () => { try { await invoke('stop_batch_import'); setProgress(prev => prev ? { ...prev, is_running: false } : null); } catch (error) { console.error('停止批量导入失败:', error); } }; const handleClearQueue = async () => { try { await invoke('clear_import_queue'); setProgress(null); setQueueStatus(null); onClose(); } catch (error) { console.error('清空队列失败:', error); } }; if (!progress && !queueStatus) { return (
加载进度信息...
); } const totalItems = progress?.total_items || 0; const completedItems = progress?.completed_items || 0; const failedItems = progress?.failed_items || 0; const overallProgress = progress?.overall_progress || 0; const isRunning = progress?.is_running || false; return (
{/* 模态框头部 */}

批量导入进度

{/* 模态框内容 */}
{/* 状态指示器 */}
{isRunning ? ( ) : isCompleted ? ( ) : ( )}
{isRunning ? '正在批量导入' : isCompleted ? '批量导入完成' : '批量导入已暂停'}
{progress?.current_item && (
当前处理: {progress.current_item.split(/[/\\]/).pop()}
)}
{/* 进度条 */}
总体进度 {Math.round(overallProgress)}%
{/* 统计信息 */}
{totalItems}
总数
{totalItems - completedItems - failedItems}
等待
{completedItems}
完成
{failedItems}
失败
{/* 队列状态 */} {queueStatus && (
队列状态
队列总数: {queueStatus[0]}
等待处理: {queueStatus[1]}
正在处理: {queueStatus[2]}
已完成: {queueStatus[3]}
)} {/* 完成信息 */} {isCompleted && (
批量导入完成!
成功导入 {completedItems} 个模板 {failedItems > 0 && `,${failedItems} 个失败`}
)} {/* 操作提示 */} {isRunning && (
导入进行中
系统正在后台批量处理模板文件,您可以关闭此窗口继续使用其他功能。 导入完成后会有通知提醒。
)}
{/* 模态框底部 */}
{isRunning && ( )} {!isRunning && totalItems > 0 && ( )}
); };