import { useEffect, useState } from 'react' import StyledModal from './StyledModal' import { formatBytes } from '~/lib/util' import api from '~/lib/api' interface Stats { cpuPercent: number memUsageBytes: number memLimitBytes: number memPercent: number } interface ServiceStatsModalProps { serviceName: string friendlyName: string open: boolean onClose: () => void } function Bar({ percent, label, value }: { percent: number; label: string; value: string }) { const clamped = Math.min(100, Math.max(0, percent)) return (
{label} {value}
90 ? 'bg-desert-red' : clamped > 70 ? 'bg-desert-orange' : 'bg-desert-green' }`} style={{ width: `${clamped}%` }} />
) } /** Polls and displays live CPU/memory usage for a running service container. */ export default function ServiceStatsModal({ serviceName, friendlyName, open, onClose, }: ServiceStatsModalProps) { const [stats, setStats] = useState(null) const [running, setRunning] = useState(true) const [loading, setLoading] = useState(false) useEffect(() => { if (!open) return let cancelled = false async function poll() { const res = await api.getServiceStats(serviceName) if (cancelled || !res) return setRunning(res.running) setStats(res.stats) setLoading(false) } setLoading(true) poll() const id = setInterval(poll, 2000) return () => { cancelled = true clearInterval(id) } }, [open, serviceName]) return (
{!running ? (

This app is not running. Start it to see live resource usage.

) : !stats ? (

{loading ? 'Loading…' : 'No stats available.'}

) : ( <>

Updates every 2 seconds.

)}
) }