/** * @file CloneProgress — the live line under a running clone: its place in the * server's clone queue while it waits (clones run a few at a time machine-wide, * `server/lib/clone-queue.js`), then git's own phase, percent, size and speed * with a bar. It renders the progress fields of a background clone job * (`lib/cloneJobs.ts`, polled by the store) — it fetches nothing itself. * @author Nguyễn Ngọc Trí Vĩ */ import { useTranslation } from "react-i18next"; import type { CloneJob } from "../../lib/api"; export type CloneProgressFields = Pick< CloneJob, "state" | "position" | "phase" | "label" | "percent" | "detail" > & { running?: number; waiting?: number; limit?: number }; export function CloneProgress({ view }: { view: CloneProgressFields }) { const { t } = useTranslation("lanes"); if (view.state !== "queued" && view.state !== "running") return null; if (view.state === "queued") { return (

{view.waiting !== undefined && view.running !== undefined && view.limit !== undefined ? t("clone.queued", { position: view.position ?? 1, waiting: view.waiting, running: view.running, limit: view.limit, }) : t("cloneJobs.queued", { position: view.position ?? 1 })}

); } const phase = view.phase ? view.phase === "other" ? view.label || "" : t(`clone.phase.${view.phase}`) : t("clone.connecting"); const percent = view.percent ?? 0; return (

{phase} {view.phase ? ` ${percent}%` : ""} {view.detail && ( {view.detail} )}

{view.phase && (
)}
); }