- Add jcode CLI tool (#1047) with auto-configuration - Redesign CLI Tools dashboard: grid 1/2/3 cols + per-tool detail page - Sync DeepSeek TUI card style + resize icon 1024->128 - Add official logos: amp, jcode, qwen - Bump version 0.4.39 -> 0.4.41 Co-authored-by: Cursor <cursoragent@cursor.com>
66 lines
2.1 KiB
JavaScript
66 lines
2.1 KiB
JavaScript
"use client";
|
|
|
|
import { useState, useEffect } from "react";
|
|
import { CardSkeleton } from "@/shared/components";
|
|
import { CLI_TOOLS, MITM_TOOLS } from "@/shared/constants/cliTools";
|
|
import { MitmLinkCard } from "./components";
|
|
import ToolSummaryCard from "./components/ToolSummaryCard";
|
|
|
|
const ALL_STATUSES_URL = "/api/cli-tools/all-statuses";
|
|
|
|
export default function CLIToolsPageClient({ machineId }) {
|
|
const [loading, setLoading] = useState(true);
|
|
const [toolStatuses, setToolStatuses] = useState({});
|
|
|
|
useEffect(() => {
|
|
let mounted = true;
|
|
(async () => {
|
|
try {
|
|
const res = await fetch(ALL_STATUSES_URL);
|
|
if (res.ok && mounted) setToolStatuses(await res.json());
|
|
} catch (error) {
|
|
console.log("Error fetching tool statuses:", error);
|
|
} finally {
|
|
if (mounted) setLoading(false);
|
|
}
|
|
})();
|
|
return () => { mounted = false; };
|
|
}, []);
|
|
|
|
if (loading) {
|
|
return (
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4">
|
|
<CardSkeleton />
|
|
<CardSkeleton />
|
|
<CardSkeleton />
|
|
<CardSkeleton />
|
|
<CardSkeleton />
|
|
<CardSkeleton />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
const regularTools = Object.entries(CLI_TOOLS);
|
|
const mitmTools = Object.entries(MITM_TOOLS);
|
|
|
|
return (
|
|
<div className="mx-auto flex w-full max-w-5xl flex-col gap-6 px-1 sm:px-0">
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4">
|
|
{regularTools.map(([toolId, tool]) => (
|
|
<ToolSummaryCard key={toolId} toolId={toolId} tool={tool} status={toolStatuses[toolId]} />
|
|
))}
|
|
</div>
|
|
<div className="flex flex-col gap-3 sm:gap-4">
|
|
<div className="flex items-center gap-2 px-1">
|
|
<span className="material-symbols-outlined text-[18px] text-primary">security</span>
|
|
<h2 className="text-sm font-semibold text-text-main">MITM Tools</h2>
|
|
</div>
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4">
|
|
{mitmTools.map(([toolId, tool]) => (
|
|
<MitmLinkCard key={toolId} tool={tool} />
|
|
))}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|