import { AlertTriangle, CheckCircle2, ChevronDown, ChevronUp, Clock3, ListChecks } from "lucide-react"; import { useMemo, useState } from "react"; import type { OperationRecord } from "../contracts/workspace"; import { projectOperationForTray } from "../contracts/operationsConsole"; import { cx } from "../utils/classes"; interface OperationsTrayProps { operations: OperationRecord[]; } export function OperationsTray({ operations }: OperationsTrayProps) { const [open, setOpen] = useState(false); const items = useMemo(() => operations.slice(0, 6).map(projectOperationForTray), [operations]); const pendingCount = operations.filter((operation) => operation.status === "pending").length; const failedCount = operations.filter((operation) => operation.status === "failed").length; return (
{open && (
当前浏览器会话 持久任务与告警记录以 Platform 页面为准
{items.length === 0 ? (

本会话尚未提交资源变更。

) : (
    {items.map((item) => (
  1. {item.intent} {item.targetLabel} {item.status === "failed" ? item.errorReason : item.message ?? operationStatusLabel(item.status)} {item.diagnosticId && {item.diagnosticId}}
  2. ))}
)}
)}
); } function operationStatusLabel(status: OperationRecord["status"]): string { if (status === "pending") { return "等待 Platform 响应"; } return status === "succeeded" ? "Platform 已确认" : "Platform 请求失败"; } function formatOperationTime(value: string): string { const time = new Date(value); return Number.isNaN(time.getTime()) ? "时间未知" : time.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }); }