Files
light-heart-labs--dreamserver/installer/src/pages/SystemCheck.tsx
T
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 12:31:33 +08:00

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} &middot; {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>
);
}