"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
))}
); }