diff --git a/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js b/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js index 8fdd7f8e..28466782 100644 --- a/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +++ b/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js @@ -27,6 +27,8 @@ export default function ProviderLimits() { const [showEditModal, setShowEditModal] = useState(false); const [selectedConnection, setSelectedConnection] = useState(null); const [proxyPools, setProxyPools] = useState([]); + const [providerFilter, setProviderFilter] = useState("all"); + const [expiringFirst, setExpiringFirst] = useState(false); const intervalRef = useRef(null); const countdownRef = useRef(null); @@ -362,14 +364,32 @@ export default function ProviderLimits() { conn.authType === "oauth", ); - // Sort providers by USAGE_SUPPORTED_PROVIDERS order, then alphabetically - const sortedConnections = [...filteredConnections].sort((a, b) => { + const providerFilteredConnections = filteredConnections.filter( + (conn) => providerFilter === "all" || conn.provider === providerFilter, + ); + + const getEarliestResetTime = (conn) => { + const resetTimes = (quotaData[conn.id]?.quotas || []) + .map((quota) => quota.resetAt ? new Date(quota.resetAt).getTime() : Number.POSITIVE_INFINITY) + .filter((time) => Number.isFinite(time)); + return resetTimes.length > 0 ? Math.min(...resetTimes) : Number.POSITIVE_INFINITY; + }; + + // Sort providers by USAGE_SUPPORTED_PROVIDERS order, then alphabetically. + // Optionally surface accounts with quotas expiring soonest first. + const sortedConnections = [...providerFilteredConnections].sort((a, b) => { + if (expiringFirst) { + const expiryDiff = getEarliestResetTime(a) - getEarliestResetTime(b); + if (expiryDiff !== 0) return expiryDiff; + } const orderA = USAGE_SUPPORTED_PROVIDERS.indexOf(a.provider); const orderB = USAGE_SUPPORTED_PROVIDERS.indexOf(b.provider); if (orderA !== orderB) return orderA - orderB; return a.provider.localeCompare(b.provider); }); + const providerOptions = Array.from(new Set(filteredConnections.map((conn) => conn.provider))).sort(); + // Calculate summary stats const totalProviders = sortedConnections.length; const activeWithLimits = Object.values(quotaData).filter( @@ -422,6 +442,26 @@ export default function ProviderLimits() {
+ + {/* Auto-refresh toggle */}