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.
>
)}
)
}