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] : " "
}