import type {
ProxiFyreSetupProgress,
ProxiFyreSetupStatus,
} from "../../api/tauriCommands";
interface ProxiFyreSetupStripProps {
setupStatus: ProxiFyreSetupStatus | null;
progress: ProxiFyreSetupProgress | null;
}
const SETUP_PLACEHOLDERS: ProxiFyreSetupStatus["items"] = [
{
id: "vc-runtime",
name: "Среда запуска",
installed: false,
details: "Проверяю",
},
{
id: "packet-filter",
name: "Сетевой драйвер",
installed: false,
details: "Проверяю",
},
{
id: "proxifyre",
name: "Клиент ProxiFyre",
installed: false,
details: "Проверяю",
},
];
export function ProxiFyreSetupStrip({
setupStatus,
progress,
}: ProxiFyreSetupStripProps) {
const stripItems = setupStatus?.items ?? SETUP_PLACEHOLDERS;
const visibleProgress = isVisibleProgress(progress) ? progress : null;
const progressTone =
visibleProgress?.status === "failed" ? "failed" : "running";
const percent = clampPercent(visibleProgress?.percent ?? 0);
return (
Состав
{stripItems.map((item) => (
{setupItemUserName(item.id, item.name)}
{setupItemShortStatus(item, visibleProgress)}
))}
{visibleProgress ? (
{visibleProgress.message}
) : null}
);
}
function setupItemClass(
item: ProxiFyreSetupStatus["items"][number],
progress: ProxiFyreSetupProgress | null,
) {
if (progress?.activeStep === item.id) {
if (progress.status === "failed") return "failed";
return "active";
}
if (item.installed) return "installed";
return "missing";
}
function setupItemUserName(id: string, fallbackName: string) {
if (id === "vc-runtime") return "Среда запуска";
if (id === "packet-filter") return "Сетевой драйвер";
if (id === "proxifyre") return "Клиент ProxiFyre";
return fallbackName;
}
function setupItemShortStatus(
item: ProxiFyreSetupStatus["items"][number],
progress: ProxiFyreSetupProgress | null,
) {
if (progress?.activeStep === item.id) {
if (progress.status === "failed") return "ошибка";
if (progress.status === "succeeded")
return progress.operation === "uninstall" ? "удалено" : "готово";
return "в процессе";
}
if (item.details === "Проверяю") return "проверяю";
if (!item.installed)
return progress?.operation === "uninstall" &&
progress.status === "succeeded"
? "удалено"
: "нужно установить";
if (item.id === "proxifyre")
return proxifyreSetupServiceSummary(item.version);
return "готово";
}
function proxifyreSetupServiceSummary(version: string | undefined) {
const normalized = version?.trim().toLowerCase() ?? "";
if (normalized.includes("не установлена")) return "служба не установлена";
if (normalized.includes("остановлена") || normalized.includes("не запущена"))
return "служба остановлена";
if (normalized.includes("запущена")) return "служба запущена";
return "готово";
}
function isVisibleProgress(
progress: ProxiFyreSetupProgress | null,
): progress is ProxiFyreSetupProgress {
if (!progress || progress.status === "idle") return false;
return progress.status === "running" || progress.status === "failed";
}
function clampPercent(value: number) {
if (!Number.isFinite(value)) return 0;
return Math.max(0, Math.min(100, Math.round(value)));
}