2026-01-04 21:58:59 -05:00
|
|
|
"use client";
|
|
|
|
|
|
2026-05-13 23:46:11 -04:00
|
|
|
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";
|
2026-01-04 21:58:59 -05:00
|
|
|
|
2026-05-09 06:48:20 -04:00
|
|
|
const ALL_STATUSES_URL = "/api/cli-tools/all-statuses";
|
2026-02-25 04:32:05 -05:00
|
|
|
|
2026-01-04 21:58:59 -05:00
|
|
|
export default function CLIToolsPageClient({ machineId }) {
|
|
|
|
|
const [loading, setLoading] = useState(true);
|
2026-02-25 04:32:05 -05:00
|
|
|
const [toolStatuses, setToolStatuses] = useState({});
|
2026-01-04 21:58:59 -05:00
|
|
|
|
2026-05-11 22:25:29 -04:00
|
|
|
useEffect(() => {
|
2026-05-13 23:46:11 -04:00
|
|
|
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; };
|
2026-01-20 23:45:19 -05:00
|
|
|
}, []);
|
2026-01-04 21:58:59 -05:00
|
|
|
|
|
|
|
|
if (loading) {
|
|
|
|
|
return (
|
2026-05-13 23:46:11 -04:00
|
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4">
|
|
|
|
|
<CardSkeleton />
|
|
|
|
|
<CardSkeleton />
|
|
|
|
|
<CardSkeleton />
|
2026-03-04 23:25:03 -05:00
|
|
|
<CardSkeleton />
|
|
|
|
|
<CardSkeleton />
|
|
|
|
|
<CardSkeleton />
|
2026-01-04 21:58:59 -05:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-19 04:32:29 -04:00
|
|
|
const regularTools = Object.entries(CLI_TOOLS);
|
2026-04-10 07:16:14 -04:00
|
|
|
const mitmTools = Object.entries(MITM_TOOLS);
|
2026-03-04 23:25:03 -05:00
|
|
|
|
2026-01-04 21:58:59 -05:00
|
|
|
return (
|
2026-05-01 05:34:07 -04:00
|
|
|
<div className="mx-auto flex w-full max-w-5xl flex-col gap-6 px-1 sm:px-0">
|
2026-05-13 23:46:11 -04:00
|
|
|
<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]} />
|
|
|
|
|
))}
|
2026-01-04 21:58:59 -05:00
|
|
|
</div>
|
2026-05-13 23:46:11 -04:00
|
|
|
<div className="flex flex-col gap-3 sm:gap-4">
|
2026-05-01 05:34:07 -04:00
|
|
|
<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>
|
2026-05-13 23:46:11 -04:00
|
|
|
<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>
|
2026-04-10 07:16:14 -04:00
|
|
|
</div>
|
2026-01-04 21:58:59 -05:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|