"use client";
import { DashboardLayout } from "@/components/dashboard/DashboardLayout";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Server, Plus, Settings } from "lucide-react";
import { Progress } from "@/components/ui/progress";
import { Docker, Node, NodeLiveData } from "@/lib/types";
import { useEffect, useState } from "react";
import { getLiveNodes } from "@/lib/dockship/node";
import { formatBytes } from "@/lib/format";
import { setNodes as updateNodes } from "@/lib/dockship/node";
import AddNode from "@/components/dialogs/AddNode";
import { getDocker } from "@/lib/dockship/docker";
import RemoveDialog from "@/components/dialogs/Remove";
import { useAsync, useAsyncInterval } from "@/hooks/use-async";
function DiskUsage({ liveData }: NodeLiveData) {
if (!liveData) return null;
const usage = (liveData.disk.used / liveData.disk.size) * 100;
return (
Disk
{usage.toFixed(0)}%
{formatBytes(liveData.disk.used)} / {formatBytes(liveData.disk.size)}
);
}
export default function NodesPage() {
const { value: nodes, setValue: setNodes } = useAsyncInterval(
"liveNodes",
[],
getLiveNodes,
3000,
);
const { value: dockerNodes } = useAsync(
"docker",
[],
async () => getDocker(nodes),
[nodes],
);
return (
{nodes.length} nodes
{nodes.filter((node) => node.liveData).length} online
{nodes.map((node, i) => (
{node.name}
{node.liveData ? (
) : (
)}
{node.ip} • {node.ip}
{node.labels.map((label) => (
{label}
))}
{
const newNodes = nodes.filter((_, index) => index !== i);
setNodes(newNodes);
await updateNodes(newNodes);
}}
/>
{/* System Info */}
System
OS
{node.os}
Docker
{dockerNodes[i]?.version}
Containers
{dockerNodes[i]?.containers.length}
{/* CPU */}
CPU ({node.liveData?.cpu.cores} cores)
{node.liveData?.cpu.usage.toFixed(0)}%
{/* Memory */}
Memory
{node.liveData?.memory.usage.toFixed(0)}%
{node.liveData &&
formatBytes(node.liveData?.memory.used) +
"/" +
formatBytes(node.liveData?.memory.total)}
{/* Disk */}
{/* Quick Actions */}
Quick Actions
))}
);
}