"use client";
import { useCallback, useEffect, useState } from "react";
import { AI_PROVIDERS } from "@/shared/constants/providers";
import { Button, Card, CardSkeleton } from "@/shared/components";
import ProviderIcon from "@/shared/components/ProviderIcon";
import { formatResetTime, REFRESH_INTERVAL_MS } from "./ProviderLimits/utils";
import { formatVietnamTime } from "@/shared/utils/dateTime";
import { formatTokenCount } from "@/shared/utils/tokenCount.js";
import { USER_TOKEN_LIMIT_WINDOWS } from "open-sse/config/userTokenLimits.js";
function getProviderInfo(providerId) {
return AI_PROVIDERS[providerId] || {
name: providerId,
color: "#6b7280",
};
}
function formatUpdatedAt(value) {
if (!value) return "Not updated yet";
const formattedTime = formatVietnamTime(value, {
hour: "2-digit",
minute: "2-digit",
});
return formattedTime ? `Updated ${formattedTime}` : "Not updated yet";
}
function getQuotaTone(percentage) {
if (percentage > 70) {
return { bar: "bg-green-500", dot: "bg-green-500", text: "text-green-500" };
}
if (percentage >= 30) {
return { bar: "bg-yellow-500", dot: "bg-yellow-500", text: "text-yellow-500" };
}
return { bar: "bg-red-500", dot: "bg-red-500", text: "text-red-500" };
}
function TokenQuotaResetStatus({ quota }) {
const [now, setNow] = useState(() => new Date());
useEffect(() => {
if (!quota.resetAt) return undefined;
const intervalId = window.setInterval(() => setNow(new Date()), 60 * 1000);
return () => window.clearInterval(intervalId);
}, [quota.resetAt]);
const countdown = formatResetTime(quota.resetAt, now);
const isSession = quota.windowType === USER_TOKEN_LIMIT_WINDOWS.SESSION;
const text = countdown === "-"
? (isSession ? "Session begins with the next request" : "Reset time unavailable")
: (isSession ? `Next tokens restore in ${countdown}` : `Resets in ${countdown}`);
return (
{text}
);
}
function QuotaListRow({ quota }) {
const tone = getQuotaTone(quota.remainingPercentage);
return (
{quota.name}
{quota.remainingPercentage}%
);
}
function TokenQuotaListRow({ quota }) {
const isUnlimited = quota.isUnlimited === true;
const tone = isUnlimited ? null : getQuotaTone(quota.remainingPercentage);
return (
{quota.name}
{isUnlimited ? (
Unlimited
) : (
{quota.remainingPercentage}%
)}
{!isUnlimited && (
)}
);
}
function ProviderQuotaListItem({ provider }) {
const providerInfo = getProviderInfo(provider.provider);
const providerName = providerInfo.name || provider.provider;
const hasQuotaData = provider.quotas.length > 0;
const isPersonalTokenBudget = provider.quotaSource === "user-token-limit";
return (
{hasQuotaData ? (
{provider.quotas.map((quota) => (
quota.tokenBudget
?
:
))}
) : (
{provider.failedAccountCount > 0
? provider.errorMessage || "Quota data is temporarily unavailable for this provider."
: "This provider does not currently report quota data."}
)}
{provider.hasFailedQuotaChecks && hasQuotaData && (
Some quota checks could not be completed.
)}
);
}
function OverviewSkeleton() {
return (
{[1, 2, 3].map((key) => (
))}
);
}
export default function SystemQuotaOverview() {
const [data, setData] = useState(null);
const [error, setError] = useState(null);
const [loading, setLoading] = useState(true);
const [refreshing, setRefreshing] = useState(false);
const loadQuota = useCallback(async (forceRefresh = false) => {
if (forceRefresh) setRefreshing(true);
setError(null);
try {
const response = await fetch(
`/api/usage/system-quota${forceRefresh ? "?refresh=true" : ""}`,
{ cache: "no-store" },
);
const payload = await response.json().catch(() => ({}));
if (!response.ok) {
throw new Error(payload.error || "Failed to load system quota");
}
setData(payload);
} catch (loadError) {
setError(loadError.message || "Failed to load system quota");
} finally {
setLoading(false);
setRefreshing(false);
}
}, []);
useEffect(() => {
const initialLoadId = window.setTimeout(() => loadQuota(), 0);
const intervalId = window.setInterval(() => loadQuota(true), REFRESH_INTERVAL_MS);
return () => {
window.clearTimeout(initialLoadId);
window.clearInterval(intervalId);
};
}, [loadQuota]);
if (loading) return ;
if (error) {
return (
error
Unable to load system quota
{error}
loadQuota(true)}>
Try again
);
}
const providers = data?.providers || [];
return (
data_usage
System quota
Available provider capacity
{formatUpdatedAt(data?.updatedAt)}
loadQuota(true)}
>
Refresh
{providers.length === 0 ? (
cloud_off
No quota-capable providers connected
System quota will appear when an administrator connects a provider that supports usage tracking.
) : (
{providers.map((provider, index) => (
0 ? "border-t border-border-subtle" : ""}>
))}
)}
);
}