9e8f1bbeed
Dashboard / frontend (push) Failing after 0s
Dashboard / api (push) Failing after 0s
Lint PowerShell / powershell-lint (ubuntu-latest) (push) Failing after 1s
Python Lint / Lint Python with Ruff (push) Failing after 1s
ShellCheck / Lint shell scripts (push) Failing after 1s
Matrix Smoke / linux-smoke (push) Failing after 1s
Matrix Smoke / distro: cachyos (push) Failing after 15s
Matrix Smoke / distro: linux-mint-21.3 (push) Failing after 15s
Matrix Smoke / distro: debian-12 (push) Failing after 5m21s
Matrix Smoke / distro: fedora-41 (push) Failing after 4m56s
Matrix Smoke / distro: ubuntu-24.04 (push) Failing after 2m13s
Matrix Smoke / distro: rocky-9 (push) Failing after 10m39s
Matrix Smoke / distro: manjaro (push) Failing after 12m11s
Matrix Smoke / distro: opensuse-tw (push) Failing after 11m53s
Matrix Smoke / distro: archlinux (push) Failing after 20m3s
Matrix Smoke / distro: ubuntu-22.04 (push) Failing after 13m49s
Validate .env Schema / tier-1-env-validation (push) Successful in 52s
Validate .env Schema / tier-2-env-validation (push) Successful in 44s
Validate .env Schema / tier-3-env-validation (push) Successful in 52s
Validate .env Schema / tier-4-env-validation (push) Successful in 51s
Validate Extensions Catalog / Check catalog is up-to-date (push) Failing after 9m47s
Secret Scan / Scan for secrets (push) Failing after 21m4s
Validate Docker Compose / Validate Docker Compose files (push) Has been cancelled
Python Type Check / Type check with mypy (push) Has been cancelled
Validate .env Schema / tier-0-env-validation (push) Has been cancelled
Test Linux / integration-smoke (push) Has been cancelled
Lint PowerShell / powershell-lint (windows-latest) (push) Has been cancelled
Matrix Smoke / macos-smoke (push) Has been cancelled
106 lines
3.3 KiB
TypeScript
106 lines
3.3 KiB
TypeScript
import { useEffect, useState } from "react";
|
|
import Button from "../components/Button";
|
|
import StatusIcon from "../components/StatusIcon";
|
|
import { checkSystem, type SystemCheckResult, type RequirementCheck } from "../hooks/useTauri";
|
|
|
|
interface Props {
|
|
onNext: () => void;
|
|
onError: (msg: string) => void;
|
|
}
|
|
|
|
export default function SystemCheck({ onNext, onError }: Props) {
|
|
const [loading, setLoading] = useState(true);
|
|
const [result, setResult] = useState<SystemCheckResult | null>(null);
|
|
|
|
useEffect(() => {
|
|
checkSystem()
|
|
.then((r) => {
|
|
setResult(r);
|
|
setLoading(false);
|
|
})
|
|
.catch((e) => {
|
|
onError(String(e));
|
|
});
|
|
}, [onError]);
|
|
|
|
if (loading) {
|
|
return (
|
|
<div className="flex flex-col items-center justify-center h-full">
|
|
<StatusIcon status="loading" />
|
|
<p className="mt-4 text-gray-400">Checking your system...</p>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (!result) return null;
|
|
|
|
const allMet = result.requirements.every((r: RequirementCheck) => r.met);
|
|
|
|
return (
|
|
<div className="flex flex-col items-center justify-center h-full px-8">
|
|
<h2 className="text-2xl font-bold mb-2">System Check</h2>
|
|
<p className="text-gray-400 mb-8">
|
|
{result.system.os_version} · {result.system.arch}
|
|
</p>
|
|
|
|
<div className="w-full max-w-md space-y-3 mb-8">
|
|
{result.requirements.map((req: RequirementCheck) => (
|
|
<div
|
|
key={req.name}
|
|
className="flex items-center justify-between bg-gray-900 rounded-lg px-4 py-3"
|
|
>
|
|
<div className="flex items-center gap-3">
|
|
<StatusIcon status={req.met ? "pass" : "fail"} />
|
|
<div>
|
|
<p className="text-sm font-medium text-white">{req.name}</p>
|
|
<p className="text-xs text-gray-500">{req.found}</p>
|
|
</div>
|
|
</div>
|
|
<span className="text-xs text-gray-600">{req.required}</span>
|
|
</div>
|
|
))}
|
|
|
|
{/* Docker status */}
|
|
<div className="flex items-center justify-between bg-gray-900 rounded-lg px-4 py-3">
|
|
<div className="flex items-center gap-3">
|
|
<StatusIcon
|
|
status={
|
|
result.docker.installed && result.docker.running
|
|
? "pass"
|
|
: result.docker.installed
|
|
? "warn"
|
|
: "fail"
|
|
}
|
|
/>
|
|
<div>
|
|
<p className="text-sm font-medium text-white">Docker</p>
|
|
<p className="text-xs text-gray-500">
|
|
{result.docker.installed
|
|
? result.docker.running
|
|
? result.docker.version
|
|
: "Installed but not running"
|
|
: "Not installed"}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<span className="text-xs text-gray-600">Required</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="flex gap-3">
|
|
<Button onClick={onNext}>
|
|
{allMet && result.docker.installed
|
|
? "Continue"
|
|
: "Continue Anyway"}
|
|
</Button>
|
|
</div>
|
|
|
|
{!allMet && (
|
|
<p className="mt-4 text-xs text-yellow-500/70">
|
|
Some requirements aren't met. We'll try to fix them in the next step.
|
|
</p>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|