Spaces:
Runtime error
Runtime error
| "use client"; | |
| import { Input } from "@/shared/components"; | |
| export function UsageLimitSettings({ | |
| enabled, | |
| dailyLimitUsd, | |
| weeklyLimitUsd, | |
| enabledLabel, | |
| disabledLabel, | |
| onEnabledChange, | |
| onDailyLimitUsdChange, | |
| onWeeklyLimitUsdChange, | |
| }: { | |
| enabled: boolean; | |
| dailyLimitUsd: string; | |
| weeklyLimitUsd: string; | |
| enabledLabel: string; | |
| disabledLabel: string; | |
| onEnabledChange: (enabled: boolean) => void; | |
| onDailyLimitUsdChange: (value: string) => void; | |
| onWeeklyLimitUsdChange: (value: string) => void; | |
| }) { | |
| return ( | |
| <div className="mt-1 rounded-lg border border-emerald-500/20 bg-emerald-500/5 p-3"> | |
| <div className="flex items-start justify-between gap-3"> | |
| <div className="flex flex-col gap-1"> | |
| <p className="text-sm font-medium text-text-main">USD usage quota</p> | |
| <p className="text-xs text-text-muted"> | |
| Blocks this key with a 400 API error after its local USD spend reaches the configured | |
| daily or weekly quota. | |
| </p> | |
| </div> | |
| <button | |
| type="button" | |
| role="switch" | |
| aria-checked={enabled} | |
| onClick={() => onEnabledChange(!enabled)} | |
| className={`inline-flex shrink-0 items-center gap-1.5 px-2.5 py-1.5 rounded-md text-xs font-semibold transition-colors ${ | |
| enabled | |
| ? "bg-emerald-500/15 text-emerald-700 dark:text-emerald-300 border border-emerald-500/30" | |
| : "bg-black/5 dark:bg-white/5 text-text-muted border border-border" | |
| }`} | |
| > | |
| <span className="material-symbols-outlined text-[14px]">paid</span> | |
| {enabled ? enabledLabel : disabledLabel} | |
| </button> | |
| </div> | |
| <div className="mt-3 grid grid-cols-2 gap-2"> | |
| <div> | |
| <label className="text-xs text-text-muted mb-1 block">Daily quota (USD)</label> | |
| <Input | |
| type="number" | |
| min={0} | |
| step="0.01" | |
| value={dailyLimitUsd} | |
| onChange={(event) => onDailyLimitUsdChange(event.target.value)} | |
| placeholder="0.00" | |
| /> | |
| </div> | |
| <div> | |
| <label className="text-xs text-text-muted mb-1 block">Weekly quota (USD)</label> | |
| <Input | |
| type="number" | |
| min={0} | |
| step="0.01" | |
| value={weeklyLimitUsd} | |
| onChange={(event) => onWeeklyLimitUsdChange(event.target.value)} | |
| placeholder="0.00" | |
| /> | |
| </div> | |
| </div> | |
| <p className="mt-2 text-[11px] text-text-muted"> | |
| Weekly quota follows the cached Claude weekly reset when available; otherwise it falls back | |
| to a rolling 7 day window. Daily quota uses the Fortaleza calendar day. | |
| </p> | |
| </div> | |
| ); | |
| } | |