import { useState } from "react";
import type { PlanDisplayEntry } from "../../src/lib/types";
import type { PlanEntry, PlanEntryPriority, PlanEntryStatus } from "../../src/acp/types";
import { cn } from "../../src/lib/utils";
import { CheckCircle2, Loader2, Circle } from "lucide-react";
// =============================================================================
// Plan 展示组件 — 执行计划可视化
// =============================================================================
interface PlanDisplayProps {
entry: PlanDisplayEntry;
}
export function PlanDisplay({ entry }: PlanDisplayProps) {
const [collapsed, setCollapsed] = useState(false);
const { entries } = entry;
if (entries.length === 0) return null;
const completed = entries.filter((e) => e.status === "completed").length;
const total = entries.length;
const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
return (
{/* Header */}
{/* Entry list */}
{!collapsed && (
5 && "max-h-64 overflow-y-auto",
)}>
{entries.map((planEntry, i) => (
))}
)}
);
}
// =============================================================================
// 单条 Plan 条目
// =============================================================================
function PlanEntryRow({ entry }: { entry: PlanEntry }) {
return (
);
}
// =============================================================================
// 状态图标
// =============================================================================
function StatusIcon({ status }: { status: PlanEntryStatus }) {
switch (status) {
case "completed":
return ;
case "in_progress":
return ;
case "pending":
return ;
}
}
// =============================================================================
// 优先级标签
// =============================================================================
function PriorityBadge({ priority }: { priority: PlanEntryPriority }) {
const styles: Record = {
high: "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300",
medium: "bg-brand/10 text-brand dark:bg-brand/20",
low: "bg-surface-1 text-text-muted",
};
const labels: Record = {
high: "高",
medium: "中",
low: "低",
};
return (
{labels[priority]}
);
}