import React, { useEffect, useRef, useState } from "react" import { Box, Text } from "ink" import { formatResourceUsageHeader, readResourceUsage, type ResourceUsageSample, type ResourceUsageSnapshot } from "../resources" const RESOURCE_REFRESH_INTERVAL_MS = 2000 const MIN_RULE_WIDTH = 6 export function ResourceUsageHeader(props: { intervalMs?: number; initialUsage?: ResourceUsageSnapshot }) { const initial = useRef(readResourceUsage()) const sample = useRef(initial.current.sample) const [usage, setUsage] = useState(() => props.initialUsage ?? initial.current.usage) useEffect(() => { const timer = setInterval(() => { const next = readResourceUsage(sample.current) sample.current = next.sample setUsage(next.usage) }, props.intervalMs ?? RESOURCE_REFRESH_INTERVAL_MS) return () => clearInterval(timer) }, [props.intervalMs]) return | {formatResourceUsageHeader(usage)} } export function StatusHeader(props: { width: number; text: string; resourceWidth: number; intervalMs?: number; initialUsage?: ResourceUsageSnapshot }) { const initial = useRef(readResourceUsage()) const sample = useRef(initial.current.sample) const [usage, setUsage] = useState(() => props.initialUsage ?? initial.current.usage) const resourceText = props.resourceWidth > 0 ? ` | ${formatResourceUsageHeader(usage)}` : "" const resourceWidth = Math.min(resourceText.length, props.resourceWidth, Math.max(0, props.width - 12 - 2 - MIN_RULE_WIDTH)) const textWidth = Math.max(12, Math.min(props.text.length, props.width - resourceWidth - 2 - MIN_RULE_WIDTH)) const ruleWidth = Math.max(0, props.width - textWidth - resourceWidth - 2) const leftRuleWidth = Math.floor(ruleWidth / 2) const rightRuleWidth = ruleWidth - leftRuleWidth useEffect(() => { const timer = setInterval(() => { const next = readResourceUsage(sample.current) sample.current = next.sample setUsage(next.usage) }, props.intervalMs ?? RESOURCE_REFRESH_INTERVAL_MS) return () => clearInterval(timer) }, [props.intervalMs]) return ( {"─".repeat(leftRuleWidth)} {props.text} {resourceWidth > 0 && ( {resourceText} )} {"─".repeat(rightRuleWidth)} ) }