import React from 'react'; import { useTranslation } from 'react-i18next'; import { Progress } from '@/components/ui/progress'; import { Download, Package, Settings, Rocket, CheckCircle2, XCircle, Loader2, X, ListTodo, } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { Badge } from '@/components/ui/badge'; import { usePluginInstallTasks, InstallStage, PluginInstallTask, } from './PluginInstallTaskContext'; import { cn } from '@/lib/utils'; const STAGE_ICONS: Record = { [InstallStage.DOWNLOADING]: Download, [InstallStage.INSTALLING_DEPS]: Package, [InstallStage.INITIALIZING]: Settings, [InstallStage.LAUNCHING]: Rocket, [InstallStage.DONE]: CheckCircle2, [InstallStage.ERROR]: XCircle, }; function TaskQueueItem({ task, onClick, onRemove, }: { task: PluginInstallTask; onClick: () => void; onRemove: () => void; }) { const { t } = useTranslation(); const isDone = task.stage === InstallStage.DONE; const isError = task.stage === InstallStage.ERROR; const isRunning = !isDone && !isError; const StageIcon = STAGE_ICONS[task.stage] || Download; const stageLabel = (() => { switch (task.stage) { case InstallStage.DOWNLOADING: return t('plugins.installProgress.downloading'); case InstallStage.INSTALLING_DEPS: return t('plugins.installProgress.installingDeps'); case InstallStage.INITIALIZING: return t('plugins.installProgress.initializing'); case InstallStage.LAUNCHING: return t('plugins.installProgress.launching'); case InstallStage.DONE: return t('plugins.installProgress.completed'); case InstallStage.ERROR: return t('plugins.installProgress.failed'); default: return ''; } })(); return (
{isRunning ? ( ) : ( )}
{task.pluginName}
{stageLabel} {isRunning && ( {task.overallProgress}% )}
{isRunning && ( )}
{(isDone || isError) && ( )}
); } export default function PluginInstallTaskQueue() { const { t } = useTranslation(); const { tasks, setSelectedTaskId, removeTask, clearCompletedTasks } = usePluginInstallTasks(); const runningCount = tasks.filter( (t) => t.stage !== InstallStage.DONE && t.stage !== InstallStage.ERROR, ).length; const hasCompleted = tasks.some( (t) => t.stage === InstallStage.DONE || t.stage === InstallStage.ERROR, ); return (
{t('plugins.installProgress.taskQueue')} {hasCompleted && ( )}
{tasks.length === 0 ? (
{t('plugins.installProgress.noTasks')}
) : ( tasks.map((task) => ( setSelectedTaskId(task.id)} onRemove={() => removeTask(task.id)} /> )) )}
); }