import { Button } from "@termix/plugin-sdk/ui"; import { formatTransferMbPerSec, getTransferProgressPercent, type TransferProgressResponse, } from "../api/transfer-api"; import type { TranslateFn } from "@termix/plugin-sdk/frontend"; import { Archive, ArchiveRestore, ArrowRight, Gauge, RefreshCw, ShieldCheck, } from "lucide-react"; import { TransferProgressBar } from "./TransferProgressBar"; interface TransferProgressToastProps { t: TranslateFn; status: TransferProgressResponse; liveMbPerSec?: number; stalled?: boolean; formatSize: (bytes?: number) => string; onCancel?: () => void; cancelling?: boolean; } export function TransferProgressToast({ t, status, liveMbPerSec, stalled = false, formatSize, onCancel, cancelling = false, }: TransferProgressToastProps) { const percent = getTransferProgressPercent(status); let title = t("transfer.progressTransferring"); if (status.phase === "reconnecting") { title = t("transfer.progressReconnecting"); } else if (status.phase === "benchmarking") { title = t("transfer.progressBenchmarking"); } else if (status.phase === "verifying") { title = t("transfer.progressVerifying"); } else if (status.phase === "compressing") { title = t("transfer.progressCompressing"); } else if (status.phase === "extracting") { title = t("transfer.progressExtracting"); } else if ( status.method === "item_sftp" && status.totalItems !== undefined && status.itemsCompleted !== undefined ) { title = t("transfer.progressTransferringItems", { current: status.itemsCompleted, total: status.totalItems, }); } const hasByteProgress = status.bytesTransferred !== undefined && status.totalBytes !== undefined && status.totalBytes > 0; const detailLeft = hasByteProgress ? t("transfer.progressBytes", { transferred: formatSize(status.bytesTransferred), total: formatSize(status.totalBytes), }) : status.method === "item_sftp" && status.totalItems !== undefined && status.itemsCompleted !== undefined ? t("transfer.progressItems", { current: status.itemsCompleted, total: status.totalItems, }) : null; const liveRate = status.phase === "reconnecting" ? undefined : stalled ? t("transfer.progressStalled") : liveMbPerSec !== undefined ? status.parallelSegmentCount && status.parallelSegmentCount > 1 ? t("transfer.progressTotalSpeed", { speed: formatTransferMbPerSec(liveMbPerSec), lanes: status.parallelSegmentCount, }) : formatTransferMbPerSec(liveMbPerSec) : undefined; const showIndeterminate = status.phase === "reconnecting" || percent === undefined; const PhaseIcon = status.phase === "compressing" ? Archive : status.phase === "benchmarking" ? Gauge : status.phase === "verifying" ? ShieldCheck : status.phase === "extracting" ? ArchiveRestore : status.phase === "reconnecting" ? RefreshCw : ArrowRight; return (