import React, { memo } from 'react' import { CheckCircle2, XCircle, Loader2, PlayCircle, PauseCircle, Trash2, StopCircle } from 'lucide-react' import type { ExportTask } from '../../types' import type { BackgroundTaskRecord } from '../../../../types/backgroundTask' import { backgroundTaskSourceLabels, backgroundTaskStatusLabels } from '../../constants' import { formatDurationMs } from '../../utils/format' import './TaskCenter.scss' interface TaskCenterProps { exportTasks: ExportTask[] onCancelExportTask: (taskId: string) => void onClearCompletedExportTasks: () => void backgroundTasks: BackgroundTaskRecord[] onPauseBackgroundTask: (taskId: string) => void onResumeBackgroundTask: (taskId: string) => void onCancelBackgroundTask: (taskId: string) => void } const TaskCenter: React.FC = ({ exportTasks, onCancelExportTask, onClearCompletedExportTasks, backgroundTasks, onPauseBackgroundTask, onResumeBackgroundTask, onCancelBackgroundTask }) => { const hasTasks = exportTasks.length > 0 || backgroundTasks.length > 0 if (!hasTasks) return null const activeExportTasks = exportTasks.filter(t => t.status === 'running' || t.status === 'cancel_requested') const completedExportTasks = exportTasks.filter(t => t.status === 'success' || t.status === 'error') return (

任务中心

{completedExportTasks.length > 0 && ( )}
{/* Export Tasks */} {exportTasks.map(task => { const hasMessageProgress = Number(task.progress.phaseTotal) > 0 const phaseLabel = task.progress.phaseLabel || task.progress.phase const labelAlreadyHasCount = hasMessageProgress && /\d[\d,]*\s*\/\s*\d[\d,]*\s*条/.test(phaseLabel) const countText = hasMessageProgress ? `${Math.max(0, Math.floor(Number(task.progress.phaseProgress) || 0)).toLocaleString()} / ${Math.max(0, Math.floor(Number(task.progress.phaseTotal) || 0)).toLocaleString()} 条` : `${Math.max(0, Math.floor(Number(task.progress.current) || 0))} / ${Math.max(0, Math.floor(Number(task.progress.total) || 0))}` return (
{task.title} {task.status === 'running' && } {task.status === 'success' && } {task.status === 'error' && } {task.status === 'cancel_requested' && } {task.status === 'running' ? '导出中' : task.status === 'success' ? '已完成' : task.status === 'cancel_requested' ? '取消中' : '失败'}
{task.status === 'running' && ( )}
{phaseLabel} {!labelAlreadyHasCount && {countText}}
{task.error &&
{task.error}
}
) })} {/* Global Background Tasks */} {backgroundTasks.length > 0 && (

全局后台任务

{backgroundTasks.map(bgTask => { const isPausable = bgTask.status === 'running' const isResumable = bgTask.status === 'paused' const isCancelable = bgTask.status !== 'completed' && bgTask.status !== 'canceled' && bgTask.status !== 'failed' return (
{backgroundTaskSourceLabels[bgTask.sourcePage] || '后台任务'} {backgroundTaskStatusLabels[bgTask.status]}
{isPausable && ( )} {isResumable && ( )} {isCancelable && ( )}
{bgTask.progressText && (
{bgTask.progressText}
)}
) })}
)}
) } export default memo(TaskCenter)