import React, { useEffect, useState } from "react" import { Box, Text } from "ink" import type { LimitGroupView } from "../limits" import type { ProviderMode } from "../types" export function LimitsPanel(props: { limitGroups: LimitGroupView[]; loading?: boolean; error?: string; compact?: boolean; width?: number; providerMode?: ProviderMode }) { const mode = props.providerMode ?? "codex" const spinner = useSpinner(props.loading) if (mode === "kiro") { const hasLimits = props.limitGroups.length > 0 return ( Limits {spinner} {props.error && {props.error}} {hasLimits && props.limitGroups.map((group, groupIndex) => ( 0 ? 1 : 0}> {group.title && {group.title}} {group.rows.map((row) => ( ))} ))} {!props.loading && !hasLimits && !props.error && ( No account credit limits available )} ) } return ( Limits {spinner} {props.error && {props.error}} {!props.loading && !props.error && !props.limitGroups.length && No limits available} {props.limitGroups.map((group, groupIndex) => ( 0 ? 1 : 0}> {group.title && {group.title}} {group.rows.map((row) => ( ))} ))} ) } function LimitRow(props: { label: string; used: number; left: string; reset: string; compact?: boolean; width?: number }) { const labelWidth = props.compact ? Math.max(12, Math.min(18, Math.floor((props.width ?? 48) * 0.35))) : 21 const leftWidth = props.compact ? Math.max(10, Math.min(18, Math.floor((props.width ?? 48) * 0.35))) : 16 if (props.compact) { return ( {props.label} {props.left} ({props.reset}) ) } return ( {props.label} {props.left} ({props.reset}) ) } function useSpinner(active?: boolean) { const frames = ["|", "/", "-", "\\"] const [index, setIndex] = useState(0) useEffect(() => { if (!active) { setIndex(0) return } const timer = setInterval(() => { setIndex((value) => (value + 1) % frames.length) }, 120) return () => clearInterval(timer) }, [active]) return active ? frames[index] : " " }