import { useEffect, useMemo, useState } from "react"; import { collectHiddenQuotaModelIds, filterHiddenModelQuotas } from "./utils"; function getProviderKey(connections: any[]): string { const providers = new Set(); for (const conn of connections) { if (typeof conn?.provider === "string" && conn.provider) providers.add(conn.provider); } return Array.from(providers).sort().join("|"); } export function useVisibleQuotaData( connections: any[], quotaData: Record ): Record { const [hiddenModelsByProvider, setHiddenModelsByProvider] = useState>( {} ); const providerKey = useMemo(() => getProviderKey(connections), [connections]); useEffect(() => { if (!providerKey) return; let alive = true; const providers = providerKey.split("|").filter(Boolean); Promise.all( providers.map(async (provider) => { try { const response = await fetch( `/api/provider-models?provider=${encodeURIComponent(provider)}` ); if (!response.ok) return [provider, []] as const; const data = await response.json(); return [provider, collectHiddenQuotaModelIds(provider, data)] as const; } catch { return [provider, []] as const; } }) ).then((entries) => { if (alive) setHiddenModelsByProvider(Object.fromEntries(entries)); }); return () => { alive = false; }; }, [providerKey]); return useMemo(() => { const next: Record = {}; for (const conn of connections) { const data = quotaData[conn.id]; if (!data) continue; next[conn.id] = { ...data, quotas: filterHiddenModelQuotas( conn.provider, data.quotas, hiddenModelsByProvider[conn.provider] ), }; } return next; }, [connections, hiddenModelsByProvider, quotaData]); }