'use client'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from '@workspace/ui/components/accordion'; import { Badge } from '@workspace/ui/components/badge'; import { Progress } from '@workspace/ui/components/progress'; import { ScrollArea } from '@workspace/ui/components/scroll-area'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@workspace/ui/components/tooltip'; import { formatDate } from '@workspace/ui/utils'; import { useTranslations } from 'next-intl'; import { useState } from 'react'; import { UserSubscribeDetail } from '../user/user-detail'; export function formatPercentage(value: number): string { return `${value.toFixed(1)}%`; } export function NodeStatusCell({ status }: { status: API.NodeStatus }) { const t = useTranslations('server.node'); const [openItem, setOpenItem] = useState(null); const { online, cpu, mem, disk, updated_at } = status || { online: {}, cpu: 0, mem: 0, disk: 0, updated_at: 0, }; const isOnline = updated_at > 0; const badgeVariant = isOnline ? 'default' : 'destructive'; const badgeText = isOnline ? t('normal') : t('abnormal'); const onlineCount = (online && Object.keys(online).length) || 0; return (
{badgeText} {t('onlineCount')}: {onlineCount}
CPU {formatPercentage(cpu ?? 0)}
{t('memory')} {formatPercentage(mem ?? 0)}
{t('disk')} {formatPercentage(disk ?? 0)}
{isOnline && (
{t('lastUpdated')}: {formatDate(updated_at ?? 0)}
)}
{isOnline && onlineCount > 0 && (

{t('onlineUsers')}

setOpenItem(value)} > {Object.entries(online).map(([uid, ips]) => ( {`[UID: ${uid}] - ${ips[0]}`}
    {ips.map((ip: string) => (
  • {ip}
  • ))}
))}
)}
); }